如何以预编程方式将侦听器添加到UnityEvent中

时间:2017-12-06 15:48:05

标签: c# events unity3d

我读到了有关UnityEvent的信息并试图实现它。

我有一个" GameController.cs"脚本,附加到GameObject" ScriptsHolder",以及" target.cs"附加到Prefab GameObject的脚本,名为" target"。

"目标"在启动时不在场景中:我在某个点启动多个目标,这些目标被重命名为" target0"," target1",...

当目标受到伤害时,我希望它将其名称发送给GameController.cs,后者具有破坏该对象的空白。 这就是我的所作所为:

target.cs:

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.Events;

 public class target : MonoBehaviour {

      public UnityEvent damageEvent;

     void Damage(float damage)
     {
         damageEvent.Invoke();
     }        
 }

接下来,我点击我的目标预制件,然后在检查器中,我尝试添加" ScriptsHolder"到伤害事件。这就是我的问题:我无法在损坏事件中删除ScriptsHolder。做了一些测试,其原因似乎是"目标"还没有出现在我的场景中。

所以我读到了添加一个监听器,但我无法弄清楚如何做到这一点。

我在这里" GameController.cs ":

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.Events;
 public class GameController : MonoBehaviour {
 UnityEvent damageEvent;
 void Awake()
 {
     damageEvent.AddListener(targetReceivedDamage);
 }
 void targetReceivedDamage()
 { // do some stuff }
 }

但这并不奏效。我究竟做错了什么?或者我如何将ScriptsHolder添加到损坏事件中,即使" target"不在场景中吗?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

实例化目标对象时需要添加侦听器。例如:

将预制件声明更改为目标类型,并在检查器中重新指定目标预制件。

public Target targetPrefab;

然后

Target target = Instantiate(targetPrefab);

target.damageEvent.AddListener(targetReceivedDamage);

希望这会有所帮助:)