分享

Unity全局调用非静态函数

 小世界的野孩子 2022-09-19 发布于北京

情形

大概就是做游戏的时候想做一个给玩家展示信息的东西,比如玩家按了不该按的键提醒一下之类的。这个脚本倒是很简单,找个Text组件往上面加字就行了。问题在于这个脚本游戏中的很多其他脚本都需要引用。比如钱不够花了,管钱的脚本得提醒一句;用还没好的技能,管技能的脚本得提醒一句;游戏要是还有点剧情,管剧情的也得说几句。后面再写新的脚本,还要每个都加上对信息展示脚本的引用,这就很麻烦。

方法

刚开始是想使用静态(static)方法的,毕竟说到全局都能调用,第一个想到的就是静态函数、静态类。但是静态函数内部是不允许干非静态的事情的,比如,修改文字内容。直接过不了编译。

正解是写一个单例类。如果你跟我之前一样并没有深入学过C#并且根本不知道单例是个什么玩意,只需要知道两点就够了:第一,单例类在场景里只能有一个它的实例。第二,这个单例里面的public方法其他的类就都能在没有引用这个类的情况下用了。

写法就介绍一个最基本的,大部分时候都是好用的。

public class Logger : MonoBehaviour
{
    public static Logger logger;
    // ...
    
    private void Awake()
    {
        logger = this;
    }
    
    public void Test()
    {
        // something to do
    }
    //...
}

这里继承MonoBehaviour是没所谓的,主要是声明一个静态的实例,然后初始化为自己。

这样在其他类里就可以直接调用单例类中的public函数了:

public class Whatever
{
    public void DoSomething()
    {
        Logger.logger.Test();
    }
}

这里注意尽量别在其他类的Awake函数里调用单例,因为如果这时候单例的Awake还没有执行,他就还不是个单例,调用会报错的。

结语

只说了单例最基本的使用,因为高深的东西我不敢乱说。这些在基本的开发里已经够用了,可以实现想要的效果。如果你很不能理解这是个啥,可以大概把它想象成一个包着静态壳的动态类。你看,动态的类可以有很多个实例,静态类没有实例,只有一个实例的类可不是动静结合。

其实在游戏场景中,很多东西都适合做成单例类。比如管游戏音乐的脚本大概率在场景里只会有一个实例工作,那么就可以把他做成单例,如果有游戏对象需要改变游戏音乐,就可以直接调用。或者说如果是一个主角的单机游戏,甚至可以把主角做成单例类,这样比如有一群小怪都要来找主角打架,所有小怪都可以直接访问到主角的位置信息。

单例是C#里挺有意思的一个功能,如果你比较感兴趣或者经常使用这个,可以去深入学了解一下单例的原理,搞一本《深入理解C#》什么之类的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多