首页 > 解决方案 > 方法调用的替代方案

问题描述

在我的敌人脚本(一个实例化的对象)上,我像这样访问玩家的位置:

Player player;
private void Start()
{
    player = Player.p;
}
void Update()
{
    Vector3 PosToBeAt = Vector3.MoveTowards(transform.position, player.transform.position, Speed * Time.deltaTime);
    transform.LookAt(player.transform.position);
    transform.position = PosToBeAt;
}

播放器脚本上的代码是这样的:

public class Player : MonoBehaviour
{
   public static Player p;
   private void Awake()
   {
       p = this;
   }
}

有更清洁的方法吗?我的炸弹脚本以相同的方式访问玩家位置。

我应该制作一个界面并让炸弹和敌人脚本继承它吗?据我了解,继承仅适用于同一“家谱”的成员(即动物>猫,汽车>本田等)

有人建议做一个事件,但它真的像每帧都调用一个订阅者那样“干净”吗?

标签: c#unity3doopinheritancegame-development

解决方案


你可以做到这一点的一种方法是创建一个委托甚至一个事件来桥接敌人和玩家之间的通信,即使它们都是实例化的对象。

即敌人已经死亡->玩家收到玩家死亡的通知,玩家这样做->。

在两个类之外但在命名空间内声明一个委托,如下所示:

namespace MyGame
{
  public delegate void ActorCommunicationCallback(string message);
}

在敌人或玩家中创建一个 delgate/事件的实例(取决于你想“听”谁)

public event ActorCommunicationCallback(string message) EnemyDeath;


private void TellPlayerIDied(object sender, EventArgs)
{
  string msg = "I Died!";
  EnemyDeath?.Invoke(msg);
}

因此,订阅上述事件的人将收到上述消息。

即,这只是您可以对委托进行的操作的一个示例。

希望能帮助到你!


推荐阅读