2017-06-17 21 views
0

請幫我請 我正在做一項任務,並且遇到了我的代碼問題 我正在嘗試使用一個武器統計實例,我可以參考有關武器統計和遊戲管理器它將武器ID更改爲玩家當前裝備的武器,但是當我嘗試擊中敵方統一體時,表示該統計數據=爲零統一的C#對象Instance = 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); 
} 

}

+0

'統計= WeaponStats.instance;'基本上出現這種異常是因爲'統計= WeaponStats.instance'爲空。你需要解決這個問題。 – mjwills

+0

如果你想讓'WeaponStats'的實例存在,你至少需要將'WeaponStats'附加到一個GameObject上。只需創建一個空的GameObject並將'WeaponStats'附加到它。就這樣。 – Programmer

回答

2

原因,你仍然得到stats = WeaponStats.instance一個NullReferenceException是因爲沒有在那裏你實際上初始化WeaponStats.instance。讓它作爲類的靜態成員不會初始化它。 您訪問它的唯一方法是在Awake方法中未被調用。

這可能是值得看看Singelton的設計模式 - 看起來你正在嘗試做類似的事情。

在這裏尋找dofactory.com上Singelton

+0

在另一個腳本它工作正常,當我升級武器損害雖然所以它被稱爲我不知道爲什麼它只是該腳本 – Razzel

+0

@Razzel - 可能是在其他地方它的作品,但在給定的代碼,你不會初始化它的任何地方 - 因此錯誤 –

+0

我把更多的代碼放入我的問題,因爲他們都做了完全相同的事情,我試圖在破壞的腳本中實例化它,但它沒有效果。 我做了一個調試,它看到的變量,但由於某種原因,統計基地爲空 – Razzel