2016-12-18 1 views
1

Je sais qu'il y a un doublon possible et j'ai essayé de trouver ce qui cause ma nullité, mais peut-être que vous pouvez m'aider de toute façon. Donc, je fais un jeu dans lequel je pars au hasard "PoliceMan" à six points définis comme tableau dans l'inspecteur. Ceci est fait périodiquement par coroutine. J'ai essayé d'ajouter une méthode pour vérifier si le point d'apparition est visible par la caméra. Voici mes extraits de code:NullreferenceException lors de la vérification si le point est visible

IEnumerator AddPoliceManCR() 
{ 

    int counter = 0; 
    yield return new WaitForSeconds(1.0f); 
    while (counter < 10) 
    { 

     AddPoliceMan(); 
     counter++; 
     yield return new WaitForSeconds(Random.Range(3.0f, 5.0f)); 
    } 
    while (true) 
    { 
     AddPoliceMan(); 
     yield return new WaitForSeconds(Random.Range(0.5f, 3.0f)); 
    } 

} 


void AddPoliceMan() 
{ 
    GameObject policeManClone = (GameObject)policemanPool.getPooledPoliceman(); 
    policeManClone.transform.position = SetSpawnPosition(); 
    policeManClone.transform.LookAt(new Vector3(player.transform.position.x, 0, player.transform.position.z)); 

    policeManClone.tag = "PoliceMan"; 
    policeManClone.SetActive(true); 
} 



Vector3 SetSpawnPosition() 
{ 
    Vector3 position; 


    position = spawnPositions[Random.Range(0, 6)]; 
    Debug.Log(position.ToString()); 
    if (Camera.current.WorldToViewportPoint(position).x > 0f 
     && Camera.current.WorldToViewportPoint(position).x < 1f 
     && Camera.current.WorldToViewportPoint(position).y > 0f 
     && Camera.current.WorldToViewportPoint(position).y < 1f 
     && Camera.current.WorldToViewportPoint(position).z > 0f) 
    { 
     Debug.Log("Spawn point visible"); 
    } 
    else 
    { 
     Debug.Log("Spawn point is NOT visible"); 
    } 


    return position; 

} 

Coroutine est indiqué dans Start(). Ce script et gameObject ne sont pas détruits à aucun moment. NullReferenceException est en ligne: if (Camera.current.WorldToViewportPoint(position).x > 0f Debug.Logs montre correctement si les points sont visibles ou non, au moins la plupart du temps.

Le problème est que cela ne se produit pas à chaque appel du SetSpawnPopsition(). Il pourrait être tout de suite le jeu commence ou après 20 appels de cette méthode. Semble aléatoire. Aussi si le point est initialisé juste deux lignes avant pourquoi l'erreur montre-t-elle? Si je repasse la ligne policeManClone.transform.position = SetSpawnPosition(); à policeManClone.transform.position = spawnPositions[Random.Range(0, 6)]; Je n'ai aucune erreur.

L'erreur exacte est la suivante:

NullReferenceException: objet de référence non définie à une instance d'un (à Actif/scripts/GameControl.cs: 140) GameControl.SetSpawnPosition() objet ( GameControl.AddPoliceMan) (à Actif/scripts/GameControl.cs: 67) GameControl + c__Iterator0.MoveNext() (à Actif/scripts/GameControl.cs: 92) UnityEngine.SetupCoroutine.InvokeMoveNext (IEnumerator énumérateur, IntPtr returnValueAddress) (à C:/buildslave/unity/build/Runtime/Ex port/Coroutines.cs: 17)

EDIT

Ok, j'avais idée qu'il pourrait être l'autre chose. On dirait que Camera.current me donne null. Après l'avoir changé en une variable publique avec la caméra principale assignée dans l'inspecteur, cette erreur semble être corrigée. La question est pourquoi est-ce que Camera.current provoque null?

Répondre

0

Ok, j'avais l'idée que ce pourrait être l'autre chose. Il semble que Camera.current me donne null. Après l'avoir modifié en variable publique avec la caméra principale assignée dans l'inspecteur, cette erreur semble être corrigée. La question est pourquoi est-ce que Camera.current provoque null?

Camera.current retournera si la vue de la scène n'a pas le focus. Vous devez utiliser Camera.main et non Camera.current.

De même, avant d'utiliser Camera.main, assurez-vous que la caméra porte l'étiquette MainCamera. Ceci est fait par défaut quand une nouvelle scène est créée mais vous devez le vérifier ou vous obtiendrez à nouveau l'exception nulle.