当前位置:丝路教程网 > Unity3D >

Unity3D教程-事件、委托机制在unity3d中的使用

2016-11-04 09:42 来源: 丝路教程网 分类: Unity3D
343 作者:丝路教程网

[导读] 关于Delegate作用我就不多说了,不懂的童鞋可以戳这看 ,Unity中可以直接使用EventHandler实现事件委托,咱们直接事例吧。 一、场景物体移动结束后事件监听 假如PlayerControl,移动结束后

  关于Delegate作用我就不多说了,不懂的童鞋可以戳这看 ,Unity中可以直接使用EventHandler实现事件委托,咱们直接事例吧。

  一、场景物体移动结束后事件监听

  假如PlayerControl,移动结束后触发MoveComplete事件。

  using UnityEngine;

  using System.Collections;

  using System;

  public class PlayerControl : MonoBehaviour {

  public event EventHandler MoveComplete;

  // Use this for initialization

  void Start () {

  }

  // Update is called once per frame

  void Update () {

  if (Input.GetMouseButtonUp(0)) {

  // Test logic for PlayerMoveComplete

  PlayerMoveComplete();

  }

  }

  void PlayerMoveComplete()

  {

  if (MoveComplete != null) {

  MoveComplete(this, EventArgs.Empty);

  }

  }

  }

  事件接收处理

  using UnityEngine;

  using System.Collections;

  using System;

  public class GameManager : MonoBehaviour {

  public static GameManager Instance;

  public PlayerControl playerControl;

  void Awake ()

  {

  // check there isn't more than one instance of the GameManager in the scene

  if(Instance != null){

  Debug.LogError("More than one GameManager found in the scene");

  return;

  }

  // set the global instance

  Instance = this;

  }

  // Use this for initialization

  void Start () {

  playerControl.MoveComplete += HandleMoveComplete;

  }

  void HandleMoveComplete (object sender, EventArgs e)

  {

  Debug.Log("MoveComplete:");

  }

  // Update is called once per frame

  void Update () {

  }

  }

  这里由于使用的EventHandler实现,所以在事件中无法传递自定义参数。

  二、自定义Event,事件中传递自定义参数

  1、自定义EventArgs

  using UnityEngine;

  using System.Collections;

  using System;

  public class PlayerMoveEventArgs : EventArgs {

  private string message;

  public PlayerMoveEventArgs(string message)

  {

  this.message = message;

  }

  public string Message

  {

  get{return message;}

  }

  }

  public delegate void MoveCompleteHandle(object sender, PlayerMoveEventArgs e);

  那么我们修改下PlayerControl

  using UnityEngine;

  using System.Collections;

  using System;

  public class PlayerControl : MonoBehaviour {

  public event EventHandler MoveComplete;

  public event MoveCompleteHandle CustomMoveComplete;

  // Use this for initialization

  void Start () {

  }

  // Update is called once per frame

  void Update () {

  if (Input.GetMouseButtonUp(0)) {

  // Test logic for PlayerMoveComplete

  PlayerMoveComplete();

  }

  }

  void PlayerMoveComplete()

  {

  if (MoveComplete != null) {

  MoveComplete(this, EventArgs.Empty);

  }

  if (CustomMoveComplete != null) {

  CustomMoveComplete(this, new PlayerMoveEventArgs("Move:" + this.name));

  }

  }

  }

  处理事件的我们也修改下

  using UnityEngine;

  using System.Collections;

  using System;

  public class GameManager : MonoBehaviour {

  public static GameManager Instance;

  public PlayerControl playerControl;

  void Awake ()

  {

  // check there isn't more than one instance of the GameManager in the scene

  if(Instance != null){

  Debug.LogError("More than one GameManager found in the scene");

  return;

  }

  // set the global instance

  Instance = this;

  }

  // Use this for initialization

  void Start () {

  playerControl.MoveComplete += HandleMoveComplete;

  playerControl.CustomMoveComplete += HandleCustomMoveComplete;

  }

  void HandleCustomMoveComplete (object sender, PlayerMoveEventArgs e)

  {

  Debug.Log("HandleCustomMoveComplete:" + e.Message);

  }

  void HandleMoveComplete (object sender, EventArgs e)

  {

  Debug.Log("MoveComplete:");

  }

  // Update is called once per frame

  void Update () {

  }

  }

  ok,现在你可以自由的玩耍了。好了,本篇unity3d教程关于event与delegate在unity3d中的使用到此结束。


免责声明:

丝路教程网的部分文章信息来源于网络以及网友投稿,本网站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,如权利人发现存在误传其作品情形,请及时与本站联系。

Unity3D教程-事件、委托机制在unity3d中的使用

的相关文章
Copyright © 2008-2017 blog.silucg.com 丝路教程网 版权所有 网站地图
点击这里给我发消息
丝路教育