Unity中事件的3种实现方法

前言

假设有两个脚本A和脚本B,当A调用某一函数fn时,要发布事件,而监听A中事件的脚本B,要做出对应回应。对此有三种方法,
UnityEvent:有UI界面,不需要手动取消监听
event:物体被被摧毁时要手动取消监听或阻止函数继续运行
BroadcastMessage:方便于自身传递,但无法广播到被禁用的组件或被禁用物体上的

UnityEvent

UnityEvent持有对象的引用,当对象被销毁时就不会再调用对应函数了。类似于
if(obj != null) { obj.fn(…); }

//脚本A
using UnityEngine.Events;
public UnityEvent<...> attacked = new UnityEvent<...>();
public void fn() { attacked(...); }

在这里插入图片描述

event

//... 表示参数或参数类型,如Action,Action<GameObject>,Action<GameObject,int>等
//这里假设都挂有A组件,一般情况下需要判空
//脚本A
public event System.Action<...> attacked;
public void fn() { attacked(...); }

//脚本B
void Start(){
	GetComponent<A>().attacked += OnAttacked;
	otherObj.GetComponent<A>().attacked += OnAttacked;
}
void OnAttacked(...) {
	//do something
	print(gameObject.name);
}
void OnDestroyed(){
	//监听听自身的可忽略,除非有调用Object.Destroy(GetComponent(B)())
	//GetComponent<A>().attacked-= OnAttacked;
	  
	//监听其他物体的不可忽略,因为当B组件被销毁时,
	//其他物体上的A组件还会调用B中的函数,所以要取消
	otherObj.GetComponent<A>().attacked-= OnAttacked;
}

BroadcastMessage

BroadcastMessage向自身及子物体上所以“非禁用”脚本广播。
当物体被禁用(gameObject.SetActive(false))时,
其身上所以脚本和子物体上所以脚本都相当于“禁用”,就无法接受到广播。

public void BroadcastMessage(string methodName, 
object parameter = null,   
SendMessageOptions options = SendMessageOptions.RequireReceiver);

最后一个参数默认是有要求接收,如果没用接收就会报错。
如果不希望报错可以改为,SendMessageOptions.DontRequireReceiver

切换场景时static的注意事项

当切换场景时,没用调用过DontDestroyOnLoad()的GameObject及其脚本会被销毁,但是那些脚本上的static变量并不会消失。如:

//脚本A
static int v1;  //不变
static float v1;  //不变
static GameObject obj;  //obj被销毁,在使用前要判空  if(obj!=null) 或 if(obj)
static event System.Action action;  //保存的事件还在,可以用 action=null 来清空监听
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UnityGameFramework案例源码,包括: 主要对游戏开发过程常用模块进行了封装,很大程度地规范开发过程、加快开发速度并保证产品质量,是一个重度化的Unity游戏框架。 在最新的 Game Framework 版本,包含以下 17 个内置模块,后续还将开发更多的扩展模块供开发者使用。 数据结点 (Data Node) – 将任意类型的数据以树状结构的形式进行保存,用于管理游戏运行时的各数据。 数据表 (Data Table) – 可以将游戏数据以表格(如 Microsoft Excel)的形式进行配置后,使用此模块使用这些数据表。数据表的格式是可以自定义的。 调试器 (Debugger) – 当游戏在 Unity 编辑器运行或者以 Development 方式发布运行时,将出现调试器窗口,便于查看运行时日志、调试信息等。用户还可以方便地将自己的功能注册到调试器窗口上并使用。 下载 (Download) – 提供下载文件的功能,支持断点续传,并可指定允许几个下载器进行同时下载。更新资源时会主动调用此模块。 实体 (Entity) – 我们将游戏场景,动态创建的一切物体定义为实体。此模块提供管理实体和实体组的功能,如显示隐藏实体、挂接实体(如挂接武器、坐骑,或者抓起另一个实体)等。实体使用结束后可以不立刻销毁,从而等待下一次重新使用。 事件 (Event) – 游戏逻辑监听、抛出事件的机制。Game Framework 的很多模块在完成操作后都会抛出内置事件,监听这些事件将大大解除游戏逻辑之间的耦合。用户也可以定义自己的游戏逻辑事件。 有限状态机 (FSM) – 提供创建、使用和销毁有限状态机的功能,一些适用于有限状态机机制的游戏逻辑,使用此模块将是一个不错的选择。 本地化 (Localization) – 提供本地化功能,也就是我们平时所说的多语言。Game Framework 在本地化方面,不但支持文本的本地化,还支持任意资源的本地化,比如游戏释放烟花特效也可以做出几个多国语言的版本,使得文版里是“新年好”字样的特效,而英文版里是“Happy New Year”字样的特效。 网络 (Network) – 提供使用 Socket 长连接的功能,当前我们支持 TCP 协议,同时兼容 IPv4 和 IPv6 两个版本。用户可以同时建立多个连接与多个服务器同时进行通信,比如除了连接常规的游戏服务器,还可以连接语音聊天服务器。如果想接入 ProtoBuf 之类的协议库,只要派生自 Packet 类并实现自己的消息包类即可使用。 对象池 (Object Pool) – 提供对象缓存池的功能,避免频繁地创建和销毁各游戏对象,提高游戏性能。除了 Game Framework 自身使用了对象池,用户还可以很方便地创建和管理自己的对象池。 流程 (Procedure) – 是贯穿游戏运行时整个生命周期的有限状态机。通过流程,将不同的游戏状态进行解耦将是一个非常好的习惯。对于网络游戏,你可能需要如检查资源流程、更新资源流程、检查服务器列表流程、选择服务器流程、登录服务器流程、创建角色流程等流程,而对于单机游戏,你可能需要在游戏选择菜单流程和游戏实际玩法流程之间做切换。如果想增加流程,只要派生自 ProcedureBase 类并实现自己的流程类即可使用。 资源 (Resource) – 为了保证玩家的体验,我们不推荐再使用同步的方式加载资源,由于 Game Framework 自身使用了一套完整的异步加载资源体系,因此只提供了异步加载资源的接口。不论简单的数据表、本地化字典,还是复杂的实体、场景、界面,我们都将使用异步加载。同时,Game Framework 提供了默认的内存管理策略(当然,你也可以定义自己的内存管理策略)。多数情况下,在使用 GameObject 的过程,你甚至可以不需要自行进行 Instantiate 或者是 Destroy 操作。 场景 (Scene) – 提供场景管理的功能,可以同时加载多个场景,也可以随时卸载任何一个场景,从而很容易地实现场景的分部加载。 配置 (Setting) – 以键值对的形式存储玩家数据,对 UnityEngine.PlayerPrefs 进行封装。 声音 (Sound) – 提供管理声音和声音组的功能,用户可以自定义一个声音的音量、是2D声音还是3D声音,甚至是直接绑定到某个实体上跟随实体移动。 界面 (UI) – 提供管理界面和界面组的功能,如显示隐藏界面、激活界面、改变界面层级等。不论是 Unity 内置的 uGUI 还是其它类型的 UI 插件(如 NGUI),只要派生自 UIFormLogic 类并实现自己的界面类即可使用。界面使用结束后可以不立刻销毁,从而等
目前最火、最具发展前景的专业游戏引擎 Unity 3D是什么?Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎Unity3D的PC插件安装量达到2 亿 Unity全球注册用户已经达到200万,每月 Unity编辑器活跃开发者数量达到40万, Unity的PC插件安装量达到2亿! 未来游戏市场普遍呈现3D化 以手游市场为例,3D游戏占比达到80%,虽然现在还有不少2D游戏,但随着终端设备性能的提升和客户的需求增加,游戏市场最终会进入全面的3D化时代。Unity3D课程可以使你直接进入3D游戏开发领域,成为就业市场的宠儿。同时Unity3D也推出了开发2D游戏的插件,可以使我们从现在到未来都立于不败之地。 Unity 3D为什么这么火? ---真正的跨平台目前各个平台的游戏开发几乎没有通用性,开发iPhone上的游戏需要学习Objective C,开发Android上的游戏大多用Java,开发Windows Phone上的游戏用C#,……。如何只学习一语言就能够开发出跨越多个平台的游戏呢?Unity3D使用底层Mono技术实现了真正的跨平台,而Mono是基于.NET框架开发的。他使我们使用一语言就可以开发出基于各平台的游戏,包括手机游戏(iPhone、Android、Windows Phone)、PC(Windows、Mac、Linux)、网页游戏(基于各主流浏览器)、游戏机专用游戏(Wii、Xbox360、PS3) 现在Unity 3D的攻城狮的月薪基本上都在15000元以上,这是基础班,以后我再发精英班,学完后希望大家都可以找到年薪20万的工作。 这套是比较完整的课程,并且有实例课程,并且附带源码 并非其他只有基础的课程,没有实例! C#语言基础课程课时目录: 课时1 C#基础概述 课时2 创建一个C#文件 课时3 编译运行和控制台 课时4 创建你的第一个应用程序 课时5 变量 课时6 表达式 课时7 枚举 课时8 条件判断语句 课时9 for循环语句 课时10 while循环语句 课时11 函数 课时12 事件 课时13 C#进阶 课时14 类的概念 课时15 继承 课时16 MonoBehaviour 课时17 方法重写Overriding 课时18 方法重载Overloading 课时19 代理Delegates 课时20 单例设计模式Singletons 基础入门之进入Unity的世界 课时1 Unity介绍 课时2 Unity下载和安装 课时3 Unity 破解 课时4 Unity 什么是工程 课时5 Unity 学习过程介绍 课时6 Unity的五视图 课时7 Unity的资源 课时8 Unity的游戏物体 课时9 Unity的组件Component 课时10 Unity的场景Scene 课时11 场景控制工具的使用 课时12 Unity的本地坐标和世界坐标系 课时13 场景视图的操作 课时14 向量 课时15 小结 基础入门之Roll-a-Ball滚动小球 课时1 Roll-A-Ball游戏介绍 课时2 了解基本集合体 课时3 创建游戏环境 课时4 给世界添加光 课时5 学习相机Camera 课时6 创建游戏主角 课时7 Unity的刚体和碰撞器 课时8 Unity的脚本编写 课时9 控制主角的移动 课时10 控制相机跟随 课时11 Transform组件 课时12 创建游戏的食物 课时13 认识Prefab,完善场景的食物 课时14 认识触发器 课时15 添加捡起食物功能 课时16 日志输出和错误调试 unity经典入门课程之C#基础实例讲解(打砖块实例) 课时1 开发工具Visual Studio Tools For Unity安装和介绍 课时2 项目效果预览,创建项目和第一个C#脚本 课时3 脚本挂载,控制台使用,变量声明和赋值,在舞台添加多个对象,使用脚本初始化对象 课时4 实例化方法高级应用,使用for循环语句创建多个砖块 课时5 课下作业-添加多行砖块 课时6 组件机制,刚体介绍,类型转换,函数返回值,发射小球功能实现 课时7 条件判断语句,鼠标按下事件处理,获取水平和垂直改变数值,改变对象位置,自动销毁对象 课时8 课程小结

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值