Unity全局调用非静态函数

情形

大概就是做游戏的时候想做一个给玩家展示信息的东西,比如玩家按了不该按的键提醒一下之类的。这个脚本倒是很简单,找个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#》什么之类的。

Unity全局调用非静态函数的更多相关文章

  1. java程序员图文并茂细说Unity中调用Android的接口

    http://bbs.csdn.net/topics/391876421 最近做一个项目,为同事提供接口,能使他在Unity中调用Android中的函数来实现QQ登陆并获取用户信息.按照一些书上和一些 ...

  2. 从C#程序中调用非受管DLLs

    从C#程序中调用非受管DLLs 文章概要: 众所周知,.NET已经渐渐成为一种技术时尚,那么C#很自然也成为一种编程时尚.如何利用浩如烟海的Win32 API以及以前所编写的 Win32 代码已经成为 ...

  3. java中静态方法中为什么不能使用this、super和直接调用非静态方法

    这个要从java的内存机制去分析,首先当你New 一个对象的时候,并不是先在堆中为对象开辟内存空间,而是先将类中的静态方法(带有static修饰的静态函数)的代码加载到一个叫做方法区的地方,然后再在堆 ...

  4. 关于C#调用非托管动态库方式的性能疑问

    最近的项目中,因为一些原因,需要C#调用非托管(这里为C++)的动态库.网上喜闻乐见的方式是采用静态(DllImport)方式进行调用.偶然在园子里看到可以用动态(LoadLibrary,GetPro ...

  5. PHP中静态(static)调用非静态方法详解

    1.PHP中可以静态调用非静态方法么? 今天我被问到PHP中可不可以使用 className::methodName() 的方法来调用一个没有声明static的方法.在我的印象中,我好像是见过这种用法 ...

  6. (转)C#调用非托管Win 32 DLL

    转载学习收藏,原文地址http://www.cnblogs.com/mywebname/articles/2291876.html 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使 ...

  7. C++静态成员函数不能调用非静态成员变量

    其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为无论是静态成员函数还是静态成员变量,它们 都是在类的范畴之类的,及在类的整个生存周期里始终只能存在一份.然而非静态成员变量和非 ...

  8. 在VS2010上使用C#调用非托管C++生成的DLL文件

    背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用.本篇文章将引导你快速理解这个调用 ...

  9. 客户全局信用控制&非全局信用控制

    看个简单的例子 客户信用限额 非全局信用控制 非全局信用控制比较简单,我们看一下全局信用控制 设置: 实现结果:全局&非全局对比

随机推荐

  1. 使用Haproxy代理rabbitmq集群,用keepalive保证haproxy高可用

    原文地址:https://www.jianshu.com/p/440b8e1d5339 使用Haproxy代理rabbitmq集群 上一篇文章教了rabbitmq集群搭建.但是这样搭建出来的集群是3个 ...

  2. VS中Dev控件在工具箱里的不见的解决办法

    出现问题:调整了VS中Dev控件后(以免生成程序每次都要在客户机上面注册dev),之前安装的DEV控件在vs工具箱中消失了,重装可以解决,但是太费时间了,检测dev自带的设置,找到了解决办法. 解决办 ...

  3. yum源备份并安装扩展仓库

    yum源相关 默认的YUM源 1.备份默认的YUM源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.ba ...

  4. 【Java】线程的 6 种状态

    一.线程状态的枚举 Java的线程从创建到销毁总共有6种状态.这些状态被定义在Thread类种的内部枚举 State 中,分别如下: 1.NEW:初始状态. 线程实例已创建,但未启动. // 实例创建 ...

  5. 源码分析:同步基础框架——AbstractQueuedSynchronizer(AQS)

    简介 AQS 全称是 AbstractQueuedSynchronizer,位于java.util.concurrent.locks 包下面,AQS 提供了一个基于FIFO的队列和维护了一个状态sta ...

  6. MySQL视图详细介绍

    前言: 在MySQL中,视图可能是我们最常用的数据库对象之一了.那么你知道视图和表的区别吗?你知道创建及使用视图要注意哪些点吗?可能很多人对视图只是一知半解,想详细了解视图的同学看过来哟,本篇文章会详 ...

  7. intelx86为何从0xFFFF0处执行

    第一条指令的地址 在用户按下计算机电源开关之后,CPU会自动的将其CS寄存器设定为0xFFFF,将其IP寄存器设定为0x0000.由于CS:IP指出了下一条指令的地址[1],因此CPU会跳到0xFFF ...

  8. 用GitHub Pages搭建博客(五)

    本篇介绍GitHub Pages自定义域名 在用GitHub Pages搭建博客(二)中介绍到,默认的GitHub Pages域名就是仓库地址,即: 账号名.github.io 如果我们要使用自定义域 ...

  9. 腾讯云容器服务 TKE 推出新一代零损耗容器网络

    随着容器技术的发展成熟,越来越多的组件迁移到容器,在技术迁移过程中,数据库,游戏,AI 这些组件对容器网络性能(时延,吞吐,稳定性)提出了更高的要求.为了得到更优的时延和吞吐表现,各大云厂商都在致力于 ...

  10. iscsi客户端常用操作

    说明 本篇主要记录iscsi的客户端的一些常用的一些操作 iscsi服务端常用操作 删除一个lun tgtadm --lld iscsi --mode logicalunit --op delete ...