unity C#object Instance = null

时间:2017-06-17 09:49:19

标签: c# visual-studio unity3d

请帮助我 我正在做一项任务,我的代码遇到了问题 我正在尝试使用武器枪的一个实例,我可以参考武器上的统计数据,在gameManager中它将武器ID更改为当前装备的武器,但是当我试图击中一个敌人的统一时,说stats = = null

在“if(stats.weaponID == 1)”行上我收到一个空引用错误我尝试了多种不同的实例化方法,但仍然得到空错误

但我在其他课程中没有收到错误

请参阅下面的功能

    public void Shoot(bool isTesting = false)
{
    Vector2 mousePosition = new Vector2(Camera.main.ScreenToWorldPoint(Input.mousePosition).x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y);
    Vector2 firePointPosition = new Vector2(firePoint.position.x, firePoint.position.y);
    Vector2 direction = mousePosition - firePointPosition;
    if (isTesting)
    {
        direction = transform.right;
    }
    RaycastHit2D hit = Physics2D.Raycast(firePointPosition, direction, 100, whatToHit.value);

    // kill the enemy nothing else and check what weapon it was
    if (hit.collider != null) {
        Enemy enemy = hit.collider.GetComponent<Enemy>();
        if (enemy != null) {

            if (stats == null)
            {
                stats = WeaponStats.instance;
            }

            if (stats.weaponID == 1)
            {
                enemy.Damaged(stats._PistolDamage);
            }
            else if (stats.weaponID == 2)
            {
                enemy.Damaged(stats._RifleDamage);
            }
            else {

                Debug.Log("HELP!!");

            }

        }
    }

    // spawn effects
    if (Time.time >= timeToSpawnEffect) {
        Vector3 hitPos;
        Vector3 hitNormal;

        if (hit.collider == null) {
            hitPos = direction * 35;
            hitNormal = new Vector3(9999, 9999, 9999);
        } else {
            hitPos = hit.point;
            hitNormal = hit.normal;
        }

        Effect(hitPos, hitNormal);
        timeToSpawnEffect = Time.time + 1 / effectSpawnRate;
    }
}

这是weaponstats类的副本

using UnityEngine;
using System.Collections;

public class WeaponStats : MonoBehaviour {

    public static WeaponStats instance;

    public int weaponID = 0;

    // dmage based on equiped weapon
    public float Damage = 10f;
    public float Firerate = 7.5f;

    #region Weapons

        #region Pistol
        public float _PistolDamage = 30f;
        public float _PistolFirerate = 0f;
        #endregion

        #region Rifle
        public float _RifleDamage = 10f;
        public float _RifleFirerate = 7.5f;
        #endregion

    #endregion

    /// <summary>
    /// if weapon stats instance = to null
    /// </summary>
    void Awake() {
        if (instance == null) {
            instance = this;
        }
    }
}

在这个脚本中它完全正常

using UnityEngine;

使用UnityEngine.UI;

公共类WeaponUpgrading:WeaponStats {

// weapons text fields
#region Pistol
[SerializeField]
private Text PistolDamage;

[SerializeField]
private Text PistolFirerate;
#endregion
#region Rifle
[SerializeField]
private Text RifleDamage;

[SerializeField]
private Text RifleFirerate;
#endregion

#region Modifires
[SerializeField]
private float DamageMultiplier = 1.3f;

[SerializeField]
private float FirerateMultiplier = 1.3f;
#endregion

private WeaponStats stats;

void Start() {

    stats = WeaponStats.instance;
    UpdateValues(0); // update all on load

}

void UpdateValues(int ID) {

    switch (ID) {

        case 1:
            // update pistol
            PistolDamage.text = "Damage: " + stats._PistolDamage.ToString();
            PistolFirerate.text = "Firerate: " + stats._PistolFirerate.ToString();

            break;

        case 2:
            // update rifle
            RifleDamage.text = "Damage: " + stats._RifleDamage.ToString();
            RifleFirerate.text = "Firerate: " + stats._RifleFirerate.ToString();

            break;

        default:
            // refresh all on default
            PistolDamage.text = "Damage: " + stats._PistolDamage.ToString();
            PistolFirerate.text = "Firerate: " + stats._PistolFirerate.ToString();

            RifleDamage.text = "Damage: " + stats._RifleDamage.ToString();
            RifleFirerate.text = "Firerate: " + stats._RifleFirerate.ToString();

            break;

    }  

}

public void UpgradePistol() 
    {

    //Debug.Log(s)
    /*
    stats.PistolDamage = (stats.PistolDamage * DamageMultiplier);
    stats.PistolFirerate = Mathf.Round(stats.PistolFirerate * FirerateMultiplier);

    UpdateValues(1);
    */

    stats._PistolDamage = stats._PistolDamage * DamageMultiplier;
    PistolDamage.text = "" + stats._PistolDamage;

}

public void UpgradeRifle() {


    stats._RifleDamage = stats._RifleDamage * DamageMultiplier;
    RifleDamage.text = "" + stats._RifleDamage;

    stats._RifleDamage = stats._RifleDamage * DamageMultiplier;
    RifleDamage.text = "" + stats._RifleFirerate * FirerateMultiplier;

    /*
    stats.RifleDamage = (int)(stats.RifleDamage * DamageMultiplier);
    stats.RifleFirerate = Mathf.Round(stats.RifleFirerate * FirerateMultiplier);
    */
    //UpdateValues(2);
}

}

1 个答案:

答案 0 :(得分:2)

您仍然获得NullReferenceException stats = WeaponStats.instance的原因是因为没有您实际初始化WeaponStats.instance的位置。将它作为类的静态成员不会初始化它。 您访问它的唯一地方是Awake方法,该方法未被调用。

可能值得一看Singelton的设计模式 - 看起来你正试图做类似的事情。

在这里查看Singelton上的dofactory.com