C#事件和Unity3d
来源:互联网 发布:沙特阿拉伯流沙河 知乎 编辑:程序博客网 时间:2024/05/26 02:55
原文地址
你是否知道C#有一个内置的事件系统?而且是一个非常好的事件系统!它与Unity3D配合起来非常有用.本篇文章提供一个例子.
为了响应由GameObject派发的事件通常你会创建一个继承自MonoBehaviour的脚本并实现你需要的方法.所以如果你想要对用户鼠标悬停在对象上做出反应你将会创建OnMouseOver方法.通常来讲其看起来如下:
- void OnMouseOver()
- {
- renderer.material.Color = Color.red;
- }
- public MyScript myScript;
- void onMouseOver()
- {
- myScript.NotifyMouseOver();
- }
- using UnityEngine;
- public class EventDispatcher : MonoBehaviour
- {
- public delegate void EventHandler(GameObject e);
- public event EventHandler MouseOver;
- void OnMouseOver()
- {
- if(MouseOver != null)
- {
- MouseOver(this.gameObject);
- }
- }
- }
- private GameObject s;
- [...]
- s.GetComponent().MouseOver += Listener;
- [...]
- void Listener(GameObject g)
- {
- // g is being hovered, do something…
- }
这种方法比使用message灵活的多,因为其对于任意脚本都有效而不只是在同一变换层级的才有效.如果你保持一个控制游戏状态的单例对象,你能够侦听来自其内部GameObject的任意事件.当然不只是GameObject才能发送事件----任何对象都可以.这种设置的最后一个结果就是同样的侦听函数能够用于响应来自不同对象的事件.通过传递一个引用来作为参数你总能知道是谁派发了事件----这就是我在例子里所做的.在上面的第一种情况中,引用,控制器和MVC你需要在发送事件的对象中保持一个侦听器的索引,而且我说了这不是一个好办法.在使用内置事件的版本中其所需恰恰相反----你需要一个要侦听事件的对象里面发送事件的对象的索引( you need a reference to the object that sends the event in the object that listens to it).你可能会问这样做为什么好些?首先,在这里发送者不需要知道谁在侦听其发送的事件甚至不需要知道有多少个侦听器.它所做的就是发送事件并忘掉它.在上面讨论的第一种情况中,想象一下要告诉事件派发者停止通知侦听器该有多麻烦!使用事件系统,侦听器负责决定它侦听什么事件,什么时候开始以及结束侦听.这种对象通常管理着应用程序的状态或者执行一些游戏逻辑.借用MVC设计模式中的术语----它是控制器.这就是为什么让它负责这个很合理.那么使用事件产生出更稳固的代码.最后我喜欢重载的操作符+=来用于添加侦听器,它是如此简洁.你可能已经猜到了,当你完成了事件侦听你可以说:
- s.GetComponent().MouseOver -= Listener;
- using UnityEngine;
- using System.Collections;
- /**
- * A simple event dispatcher - allows to listen to events in one GameObject from another GameObject
- *
- * Author: Bartek Drozdz (bartek [at] everyday3d [dot] com)
- *
- * Usage:
- * Add this script to the object that is supposed to dispatch events.
- * In another objects follow this pattern to register as listener at intercept events:
- void Start () {
- EventDispatcher ev = GameObject.Find("someObject").GetComponent<EventDispatcher>();
- ev.MouseDown += ListeningFunction; // Register the listener (and experience the beauty of overloaded operators!)
- }
- void ListeningFunction (GameObject e) {
- e.transform.Rotate(20, 0, 0); // 'e' is the game object that dispatched the event
- e.GetComponent<EventDispatcher>().MouseDown -= ListeningFunction; // Remove the listener
- }
- * This class does not implement all standards events, nor does it allow dispatching custom events,
- * but you shold have no problem adding all the other methods.
- */
- public class EventDispatcher : MonoBehaviour
- {
- public delegate void EventHandler (GameObject e);
- public delegate void CollisionHandler (GameObject e, Collision c);
- public event EventHandler MouseOver;
- void OnMouseOver ()
- {
- if (MouseOver != null)
- MouseOver (this.gameObject);
- }
- public event EventHandler MouseDown;
- void OnMouseDown ()
- {
- if (MouseDown != null)
- MouseDown (this.gameObject);
- }
- public event EventHandler MouseEnter;
- void OnMouseEnter ()
- {
- if (MouseEnter != null)
- MouseEnter (this.gameObject);
- }
- public event EventHandler MouseExit;
- void OnMouseExit ()
- {
- if (MouseExit != null)
- MouseExit (this.gameObject);
- }
- public event EventHandler BecameVisible;
- void OnBecameVisible ()
- {
- if (BecameVisible != null)
- BecameVisible (this.gameObject);
- }
- public event EventHandler BecameInvisible;
- void OnBecameInvisible ()
- {
- if (BecameInvisible != null)
- BecameInvisible (this.gameObject);
- }
- public event CollisionHandler CollisionEnter;
- void OnCollisionEnter (Collision c)
- {
- if (CollisionEnter != null)
- CollisionEnter (this.gameObject, c);
- }
- public event CollisionHandler CollisionExit;
- void OnCollisionExit (Collision c)
- {
- if (CollisionExit != null)
- CollisionExit (this.gameObject, c);
- }
- }
通过查看代码,我确信你可以搞明白如何添加别的事件.然而,谨防使用那种方式实现OnGUI(如果你想知道为什么,读下这篇文章).
文章转载自C#事件和Unity3d,感谢aisajiajiao提供好文章
- C# 事件和Unity3D
- C#事件和Unity3D
- C# 事件和Unity3D
- C# 事件和Unity3D
- C# 事件和Unity3D
- C# 事件和Unity3D
- C# 事件和Unity3D
- C# 事件和Unity3D
- C# 事件和Unity3D
- C# 事件和Unity3D
- C#事件和Unity3d
- C# 事件和Unity3D
- C# 事件和Unity3D
- C# 事件和Unity3D
- C#事件和Unity3d
- C# 事件和Unity3D
- C# 事件和Unity3D
- C# 事件和Unity3D
- 网页信息抓取进阶 支持Js生成数据 Jsoup的不足之处
- 第9周项目求1000以内所有偶数和
- 构建自己的Android代码托管服务器
- 读取Spring配置文件几种方式
- Magento 目录添加自定义属性例子
- C#事件和Unity3d
- 黑马程序员---Java语言基础5
- 第九周项目1-利用和循环求和
- 第九周项目2-分数的累加
- SVN 服务器+客户端搭建
- 例题:设置个人信息
- 关于上海贝尔实习的感想
- c# 自定义控件 属性菜单 控件移动 闪烁
- 第九周项目一——利用循环求和