2017-08-15 2 views
-1

Je travaille sur un jeu de tir spatial 2D, et j'ai fait un powerup qui ne fonctionne pas.NullRefExc lorsque trieing pour définir la valeur de la classe dans un tableau de classes, pourquoi?

Le vaisseau du joueur a 3 GameObjects attachés, 3 canons. Le script powerUp stocke les configurations de pistolet et quand le PowerUp entre en collision avec le joueur, le joueur obtient la configuration de pistolet du PowerUp, puis le détruit. Le PowerUp change périodiquement, d'où la procédure CyclePowers().

Je stocke les configurations dans les procédures qui sont exécutées lors de la création du PowerUp. Ils définissent les valeurs de leurs classes appropriées.

Le problème est qu'une NullReferenceException est levée lorsqu'elle essaie de définir la valeur.

erreur est:

NullReferenceException: Object reference not set to an instance of an object PowerUp.SetupGunLaserSettings() (at Assets/PowerUp.cs:131) PowerUp.Start() (at Assets/PowerUp.cs:30) 

Je pense que le problème est que la classe n'existe pas quand il tente de définir sa valeur. Pourquoi, je ne sais pas. Je suis un débutant en C#, donc mon hypothèse est probablement erronée. Voici le code:

using UnityEngine; 
using System.Collections; 

public class PowerUp : MonoBehaviour { 
    // Use this for initialization 
    void Start() {   
     SetupGunLaserSettings(); 
     SetupGunLaser2Settings(); 

     powerType = powerCount; 
     InvokeRepeating("CyclePowers", 0.000001f, cycleRate);  
    } 

    public class gunSettings{ 
     public string name; 
     //ETC 
    } 

    public class gunS{ 
     public gunSettings gunSNose = new gunSettings(); 
     //ETC  
    } 


    private gunS[] gunLaser = new gunS[3]; //powerType '0' 
    void SetupGunLaserSettings(){ 
     for (int i = 0; i <= 2; i++) { 
      gunLaser[i].gunSNose.weaponActive = true; //This is where the exception is thrown. 
      //ETC    
     } 
    } 

} 
+1

Veuillez réduire ceci à un [mcve]. Il y a un * lot * de code ici, presque tout ce qui est probablement hors de propos. Mais je ne vois aucun code où vous remplissez le tableau. (Vous ne créez jamais d'instance de la classe 'gunS'.) –

+0

Veuillez publier un exemple [Minimal, Complete et vérifiable] (https://stackoverflow.com/help/mcve). En d'autres termes s'il vous plaît affiner votre problème en supprimant tout le fouillis. – Sach

+0

En haut de votre boucle 'for', vous devez créer les instances de la classe' gunS'. Essayez d'ajouter cette ligne juste à l'intérieur de votre boucle 'for':' gunLaser [i] = new gunsS(); ' –

Répondre

0

Vous déclarez un tableau, mais il est vide lorsque vous commencez à définir des propriétés sur ses membres. Essayez de créer vos articles GunS:

for (int i = 0; i <= 2; i++) 
{ 
    gunLaser[i] = new GunS(); 
    gunLaser[i].gunSNose.weaponActive = true; 

Essayez de mettre vos déclarations en haut de votre classe, par la voie. C'est là que les gens vont les chercher. En les dispersant à travers le code, vous confondez toute personne qui essaie de comprendre votre code :)

+0

Merci beaucoup! Je pensais qu'un tableau est créé avec les valeurs par défaut. Oui, je place habituellement mes déclarations en haut, je l'ai fait seulement pour faciliter la lecture et le changement du code pour moi: D –

+0

Il est créé plein de valeurs par défaut, mais dans ce cas, cette valeur par défaut est 'null '. Si vous créez un tableau de 'bool', ils seront' false' (mais un bool? [] Contiendra 'null's!) – oerkelens