【发布时间】: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 版本中使用的自定义语言,现在早已弃用了!