如何让敌人瞄准进入场景的玩家?

问题描述 投票:0回答:1

因此,进一步解释一下,我希望场景 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。

c# unity-game-engine 2d
1个回答
1
投票

你的敌人无法找到玩家,因为它在开始方法中使用搜索。您可能知道,在

MonoBehaviour.Start
之后,一生中只会调用一次
Awake
文档

因此您有多种选择:

  1. 您可以创建某种调度程序类或敌人管理器,它们应该有一个初始化方法,必须在加载玩家场景后调用该方法,并使用
    Player
    的实例更新所有敌人。
  2. 您可以使用 Zenject/Extenject 或其他 DI 容器来注入依赖项,以避免使用
    GameObject.FindGameObjectWithTag(playerTag);
    。您将能够注入某种
    Action<Player>
    ,敌人必须订阅才能在出现时跟踪玩家。实际上,使用 DI 容器解决任务的方法有很多种。但对于你的问题水平来说,这可能会花费很多时间,但仍然值得。
  3. 您可以创建必须保留对 Player 实例的引用的
    PlayerContainer: ScriptableObject
    。它必须包含
    Register(Player player)
    Player GetInstance()
    方法。然后将
    PlayerContainer
    字段添加到 Enemy 和 Player 类中。敌人将可以通过
    PlayerContainer.GetInstance()
    访问玩家,并且玩家类必须在它出现时注册自己。只是当您从 Enemy 类的某些方法调用
    GetInstance
    时,不要忘记检查 Player 实例是否为 NULL,因为在玩家出现之前它可能为空。我认为就您的情况而言,这是实现您目标的最合适方法。我还建议您观看此会议视频
© www.soinside.com 2019 - 2024. All rights reserved.