user2264784 user2264784 - 1 month ago 23
C# Question

Unity extend SceneManager class

I try extend SceneManager class.

I write like here: 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");
}
}


But when I try to use this new method:

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

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


It doesn't work.

Answer

Yes, you can. Although, you will need to explicitly create instance of SceneManager class before you can use that new function(LoadSceneWithSave). An extension method requires an instance of the class to work.

This should work:

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

How does the transform example you linked work without an instance?

It does have an instance. The reason why you need to create an instance of it and can't directly use it like you can with the Transform class:

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

...

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

is because SceneManager is not declared in MonoBehaviour or any base class of MonoBehaviour. There is an instance of Transform class named transform that is declared in the Component class which Behaviour inherits from which MonoBehaviour inherits from.

Here is exactly what it looks like:

public class Object
{

}

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

public class Behaviour : Component
{

}

public class MonoBehaviour : Behaviour
{

}

Finally, this is why you can use the transform variable to access its extension method like:

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

because it was already declared and you inherited it from MonoBehaviour .

As you can see, SceneManager is not declared any where in the MonoBehaviour class or it's base classes and you need an instance of it to access any of its extension function.