Bootstrap

Unity如何在一个脚本中获取另一个脚本中的函数

#Unity学习笔记#

目前我想到的主要有四种方法,欢迎大家帮我补充!

一、单例模式

单例模式(Singleton Pattern)是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在游戏开发中,单例模式常用于管理游戏状态、配置数据、资源加载等。

代码示例:

将Test1类通过 3-14 行这种方式设为单例模式(方法不唯一):

public class Test1 : MonoBehaviour
{
    private static Test1 instance;
    public static Test1 Instance
    {
        get
        {
            if (instance == null)
            {
                instance = FindObjectOfType<Test1>();
            }
            return instance;
        }
    }

    public void PrintHHH()
	{
        Debug.Log("哈哈哈");
	}

}

就可以在其他类中通过这种方式调用Test1类中的 PrintHHH() 啦:

public class Test2 : MonoBehaviour
{
	private void Start()
	{
        Test1.Instance.PrintHHH();
	}
}

二、静态函数

静态函数是与类关联的,而不是与类的对象实例关联的。这意味着你可以直接通过类名调用静态函数,而不需要创建类的实例。静态函数在Unity开发中非常有用,尤其是在处理不依赖于对象状态的工具类方法时。

代码示例:

在Test3类中,将PrintHHH()函数定义为了静态函数:

public class Test3 : MonoBehaviour
{
    public static void PrintHHH()
    {
        Debug.Log("哈哈哈");
    }
}

这样在其他脚本中就可以方便的通过类名直接调用这个函数了:

public class Test2 : MonoBehaviour
{
	private void Start()
	{
        Test3.PrintHHH();
	}
}

三、获取游戏对象下面所挂载的脚本组件

Unity可以像获取目标游戏对象的位置信息的方式来获取该游戏对象下的目标脚本,不过需要使用GetComponent<>()方法。

代码示例:

将目标脚本挂载到目标游戏对象下:

public class Test4 : MonoBehaviour
{
    public void PrintHHH()
    {
        Debug.Log("哈哈哈");
    }
}

通过目标游戏对象来获取该脚本中的函数:

public class Test2 : MonoBehaviour
{
    public GameObject m_target;// 挂载了目标脚本的对象,也可以是Transform

    private void Start()
	{
        m_target.GetComponent<Test4>().PrintHHH();
	}
}

四、直接通过Inspector面板获取目标脚本

最直接的方法啦,直接在当前脚本中创建一个目标脚本的引用,然后将当前脚本挂载到一个游戏对象中,再通过Inspector面板将目标脚本所在的游戏对象拖过来,这样由于类型的原因我们就可以直接得到目标脚本的引用啦。

代码示例:

目标脚本同上Test4,挂在一个游戏对象上:

public class Test4 : MonoBehaviour
{
    public void PrintHHH()
    {
        Debug.Log("哈哈哈");
    }
}

在当前脚本中创建一个Test4类型的变量,也挂载到一个游戏对象上,这样就可以通过Inspector面板将目标脚本拖过来啦:

public class Test2 : MonoBehaviour
{
    public Test4 test4;

    //如果希望将test4设为私有可以这样:
    /*
    [SerializeField]
    private Test4 test4;
    */

    private void Start()
	{
        test4.PrintHHH();
	}
}

完结

目前我所常用的几种情况就这样啦!这四种如果细分的话还可以再详细一点,但我觉得没什么必要了,因为本质都是一样的,欢迎大家帮我补充!

注意

想要在类外访问这个类的函数或是变量,可要记得将它设为public的公有类型哦,如果不加保护类型修饰符C#会默认当作私有的private类型哦。

;