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

bin*_*ars 0 c# events unity-game-engine

我读到了 UnityEvent 并正在尝试实现它。

我有一个“GameController.cs”脚本,附加到一个游戏对象“ScriptsHolder”,还有一个“target.cs”脚本附加到一个名为“target”的预制游戏对象。

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

当目标受到伤害时,我希望它将其名称发送到 GameController.cs,其中有一个可以销毁该对象的 void。这就是我所做的:

目标.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();
     }        
 }
Run Code Online (Sandbox Code Playgroud)

接下来,我单击目标预制件,然后在检查器中尝试将“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 }
 }
Run Code Online (Sandbox Code Playgroud)

但这是行不通的。我究竟做错了什么?或者,即使“目标”不在场景内,如何将 ScriptsHolder 添加到损坏事件中?

任何帮助深表感谢!

Uma*_*r M 5

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

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

public Target targetPrefab;
Run Code Online (Sandbox Code Playgroud)

然后

Target target = Instantiate(targetPrefab);

target.damageEvent.AddListener(targetReceivedDamage);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :)