c# - 方法调用的替代方案
问题描述
在我的敌人脚本(一个实例化的对象)上,我像这样访问玩家的位置:
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;
}
}
有更清洁的方法吗?我的炸弹脚本以相同的方式访问玩家位置。
我应该制作一个界面并让炸弹和敌人脚本继承它吗?据我了解,继承仅适用于同一“家谱”的成员(即动物>猫,汽车>本田等)
有人建议做一个事件,但它真的像每帧都调用一个订阅者那样“干净”吗?
解决方案
你可以做到这一点的一种方法是创建一个委托甚至一个事件来桥接敌人和玩家之间的通信,即使它们都是实例化的对象。
即敌人已经死亡->玩家收到玩家死亡的通知,玩家这样做->。
在两个类之外但在命名空间内声明一个委托,如下所示:
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);
}
因此,订阅上述事件的人将收到上述消息。
即,这只是您可以对委托进行的操作的一个示例。
希望能帮助到你!
推荐阅读
- reverse - 使用 samtools faidx 提取反向 BLAST 匹配
- python - 收集包元数据(repodata.json):/Killed
- javascript - React - 如何循环和更新对象模型中的值?
- installation - 使用 Inno Setup StringChangeEx 函数时出现“预期变量”错误
- python - 使用 python-docx 添加图片标题
- java - 如何将数字传递给泛型?
- java - 文件输入错误
- python - 如何将对象的类扩展到子类?
- python - 在列表中查找文件的名称并使用列表中的索引重命名该文件
- powershell - 移动不同文件夹中的文件,但在每个文件夹中排除一个子文件夹