(Unity C#) NullReferenceException 仅在 Start() 函数之外

迈克尔·加洛

我不断收到错误:

NullReferenceException: Object reference not set to an instance of an object

这让我想到了这一点:

if (Physics.Raycast(transform.position + (Vector3.up * 0.1f), Vector3.down, out hitInfo, enemy.groundCheckDistance))

我做了一些测试,发现敌人实际上被设置为这个对象的实例,因为我每次更新都打印了敌人的值。groundCheckDistance并且它每次都成功地从敌人对象中打印了正确的值我什至在检查器中更改了它,它检索到了正确的值。后来我发现,我在Start()方法中设置的所有对象Start()方法之外才变为 null (我的意思是 Animator、Rigidbody、Capsule Collider 等都变为 null)我 100% 确定动画师、胶囊对撞机、刚体和敌人都附加到这个游戏对象上。但是,我是在不同班级的Awake()上创建它们的这可能是我收到错误的原因吗?如果是我该如何解决?

这是我在Awake()上添加组件的脚本当我运行游戏时,我看到它们已成功添加。

using UnityEngine;
using UnityEngine.AI;

namespace MGCO.Characters.EnemyScripts
{
    //USED TO CONSTRUCT THE COMPONENTS ON AN ENEMY AT RUNTIME
    public class EnemyComponents : MonoBehaviour
    {
        //INITIALIZE ENEMY OBJECT
        Enemy enemy;

        void Awake()
        {
            enemy = GetComponent<Enemy>();

            //MAKE SURE ENEMY IS NOT HUMANOID
            if (!enemy.isHumanoid)
            {
                //CHECK TO SEE IF MESH FILTER ALREADY EXISTS
                if (!GetComponent<MeshFilter>())
                {
                    //INITIALIZE "MeshFilter"
                    MeshFilter meshFilter = gameObject.AddComponent<MeshFilter>();

                    //SET MESH OF MESHFILTER
                    meshFilter.mesh = enemy.enemyMesh;
                }

                //CHECK TO SEE IF MESH RENDERER ALREADY EXISTS
                if (!GetComponent<MeshRenderer>())
                {
                    //INITIALIZE "MeshRenderer"
                    MeshRenderer meshRenderer = gameObject.AddComponent<MeshRenderer>();

                    //SET MESH MATERIAL
                    meshRenderer.material = enemy.meshMaterial;
                }
            }
            //MAKE SURE ENEMY IS NOT HUMANOID
            else
            {
                //CHECK TO SEE IF ANIMATOR ALREADY EXISTS
                if (!GetComponent<Animator>())
                {
                    //INITIALIZE "RuntimeAnimatorController"
                    Animator animator = gameObject.AddComponent<Animator>();

                    //SET RUNTIMEANIMATORCONTROLLER
                    animator.runtimeAnimatorController = enemy.runtimeAnimatorController;

                    //SET AVATAR
                    animator.avatar = enemy.avatar;

                    //SET ROOT ANIMATION BOOL
                    animator.applyRootMotion = enemy.applyRootMotion;
                }
            }

            //CHECK TO SEE IF RIGIDBODY ALREADY EXISTS
            if (!GetComponent<Rigidbody>())
            {
                //INITIALIZE "Rigidbody"
                Rigidbody enemyRigidbody = gameObject.AddComponent<Rigidbody>();

                //SET MASS
                enemyRigidbody.mass = enemy.mass;

                //SET DRAG
                enemyRigidbody.drag = enemy.drag;

                //SET ANGULAR DRAG
                enemyRigidbody.angularDrag = enemy.angularDrag;

                //SET USE GRAVITY
                enemyRigidbody.useGravity = enemy.useGravity;
            }

            //CHECK TO SEE IF NAVMESHAGENT ALREADY EXISTS
            if (!GetComponent<NavMeshAgent>())
            {
                //INITIALIZE "NavMeshAgent"
                NavMeshAgent navMeshAgent = gameObject.AddComponent<NavMeshAgent>();

                //SET NAVMESH SPEED
                navMeshAgent.speed = enemy.speed;

                //SET BASE OFFSET
                navMeshAgent.baseOffset = enemy.baseOffset;

                //SET ANGULAR SPEED (HOW FAST ENEMY TURNS CORNERS)
                navMeshAgent.angularSpeed = enemy.angularSpeed;

                //SET ACCELERATION
                navMeshAgent.acceleration = enemy.acceleration;

                //SET STOPPING DISTANCE
                navMeshAgent.stoppingDistance = enemy.stoppingDistance;

                //SET OBSTACLE AVOIDANCE RADIUS
                navMeshAgent.radius = enemy.navmeshRadius;

                //SET OBSTACLE AVOIDANCE HEIGHT
                navMeshAgent.radius = enemy.navmeshHeight;
            }

            //CHECK TO SEE IF COLLIDER ALREADY EXISTS
            if (!GetComponent<CapsuleCollider>())
            {
                //INITIALIZE "CapsuleCollider"
                CapsuleCollider capsuleCollider = gameObject.AddComponent<CapsuleCollider>();

                //SET CENTER
                capsuleCollider.center = enemy.center;

                //SET COLLIDER RADIUS
                capsuleCollider.radius = enemy.colliderRadius;

                //SET COLLIDER HEIGHT
                capsuleCollider.height = enemy.colliderHeight;
            }
        }
    }
}

这是获取错误的脚本:

using UnityEngine;

namespace MGCO.Characters.EnemyScripts
{
    public class EnemyAnimation : MonoBehaviour
    {
        //REFERENCE GAMEOBJECTS
        Enemy enemy;
        Animator animator;
        Rigidbody enemyRigidbody;
        CapsuleCollider capsuleCollider;


        //INITIALIZE VARS
        Vector3 groundNormal;
        Vector3 capsuleCenter;

        private bool isCrouching;
        private bool isGrounded;

        private float originalGroundCheckDistance;
        private float turnAmount;
        private float forwardAmount;
        private float capsuleHeight;

        //VALUE FOR HALF (NEVER CHANGES)
        const float half = 0.5f;

        //RUNS ON START
        void Start()
        {
            enemy = GetComponent<Enemy>();

            animator = GetComponent<Animator>();
            enemyRigidbody = GetComponent<Rigidbody>();
            capsuleCollider = GetComponent<CapsuleCollider>();
            capsuleHeight = capsuleCollider.height;
            capsuleCenter = capsuleCollider.center;

            //FREEZE RIGIDBODY ROTATION
            enemyRigidbody.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationY | RigidbodyConstraints.FreezeRotationZ;
            //SET LOCAL VARIABLE
            originalGroundCheckDistance = enemy.groundCheckDistance;
        }

        ...

        //CHECKS POSITION OF GROUND BENEATH PLAYER
        void CheckGroundStatus()
        {
            //INITIALIZE RAYCASTHIT
            RaycastHit hitInfo;

            //IF RAYCASTS DOWN TO "GroundCheckDistance" VARIABLE
            if (Physics.Raycast(transform.position + (Vector3.up * 0.1f), Vector3.down, out hitInfo, enemy.groundCheckDistance))
            {
                //SET GROUNDNORMAL TO THE SURFACE OF THE RAYCASTHIT
                groundNormal = hitInfo.normal;
                //SET JUMPING FALSE
                isGrounded = true;
                //ANIMATOR APPLY ROOT MOTION
                animator.applyRootMotion = true;
            }
            else
            {
                //SET JUMPING TO TRUE
                isGrounded = false;
                //SET GROUNDNORMAL TO GO UP
                groundNormal = Vector3.up;
                //ANIMATOR DO NOT APPLY ROOT MOTION
                animator.applyRootMotion = false;
            }
        }
    }
}

并感谢您的帮助:)

迅速
//REFERENCE GAMEOBJECTS  
Enemy enemy;  
Animator animator;  
Rigidbody enemyRigidbody;  
CapsuleCollider capsuleCollider;

在这里你声明你的引用,但你没有在任何地方分配它们。

Rigidbody enemyRigidbody = gameObject.AddComponent<Rigidbody>();

在这里,您添加了刚体组件,它会返回对自身的引用。但是,您将引用分配给了一个名为enemyRigidbody 的不同变量,而不是您在上面声明的变量。

即使变量名称相似,在较小的范围/声明空间(一个在类中,另一个在方法中)中声明一个变量会创建一个具有相同名称但仅在方法本身内可用的全新变量。

你想要的是:

enemyRigidbody = gameObject.AddComponent<Rigidbody>();

这是对您在上面声明的 Rigidbody 的引用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Unity C#NullReferenceException

Unity教程(Space Shooter),C#NullReferenceException

unity NullReferenceException Hashset 添加

C# Visual Studio for unity 在输入时不显示 start() 函数

Unity:使用javascript获取NullReferenceException

nullreferenceexception:unity3d

Unity 2D 错误 Nullreferenceexception:对象引用未设置为对象 C# 的实例

Unity3D C#-NullReferenceException,尽管附加了文本并且方法起作用

Unity-C#-NullReferenceException:对象引用未设置为对象的实例

C#NullReferenceException与列表

C#中的NullReferenceException

加载新场景后,Unity 5 NullReferenceException

unity NullReferenceException 当对象刚刚被分配时

Unity3D中的NullReferenceException

Unity - 带有 Sets 和 Gets 的 NullReferenceException

UNITY 控制台錯誤 NullReferenceException:

仅在访问模型时的ASP.NET Core NullReferenceException

在函数范围之外运行C ++代码

主函数 C++ 之外的输入向量

仅在 unity3d、c# 中发生的错误(使用图形)

DataGridView 的 GetCachedPen 函数中的 NullReferenceException

如何调用仅在特定OS版本中可用的C函数?

如何仅在存在副本构造函数时调用它?C ++

在另一个脚本的Start()Unity C#之后执行脚本的Start()

nullreferenceexception未处理C#

DataRow C#上的NullReferenceException

在JNI函数(Android)之外从C调用Java中的函数?

Unity C#:使用参数绑定函数

在Unity C#中创建全局函数