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 添加到损坏事件中?
任何帮助深表感谢!
实例化目标对象时需要添加监听器。例如:
将预制件声明更改为目标类型并在检查器中重新分配目标预制件。
public Target targetPrefab;
Run Code Online (Sandbox Code Playgroud)
然后
Target target = Instantiate(targetPrefab);
target.damageEvent.AddListener(targetReceivedDamage);
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助 :)
归档时间: |
|
查看次数: |
6042 次 |
最近记录: |