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特性进行方法调用.本篇文章将引导你快速理解这个调用 ...
- 客户全局信用控制&非全局信用控制
看个简单的例子 客户信用限额 非全局信用控制 非全局信用控制比较简单,我们看一下全局信用控制 设置: 实现结果:全局&非全局对比
随机推荐
- MySQL各版本connector net msi
从其他博主那里扒来的! 链接:https://pan.baidu.com/s/1C1fYepBFKfxU0NJS0aRyJw 提取码:awsl
- 【USACO】New Years Party
题意描述 New Years Party \(N(3\leq N\leq 200)\) 头奶牛举办新年聚会.每头奶牛会做几种不同的佳肴(以"碟"记数). 一共有 \(D(5\leq ...
- ElasticSearch7.3破解
破解ES7.3.0到白金版(学习交流使用) 正常安装ELK7.3版本到服务器上 正常部署ELK7到服务器上,先不要启动.然后开始进行破解操作 进行破解操作 需要破解的文件:modules/x-pack ...
- 微信小程序开发实战(云开发)--资产管理工具
添加首页 menu页面 截图展示 menu.js源码 // pages/menu/menu.js Page({ /** * 页面的初始数据 */ data: { }, /** * 生命周期函数--监听 ...
- 获取url后面的参数
function getQueryVariable(variable) { var query = window.location.search.substring(1); var vars = qu ...
- 基于gin的golang web开发:mysql增删改查
Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动.标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx. go get git ...
- 09线程隔离的g对象
1,g是global的意思. g对象再一次请求中的所有的代码的地方,都是可以使用的. 同一次请求,那么在这个项目的所有地方都可以用了. from flask import Flask,request, ...
- Spring3的IOC的annotation学习笔记
以下记录了一个小小的Spring3的annotation的应用笔记. 文件列表: UserService-interface UserDao-interface UserServiceImpl-Use ...
- 【linux】led子系统
目录 前言 linux子系统 led子系统 led子系统实战-系统调用-ARM平台 前言 接下来记录的是 led子系统 目前不涉及驱动源码 linux子系统 在 Linux 系统中 绝大多数硬件设备都 ...
- 《.NET 5.0 背锅案》第3集-剧情反转:EnyimMemcachedCore 无罪,.NET 5.0 继续背锅
今天晚上基于第2集中改进版的 EnyimMemcachedCore 进行了发布,发布过程中故障重现,最大的嫌犯 EnyimMemcachedCore 被证明无罪,暂时委屈 .NET 5.0 继续背锅. ...