Unity自定义触发事件

时间:2018-08-14 08:08:37

标签: unity3d events

我是Unity的新手

我在场景中有多个对象(都共享相同的脚本),而播放器对象(自己的脚本)。

我想要实现一个自定义侦听器,该侦听器每次在单个对象执行某些操作(例如,某个int值为10)时通知播放器

有人可以给我小费吗?

谢谢

2 个答案:

答案 0 :(得分:3)

我建议使用delegates and events。让事件触发一个函数,该函数在播放器脚本中调用一个函数。

(通过链接)

EventManager

using UnityEngine;
using System.Collections;

public class EventManager : MonoBehaviour 
{
    public delegate void ClickAction();
    public static event ClickAction OnClicked;


    void OnGUI()
    {
        if(GUI.Button(new Rect(Screen.width / 2 - 50, 5, 100, 30), "Click"))
        {
            if(OnClicked != null)
                OnClicked();
        }
    }
}

TeleportScript(使用EventManager中的事件)

using UnityEngine;
using System.Collections;

public class TeleportScript : MonoBehaviour 
{
    void OnEnable()
    {
        EventManager.OnClicked += Teleport;
    }


    void OnDisable()
    {
        EventManager.OnClicked -= Teleport;
    }


    void Teleport()
    {
        Vector3 pos = transform.position;
        pos.y = Random.Range(1.0f, 3.0f);
        transform.position = pos;
    }
}

答案 1 :(得分:1)

您确实想使用事件,以便任何实体都可以向其他任何人广播信息:

public class BroadcastingEntity : MonoBehaviour
{
     public static event Action<BroadcastingEntity> RaiseLowHealth,
     protected void OnLowHealth()
     {
          if(RaiseLowHealth != null) { RaiseLowHealth(this); }
     }
     public static event Action<BroadcastingEntity> RaiseDeath,
     protected void OnDeath()
     {
          if(RaiseDeath!= null) { RaiseDeath(this); }
     }
}

然后您拥有实际的实体:

public class Entity : BroadcastingEntity
{
    private int health = 50;
    public int Health
    {
        get{ return this.health; }
        set
        {
             this.health += value;
             if(this.health <= 0) 
             { 
                 OnDeath(this); 
                 return;
             }
             if(this.health < 10) { OnLowHealth(this); } 
        }
    }
}

最后,假设您的播放器是一个集中系统来收听。

public class Player : MonoBehaviour
{
    void Start()
    {
         BroadcastingEntity.RaiseLowHealth += EntityLowHealth;
         BroadcastingEntity.RaiseDeath += EntityDeath;
    }
    void OnDestroy()
    {
         BroadcastingEntity.RaiseLowHealth -= EntityLowHealth;
         BroadcastingEntity.RaiseDeath -= EntityDeath;
    }
    private void EntityLowHealth(BroadcastingEntity entity){ }
    private void EntityDeath(BroadcastingEntity entity){ }
}

事件是静态的,但是参数是对触发事件的实体的引用。因此,您可以打印名称或在其上添加其他组件。 你可以做:

    private void EntityLowHealth(BroadcastingEntity entity)
    {
         print(entity.GetType());
    }

这将提供实体的实际子类型,因此您可以执行各种操作