脚本在一个场景上工作,但在另一个场景中出错

时间:2018-04-20 06:23:05

标签: c# unity3d

所以我收到的错误是

  

对象引用未设置为对象的实例Explode.LateUpdate()(在Assets / Scripts / Explode.cs:40)

我不确定为什么我得到这个错误,因为一切正常,我在不同的场景中有完全相同的脚本,没有错误信息。我喜欢任何帮助。

我用不同颜色的盒子爆炸我的播放器。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

    public class Explode : MonoBehaviour {

        [System.Serializable]
        public class ExplodeColours
        {
            public Color32[] Colours;
        }


        public static bool explode, explodeOnce;
        public ParticleSystem Explodes;
        private ParticleSystem explosionSystem;
        public Transform player;
        public List<ExplodeColours> ColoursList;

        // Use this for initialization
        void Start () {
            PlayerPrefs.SetInt("SelectedChar", 0);
            PlayerPrefs.Save();
            explodeOnce = false;
            explode = false;
        }

        // Update is called once per frame
        void Update () {
            if (explode == true)
            {
                explodeOnce = true;
                PlayerExplode();
            }
        }
        void LateUpdate()
        {
            if (explode)
            {
                ParticleSystem.Particle[] Particles = new ParticleSystem.Particle[explosionSystem.main.maxParticles];
                //ParticleSystem.Particle[] Particles = new ParticleSystem.Particle[Explodes.main.maxParticles];
                int NumParticlesAlive = explosionSystem.GetParticles(Particles);
                for (int i = 0; i < NumParticlesAlive; i++)
                {
                    Particles[i].startColor = (ColoursList[PlayerPrefs.GetInt("SelectedChar")].Colours[Random.Range(0, ColoursList[PlayerPrefs.GetInt("SelectedChar")].Colours.Length)]);
                }
                explosionSystem.SetParticles(Particles, NumParticlesAlive);
                explode = false;
            }

        }
        void PlayerExplode()
        {
            explosionSystem = Instantiate(Explodes, player.position, player.rotation);
            explosionSystem.Play();
        }
    }

2 个答案:

答案 0 :(得分:2)

如果这是第40行(我必须计算):

ParticleSystem.Particle[] Particles = new ParticleSystem.Particle[explosionSystem.main.maxParticles];

然后explosionSystemmainmaxParticles为空。我打算将其作为副本关闭,此错误非常常见,解决问题的方法很简单。

但代码行上的断点,当代码控件停止时,检查哪个对象为null并确保其设置。

修改

使用GetComponent初始化explosionSystem函数中的Start变量。首先,找到ParticleSystem附加到使用GetComponent的GameObject得到ParticleSystem

private ParticleSystem explosionSystem;
void Start()
{
    GameObject obj = GameObject.Find("NameOfObjectParticleSystemIsAttachedTo");
    explosionSystem = obj.GetComponent<ParticleSystem>();
}

此外,在for循环内,您尝试使用Particles的startColor属性而不初始化每个属性。您可以使用Particles[i] = new ParticleSystem.Particle();

执行此操作

变化:

for (int i = 0; i < NumParticlesAlive; i++)
{
    Particles[i].startColor 
 = (ColoursList[PlayerPrefs.GetInt("SelectedChar")].Colours[Random.Range(0, ColoursList[PlayerPrefs.GetInt("SelectedChar")].Colours.Length)]);
}

for (int i = 0; i < NumParticlesAlive; i++)
{
    Particles[i] = new ParticleSystem.Particle();
    Particles[i].startColor 
 = (ColoursList[PlayerPrefs.GetInt("SelectedChar")].Colours[Random.Range(0, ColoursList[PlayerPrefs.GetInt("SelectedChar")].Colours.Length)]);
}

答案 1 :(得分:0)

要避免空引用错误,请确保所有变量(正在使用)具有其他值,至少在构造函数级别指定默认值