unity3d 他们是否有任何方法可以调用特定的委托?

hgqdbh6s  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(145)

假设我有一个Player脚本连接到玩家,然后一个Enemy脚本连接到场景中的所有敌人,比如20个敌人。如果玩家杀死一个敌人,我必须调用EnemyDied函数。如果我做一个代理EnemyKillDelegate,当玩家杀死任何敌人时,它将调用注册的函数EnemyDied。但在这种情况下,每个敌人的EnemyDied都会调用,这肯定不是我想要的。有没有办法专门调用敌人脚本中已死亡的EnemyDied函数。我知道我可以调用敌人脚本中已死亡的GetComponent,然后调用该函数,但 * 有没有其他方法可以做到这一点?*

public class Player : MonoBehaviour
{
    //This Scrip is attach to only Player
    public static event Action EnemyKillDelegate;

    void EnemyDied()
    {
        EnemyKillDelegate?.Invoke();
    }
}

 
public class Enemy : MonoBehaviour
{
    //This Scrip is attach to every enemy in the scene
    private void OnEnable()
    {
        Player.EnemyKillDelegate += EnemyDied;
    }

    private void OnDisable()
    {
        Player.EnemyKillDelegate -= EnemyDied;
    }

    void EnemyDied()
    {
        Debug.Log("I am Dead");
    }
}
pod7payv

pod7payv1#

合适的方法是使用不同的委托。不,它不会调用每个Enemy游戏对象的方法,只调用订阅了委托的对象的方法。

// in Player.cs
public delegate string EnemyKillDelegate(Player p);
public EnemyKillDelegate OnEnemyKilled;

// in Enemy.cs
string EnemyDied(Player p)
{
    Debug.Log("Player " + p.gameObject.name + " killed enemy " + gameOBject.name);
    return gameObject.name;
}

然后你可以得到被杀死的敌人的名字如下:

string killedEnemy = EnemyKillDelegate?.Invoke(this);

这里enemyName可以为null(假设你连续调用Player.EnemyDied())。同样,如果只有一个玩家,你可以省略委托(Player p)的参数。

相关问题