首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实例化僵尸时出现不一致的空引用异常

实例化僵尸时出现不一致的空引用异常
EN

Stack Overflow用户
提问于 2017-06-20 02:33:38
回答 1查看 537关注 0票数 1

我正在使用Unity版本5.6.1f1,如果它有帮助的话。

在随机时刻,当我实例化一个Zombie时,它会导致一个指向ThirdPersonController.csNullReferenceException。然而,这个GameObject和脚本是由Unity构建的,作为他们的标准字符包资源。我所做的一切都是通过脚本将Zombie.target附加到Player.transform,一些僵尸会像预期的那样追逐Player,但有些人没有。

这个错误已经出现在统一论坛上,找到的唯一解决方案是删除指向ThirdPersonCharacter.CheckGroundStatus()的有限状态机,或者没有分配动画制作程序。

在图片中,设置为"none“的目标总是在游戏过程中指向玩家。

错误:

代码语言:javascript
复制
 NullReferenceException: Object reference not set to an instance of an object
    UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter.CheckGroundStatus () (at Assets/Standard Assets/Characters/ThirdPersonCharacter/Scripts/ThirdPersonCharacter.cs:215)
    UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter.Move (Vector3 move, Boolean crouch, Boolean jump) (at Assets/Standard Assets/Characters/ThirdPersonCharacter/Scripts/ThirdPersonCharacter.cs:54)
    UnityStandardAssets.Characters.ThirdPerson.AICharacterControl.Update () (at Assets/Standard Assets/Characters/ThirdPersonCharacter/Scripts/AICharacterControl.cs:39)

ThirdPersonCharacter,相关部分:

代码语言:javascript
复制
if (Physics.Raycast(transform.position + (Vector3.up * 0.1f), Vector3.down, out hitInfo, m_GroundCheckDistance))
{
    m_GroundNormal = hitInfo.normal;
    m_IsGrounded = true;
    m_Animator.applyRootMotion = true; //ERROR HERE
}

完整脚本(Unity提供的资源):

代码语言:javascript
复制
using UnityEngine;

namespace UnityStandardAssets.Characters.ThirdPerson
{
    [RequireComponent(typeof(Rigidbody))]
    [RequireComponent(typeof(CapsuleCollider))]
    [RequireComponent(typeof(Animator))]
    public class ThirdPersonCharacter : MonoBehaviour
    {
        [SerializeField] float m_MovingTurnSpeed = 360;
        [SerializeField] float m_StationaryTurnSpeed = 180;
        [SerializeField] float m_JumpPower = 12f;
        [Range(1f, 4f)][SerializeField] float m_GravityMultiplier = 2f;
        [SerializeField] float m_RunCycleLegOffset = 0.2f; //specific to the character in sample assets, will need to be modified to work with others
        [SerializeField] float m_MoveSpeedMultiplier = 1f;
        [SerializeField] float m_AnimSpeedMultiplier = 1f;
        [SerializeField] float m_GroundCheckDistance = 0.1f;

        Rigidbody m_Rigidbody;
        Animator m_Animator;
        bool m_IsGrounded;
        float m_OrigGroundCheckDistance;
        const float k_Half = 0.5f;
        float m_TurnAmount;
        float m_ForwardAmount;
        Vector3 m_GroundNormal;
        float m_CapsuleHeight;
        Vector3 m_CapsuleCenter;
        CapsuleCollider m_Capsule;
        bool m_Crouching;


        void Start()
        {
            m_Animator = GetComponent<Animator>();
            m_Rigidbody = GetComponent<Rigidbody>();
            m_Capsule = GetComponent<CapsuleCollider>();
            m_CapsuleHeight = m_Capsule.height;
            m_CapsuleCenter = m_Capsule.center;

            m_Rigidbody.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationY | RigidbodyConstraints.FreezeRotationZ;
            m_OrigGroundCheckDistance = m_GroundCheckDistance;


        void CheckGroundStatus()
        {
            RaycastHit hitInfo;
#if UNITY_EDITOR
            // helper to visualise the ground check ray in the scene view
            Debug.DrawLine(transform.position + (Vector3.up * 0.1f), transform.position + (Vector3.up * 0.1f) + (Vector3.down * m_GroundCheckDistance));
#endif
            // 0.1f is a small offset to start the ray from inside the character
            // it is also good to note that the transform position in the sample assets is at the base of the character
            if (Physics.Raycast(transform.position + (Vector3.up * 0.1f), Vector3.down, out hitInfo, m_GroundCheckDistance))
            {
                m_GroundNormal = hitInfo.normal;
                m_IsGrounded = true;
                m_Animator.applyRootMotion = true; //ERROR HERE
            }
            else
            {
                m_IsGrounded = false;
                m_GroundNormal = Vector3.up;
                m_Animator.applyRootMotion = false;
            }
        }
    }
}

AICharacterControl:

代码语言:javascript
复制
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace UnityStandardAssets.Characters.ThirdPerson
{
    [RequireComponent(typeof (UnityEngine.AI.NavMeshAgent))]
    [RequireComponent(typeof (ThirdPersonCharacter))]
    public class AICharacterControl : MonoBehaviour
    {
        public UnityEngine.AI.NavMeshAgent agent { get; private set; }             // the navmesh agent required for the path finding
        public ThirdPersonCharacter character { get; private set; } // the character we are controlling
        public Transform target;                                // target to aim for
        private GameObject player; 

        private void Start()
        {
            // get the components on the object we need ( should not be null due to require component so no need to check )
            agent = GetComponentInChildren<UnityEngine.AI.NavMeshAgent>();
            character = GetComponent<ThirdPersonCharacter>();

            player = GameObject.FindGameObjectWithTag("Player");
            target = player.transform;

            agent.updateRotation = false;
            agent.updatePosition = true;
        }


        private void Update()
        {
            if (target != null)
                agent.SetDestination(target.position);

            if (agent.remainingDistance > agent.stoppingDistance)
                character.Move(agent.desiredVelocity, false, false);
            else
                character.Move(Vector3.zero, false, false);
        }


        public void SetTarget(Transform target)
        {
            this.target = target;
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-05-15 18:35:02

尝试将ThirdPersonCharacter.cs中的"void Start“替换为"void Awake”。

当我将ThirdPersonCharacter.cs与另一个AI行为脚本一起使用时,我遇到了一个非常类似的问题:在编辑器中工作得很好,但是一旦我构建了它,我就得到了空引用异常,无论是在构建中还是编辑器中。我在web上真的找不到任何东西,空引用异常错误是非常常见的,但大多数情况下,你可以通过修复一个变量来解决它们……我是c#的新手,但我认为这不是脚本的普遍问题,而是变量调用/初始化的方式。不管怎么说,这对我很有效。

https://docs.unity3d.com/ScriptReference/MonoBehaviour.Awake.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44637598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档