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. MySQL索引分析及使用

    一.索引介绍 1.1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此 ...

  2. RabbitMq 实现延时队列-Springboot版本

    rabbitmq本身没有实现延时队列,但是可以通过死信队列机制,自己实现延时队列: 原理:当队列中的消息超时成为死信后,会把消息死信重新发送到配置好的交换机中,然后分发到真实的消费队列: 步骤: 1. ...

  3. 关于保存批量数据进入mysql

    提出的要求: 生成13位纯数字的卡号与8位纯数字的卡密,要求卡号与卡密都必须全表唯一,然后保存到mysql. 思路: 1.首先mysql中将这两个字段设置唯一索引,保证这两个字段的值在该表中是唯一存在 ...

  4. 【T1543.003】利用 ACL 隐藏恶意 Windows 服务

    看到一篇文章讲述了通过设置 DACL 隐藏 Windows 服务信息,便做一下总结. 技术原理 系统中每个 Service 在 Windows 中属于都一种对象(Object),用户在访问对象时的权限 ...

  5. leetcode1Minimum Depth of Binary Tree

    题目描述 求给定二叉树的最小深度.最小深度是指树的根结点到最近叶子结点的最短路径上结点的数量. Given a binary tree, find its minimum depth.The mini ...

  6. 我叫Mongo,干了「查询终结篇」,值得您拥有

    这是mongo第三篇"查终结篇",后续会连续更新5篇 mongodb的文章总结上会有一系列的文章,顺序是先学会怎么用,在学会怎么用好,戒急戒躁,循序渐进,跟着我一起来探索交流. 通 ...

  7. Centos 7挂载本地ISO光盘

    在Linux系统上挂载系统镜像作为yum本地仓库或者安装某个常用RPM包. mount语法: mount -t 类型 -o 挂接方式 源路径 目标路径 -t 选项: iso9660:光盘或光盘镜像 m ...

  8. ISO/OSI参考模型

    ISO/OSI参考模型: 1.应用层:提供应用程序间通信.应用层与应用程序界面沟通,以达到展示给用户的目的.常见的协议:HTTP.HTTPS.FTP.TELNET.SSH.SMTP等 2.表示层:处理 ...

  9. 如何统计Ceph的RBD真实使用容量

    前言 ceph的rbd一直有个问题就是无法清楚的知道这个分配的空间里面到底使用了多少,这个在Jewel里面提供了一个新的接口去查询,对于老版本来说可能同样有这个需求,本篇将详细介绍如何解决这个问题 查 ...

  10. JLC PCB 嘉立创自动确认生产稿,不讲武德?耗子尾汁!!!

    首先,开局一张图,嘉立创又不做人的一天.嘉立创不讲武德,耗子尾汁!!! 之前下单,勾选了确定生产稿和不加客编,结果生产稿出来还是给我加了客编.那我出10元的意思何在?让我自己花3元看我花的10元有没有 ...