因此,进一步解释一下,我希望场景 2 中的敌人以场景 1 中开始的玩家为目标。我已经有一个伤害脚本和一个敌人的 AI 脚本,用于追逐玩家,但我不能使其以玩家为目标,因为玩家从不同的场景开始。我尝试寻找多个 YouTube 视频,并询问了一些更精明的编码朋友。
这也是我为敌人追赶玩家的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyAI : MonoBehaviour
{
public GameObject player;
public float speed;
private float distance;
public string playerTag = "Player";
internal Transform playerObject;
// Start is called before the first frame update
void Start()
{
playerObject = GameObject.FindGameObjectWithTag(playerTag);
}
// Update is called once per frame
void Update()
{
distance = Vector2.Distance(transform.position, player.transform.position);
Vector2 direction = player.transform.position - transform.position;
transform.position = Vector2.MoveTowards(this.transform.position, player.transform.position, speed * Time.deltaTime);
}
因此,在观看视频时,我想出了如何使其在同一场景中瞄准玩家,并且我使用上面相同的代码使其工作。在统一中,我能够将播放器拖到代码下方的部分。但我觉得我找不到任何关于攻击稍后进入场景的玩家的敌人的信息。也许我没有找对地方,但我花了很多时间寻找。
编辑:我还忘了说,当我保存此脚本时,我得到了 erorr: Assets\scripts\EnemyAI.cs(16,24): error CS0029: Cannot implicitly conversion type 'UnityEngine.GameObject' to 'UnityEngine.Transform' 和我也不确定如何解决这个问题,或者它是否影响了我想做的事情。
编辑 2:我一直在研究游戏的其他部分,我发现我只需要将玩家的生命值附加到脚本中,但我的玩家从另一个场景开始,然后进入场景 2。
你的敌人无法找到玩家,因为它在开始方法中使用搜索。您可能知道,在
MonoBehaviour.Start
之后,一生中只会调用一次 Awake
。 文档
因此您有多种选择:
Player
的实例更新所有敌人。GameObject.FindGameObjectWithTag(playerTag);
。您将能够注入某种 Action<Player>
,敌人必须订阅才能在出现时跟踪玩家。实际上,使用 DI 容器解决任务的方法有很多种。但对于你的问题水平来说,这可能会花费很多时间,但仍然值得。PlayerContainer: ScriptableObject
。它必须包含 Register(Player player)
和 Player GetInstance()
方法。然后将 PlayerContainer
字段添加到 Enemy 和 Player 类中。敌人将可以通过 PlayerContainer.GetInstance()
访问玩家,并且玩家类必须在它出现时注册自己。只是当您从 Enemy 类的某些方法调用 GetInstance
时,不要忘记检查 Player 实例是否为 NULL,因为在玩家出现之前它可能为空。我认为就您的情况而言,这是实现您目标的最合适方法。我还建议您观看此会议视频。