2016-10-23 16 views
1

私はSceneManagerクラスを拡張しようとしています。ユニティ拡張SceneManagerクラス

は、私はここのように書く:https://unity3d.com/ru/learn/tutorials/topics/scripting/extension-methods

using UnityEngine; 
using System.Collections; 
using UnityEngine.SceneManagement; 

public static class ExtensionMethods 
{ 
    public static void LoadSceneWithSave(this SceneManager SceneManager) { 
     Debug.Log("Debug LoadSceneWithSave"); 
    } 
} 

をしかし、私は、この新しいメソッドを使用しようとすると:

using UnityEngine; 
using System.Collections; 
using UnityEngine.SceneManagement; 

public class SomeClass : MonoBehaviour 
{ 
    void Start() { 
     SceneManager.LoadSceneWithSave(); 
    } 
} 

それは動作しません。

+0

[既存の静的クラスに拡張メソッドを追加できますか?](http://stackoverflow.com/questions/249222/can-i-add-extension-methods-to-an-existing-static-クラス) –

答えて

1

はいです。ただし、その新しい関数(LoadSceneWithSave)を使用する前に、SceneManagerクラスのインスタンスを明示的に作成する必要があります。拡張メソッドでは、クラスのインスタンスが動作する必要があります。

これは動作するはずです:

SceneManager mySeneManager = new SceneManager(); 
mySeneManager.LoadSceneWithSave(); 

どのようにインスタンスなしtransformたとえば、あなたlinked仕事?

インスタンスはです。あなたはそれのインスタンスを作成する必要があり、あなたができるように直接Transformクラスでそれを使用することはできません理由:SceneManagerではないので

public static class ExtensionMethods 
{ 
    public static void ResetTransformation(this Transform trans) 
    { 
    } 
} 

...

public class SomeClass : MonoBehaviour 
{ 
    void Start() { 
     transform.ResetTransformation(); 
    } 
} 

ですMonoBehaviourまたは任意の基本クラスMonoBehaviourで宣言されています。 Transformクラスのインスタンスがtransformであり、Componentクラスで宣言されており、Behaviourから継承し、MonoBehaviourが継承します。ここで

それはのように見える、まさにです:

public class Object 
{ 

} 

public class Component : Object 
{ 
    public Transform transform { get; } //This is declared 
    //...Other variables 
} 

public class Behaviour : Component 
{ 

} 

public class MonoBehaviour : Behaviour 
{ 

} 

あなたのようなその拡張メソッドにアクセスするためにtransform変数を使用することができ、なぜ最後に、これがある:それはすでにあったので

public class SomeClass : MonoBehaviour 
{ 
    void Start() { 
     transform.ResetTransformation(); 
    } 
} 

あなたはMonoBehaviourから継承しました。

ご覧のとおり、SceneManagerMonoBehaviourクラスまたはその基本クラスのどこにも宣言されておらず、そのインスタンスの拡張機能にアクセスする必要があります。