我是Unity
的新手
我在场景中有多个对象(都共享相同的脚本),而播放器对象(自己的脚本)。
我想要实现一个自定义侦听器,该侦听器每次在单个对象执行某些操作(例如,某个int值为10)时通知播放器
有人可以给我小费吗?
谢谢
答案 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());
}
这将提供实体的实际子类型,因此您可以执行各种操作