【问题标题】:How do you create a default player for an enemy AI script in Unity? [duplicate]如何在 Unity 中为敌方 AI 脚本创建默认玩家? [复制]
【发布时间】:2021-06-23 23:17:41
【问题描述】:

我有一个敌人 AI 脚本在运行,它基本上跟随我的玩家。现在我有一个“公共游戏对象播放器”,我必须通过将我的播放器预制件拖到插槽上来手动分配它。但我想在场景中有很多敌人,所以我不想为每个人手动执行此操作。我怎样才能给 EnemyController 脚本一个默认玩家跟随?

我有一个 PlayerManager 用于将我的玩家的位置传递给敌人:

public class EnemyController : MonoBehaviour
{
    Transform target;

    // Start is called before the first frame update
    void Start()
    {
        target = PlayerManager.instance.player.transform;
    }

那部分工作正常。所以我的想法是,像这样为玩家创建一个公共变量:

public GameObject player = PlayerManager.instance.player;

但这没有用。我收到此错误:“NullReferenceException:对象引用未设置为对象的实例”

非常感谢您提供的任何帮助!

【问题讨论】:

  • 您好,欢迎来到 StackOverflow!不要在声明中分配值,而是在 Start 中分配值。从您的 AI 中,您可以拥有一个私有的 Transform 目标;并在 Start() 中分配 target = PlayerManager.instance.player;您的 PlayerManager 应该从 Awake 分配 player 变量,以确保来自 Start 的任何调用都将引用一个值而不是 null。您还可以将播放器类型更改为 Transform 以方便使用。
  • 获得空引用的最可能原因是instance 为空。当您在设置实例之前尝试访问实例时,可能会发生这种情况(我猜是在 PlayerManager 的唤醒中)。通常我会在静态实例属性中使用 get,它检查实例是否为空,如果是,则使用 FindObjectOfType() 在场景中搜索类型对象。如果为 null,则场景中没有任何内容,您必须采取适当的行动,通过使用该组件创建新的 GO 或引发异常。
  • 感谢您的欢迎!这行得通。非常感谢您的帮助,对于迟到的回复深表歉意。
  • 请使用正确的标签!请注意,unityscript 是或更好的是曾经是一种 JavaScript 风格,类似于早期 Unity 版本中使用的自定义语言,现在早已弃用了!

标签: c# unity3d


【解决方案1】:

使用public GameObject player = PlayerManager.instance.player;,您的字段在调用EnemyController 的构造函数之前被初始化,并且您没有提供对PlayerManager.instance.player 的值/定义状态的控制(PlayerManager 或实例或播放器,可以为空且为空在你的情况下)。所以现在使用它“为时过早”。

相反,您可以使用PlayerInputManager 中的事件playerJoinedEvent 将敌人分配给刚刚加入事件处理程序的玩家,该事件处理程序检查PlayerManager 和instance 和player 是否不为空然后将玩家分配给目标。

【讨论】:

  • 哦,明白了。我会尝试并回来。谢谢
  • 我设法让它与 hijinxbassit 的方法一起工作,但我会继续研究这个。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-04-05
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 2015-01-17
相关资源
最近更新 更多