Unity全局调用非静态函数
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全局调用非静态函数的更多相关文章
- java程序员图文并茂细说Unity中调用Android的接口
http://bbs.csdn.net/topics/391876421 最近做一个项目,为同事提供接口,能使他在Unity中调用Android中的函数来实现QQ登陆并获取用户信息.按照一些书上和一些 ...
- 从C#程序中调用非受管DLLs
从C#程序中调用非受管DLLs 文章概要: 众所周知,.NET已经渐渐成为一种技术时尚,那么C#很自然也成为一种编程时尚.如何利用浩如烟海的Win32 API以及以前所编写的 Win32 代码已经成为 ...
- java中静态方法中为什么不能使用this、super和直接调用非静态方法
这个要从java的内存机制去分析,首先当你New 一个对象的时候,并不是先在堆中为对象开辟内存空间,而是先将类中的静态方法(带有static修饰的静态函数)的代码加载到一个叫做方法区的地方,然后再在堆 ...
- 关于C#调用非托管动态库方式的性能疑问
最近的项目中,因为一些原因,需要C#调用非托管(这里为C++)的动态库.网上喜闻乐见的方式是采用静态(DllImport)方式进行调用.偶然在园子里看到可以用动态(LoadLibrary,GetPro ...
- PHP中静态(static)调用非静态方法详解
1.PHP中可以静态调用非静态方法么? 今天我被问到PHP中可不可以使用 className::methodName() 的方法来调用一个没有声明static的方法.在我的印象中,我好像是见过这种用法 ...
- (转)C#调用非托管Win 32 DLL
转载学习收藏,原文地址http://www.cnblogs.com/mywebname/articles/2291876.html 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使 ...
- C++静态成员函数不能调用非静态成员变量
其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为无论是静态成员函数还是静态成员变量,它们 都是在类的范畴之类的,及在类的整个生存周期里始终只能存在一份.然而非静态成员变量和非 ...
- 在VS2010上使用C#调用非托管C++生成的DLL文件
背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用.本篇文章将引导你快速理解这个调用 ...
- 客户全局信用控制&非全局信用控制
看个简单的例子 客户信用限额 非全局信用控制 非全局信用控制比较简单,我们看一下全局信用控制 设置: 实现结果:全局&非全局对比
随机推荐
- 【QT】 QThread部分源码浅析
本文章挑出QThread源码中部分重点代码来说明QThread启动到结束的过程是怎么调度的.其次因为到了Qt4.4版本,Qt的多线程就有所变化,所以本章会以Qt4.0.1和Qt5.6.2版本的源码来进 ...
- Unity报错:xxx AnimationEvent has no function name specified!
参考:https://blog.csdn.net/register_man/article/details/54172778 在开发时出现了题目中的错误且有动画掉帧的情况,搜索后发现是在动画编辑器中我 ...
- windows编译openssl(64位)一游
编译openssl,一套标准流程: (环境: win10 64位os, vs2019) 需要的工具:perl nasm openssl源码包 1 安装perl 2 下载nasm,将n ...
- 使用 Xunit.DependencyInjection 改造测试项目
使用 Xunit.DependencyInjection 改造测试项目 Intro 这篇文章拖了很长时间没写,之前也有介绍过 Xunit.DependencyInjection 这个项目,这个项目是由 ...
- c#中简单工厂模式
运算类 public class yunsuan { public static operation create(string operate) { operation oper = null; s ...
- Linux系统下用户如何膝盖FTP用户密码
其实修改ftp用户密码与修改普通用户的密码的过程是一眼高的其具体步骤如下 1.用root账户登录系统 2.使用passwd命令修改密码: 第一次输入密码后提示:The password fails t ...
- Python _PyQt5 【总】
http://www.cnblogs.com/archisama/p/5442071.html QtCore QtGui QtWidgets QtMultimedia QtBluetooth QtNe ...
- SQL Server将查询出数据进行列转行操作
在日常的SQL Server数据查询时经常会遇到需要将数据列转换成行的操作,现将自己学习的列转行SQL语句举例如下: --首先查询语句 SELCT * FROM YXBAK..TBYJKSTEMP ...
- Dnscat2实现DNS隐蔽隧道反弹Shell
DNS介绍 DNS是域名系统(Domain Name System)的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被 ...
- CSRF和XSS的区别
XSS是啥? xss就是跨域脚本攻击 什么是跨域脚本攻击? 就是在正常的输入框中(如:用户名修改等)插入script恶意代码,从而在你遍历数据的时候加载该js文件, 获取你的cookie或sessio ...