2016-04-08 1 views
1

Tout simplement un problème simple, mais après avoir cherché sur Internet, j'ai du mal à trouver une réponse.La scène se charge différemment lorsqu'elle est chargée à partir d'une autre scène que la sélection de cette scène dans l'éditeur (Unity, C#)

Problème

Scène ne se charge pas complètement, certaines parties travaillent, certains ne le font pas, d'une autre scène (par Application.LoadLevel()), alors que l'ouverture de la scène directement, puis il fonctionne très bien jouer .

Ce que j'ai essayé

  • attente pendant un certain temps pour voir si elle est en train de prendre le temps de chargement (1 min +), par rapport aux dix secondes quand il charge lui-même.
  • Construit et vu si le problème se répète ou non, ce qui me permet de décider si cela est dû à l'éditeur, comme lorsque vous changez de scène et l'éclairage devient sombre. Cependant, le problème se répète.
  • Mise à niveau de mon Unity vers la version 5.3.4f1, puis utilisation de SceneManager.LoadScene() au lieu de Application.LoadLevel(). Aucun changement évident du tout.

Ce que je pense peut causer ce

  • Lecture de pages web je comprends que le chargement de la scène et le système de scène de l'unité peut être gênant

Merci d'avoir lu, je l'espère C'est un problème simple mais pour un utilisateur d'Unity assez inexpérimenté (ME), c'est assez perplexe. Si des détails exacts sont requis, je les ajouterai mais pour moi ils sont inutiles (et demandent beaucoup d'efforts).

plus en détail (si vous en avez besoin)

vidéo montrant la scène chargée directement et d'une autre scène (HERE)

Script avec des résultats de débogage intéressants -

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

public class ObstacleController : MonoBehaviour { 
    ButtonCreator ButtonCreator; 
    List<GameObject> LineGameObjects; 
    List<LineClass.Line> LineInfos; 
    List<GameObject> Positions; 
    List<GameObject> Obstacles; 
    List<GameObject> PossiblePositions; 
    public List<Vector3> Targets; 
    List<Vector3> PossiblePos; 
    List<LineClass.Line> ConnectedLines; 
    GameObject Ball; 
    public GameObject ball; 
    public int numberOfBalls; 
    public float speed; 
    Vector3 noGoPoint; 
    List<float> Speeds; 
    public List<Vector3> PastReachedPoints; 
    bool Targeted; 
    public GameObject cross; 
    int i99; 
    // Use this for initialization 
    void Start() { 
     i99 = 0; 
     Speeds = new List<float>(); 
     ConnectedLines = new List<LineClass.Line>(); 
     ButtonCreator = GetComponent<ButtonCreator>(); 
     LineGameObjects = new List<GameObject>(); 
     LineInfos = new List<LineClass.Line>(); 
     Positions = new List<GameObject>(); 
     PossiblePositions = new List<GameObject>(); 
     Obstacles = new List<GameObject>(); 
     Targets = new List<Vector3>(); 
     PossiblePos = new List<Vector3>(); 
     Targeted = true; 
     PastReachedPoints = new List<Vector3>(); 
    } 

    void LateUpdate() 
    { 
     GameObject[] gameObjects = GameObject.FindGameObjectsWithTag("cross"); 
     foreach (GameObject target in gameObjects) 
     { 
      GameObject.Destroy(target); 
     } 
     Instantiate(cross, noGoPoint, Quaternion.identity); 
    } 
    // Update is called once per frame 
    void Update() { 
     Debug.Log("HEY"); // LOOK HERE <- <- <- <- <- 
     if (Time.frameCount == 1) 
     { 
      Debug.Log("2HEY"); // LOOK HERE <- <- <- <- <- 
      // connect up lists 
      LineGameObjects = ButtonCreator.LineGameObjects; 
      Positions = ButtonCreator.Positions; 
      LineInfos = ButtonCreator.LineInfos; 
      //intialise possible positions 
      PossiblePositions.Clear(); 
      int i = 0; 
      while (i < Positions.Count) 
      { 
       PossiblePositions.Add(Positions[i]); 
       i++; 
      } 
      // set number of balls 
      numberOfBalls = 11; 
      // create balls 
      i = 0; 
      while (i < numberOfBalls) 
      { 
       GameObject Ball = Instantiate(ball) as GameObject; // create the ball 
       int i2 = Random.Range(0, PossiblePositions.Count); // randomise the index 
       Ball.transform.position = PossiblePositions[i2].transform.position; // set the positions 
       Ball.transform.position = new Vector3(Ball.transform.position.x, Ball.transform.position.y, -0.1f);// set the z to -1 
       Obstacles.Add(Ball); // add to list 
       Debug.Log("3HEY"); // LOOK HERE <- <- <- <- <- 
       i++; 
      } 
      PossiblePositions.Clear(); 
      i = 0; 
      while (i < Positions.Count) 
      { 
       PossiblePositions.Add(Positions[i]); 
       i++; 
      } 
      // reset possible positions 

      setNoGo(); 
      setTarget(); 
     } 

     bool TargetsReached = false; 
     bool TargetsNotReached = false; 
     int i5 = 0; 
     while (i5 < Obstacles.Count) 
     { 
      if (Obstacles[i5].transform.position == new Vector3(Targets[i5].x, Targets[i5].y, -1)) 
      { 
       TargetsReached = true; 
      } 
      else 
      { 
       TargetsNotReached = true; 
      } 
      i5++; 
     } 

     if (TargetsReached == true && TargetsNotReached == false) 
     { 
      Targeted = false; 
     } 
     if (Targeted == false) 
     { 
      SetupTarget(); 
     } 
     if (Targeted == true) 
     { 
      int i3 = 0; 
      while (i3 < numberOfBalls) 
      { 
       Vector3 current = Obstacles[i3].transform.position; 
       Vector3 target = new Vector3(Targets[i3].x, Targets[i3].y, -1); 
       float step = Speeds[i3] * Time.deltaTime; 
       Obstacles[i3].transform.position = Vector3.MoveTowards(current, target, step); 
       i3++; 
      } 
     } 

    } 
    void SetupTarget() 
    { 
     if (i99 == 2) 
     { 
      setNoGo(); 
      i99 = 0; 
     } 
     setTarget(); 
     i99++; 
     Targeted = true; 
    } 
    void setNoGo() // if targeted = false as targets have reached 
    { 
     Vector3 previous = noGoPoint; 
     PossiblePositions.Clear(); 

     int i = 0; 
     while (i < Positions.Count) 
     { 
      PossiblePositions.Add(Positions[i]); 
      i++; 
     } 
     i = 0; 
     while (i < PossiblePositions.Count) 
     { 
      bool isThereBlue; // will return true if at least one of the connected lines of this point is blue 
      isThereBlue = false; 

      // for each possible position find all the connected lines 
      ConnectedLines.Clear(); 
      int i2 = 0; 
      while (i2 < LineInfos.Count) 
      { 
       if (LineInfos[i2].endpos == PossiblePositions[i].transform.position || LineInfos[i2].startpos == PossiblePositions[i].transform.position) 
       { 
        ConnectedLines.Add(LineInfos[i2]); 
       } 
       i2++; 
      } 

      // checks if there is a connected blue line 
      i++; 
      int i3 = 0; 
      while (i3 < ConnectedLines.Count) 
      { 
       if (ConnectedLines[i3].colour == Color.blue) 
       { 
        isThereBlue = true; 

       } 
       i3++; 
      } 

       // if there are no connected blue lines remove from the selection for no go zone 
       if (isThereBlue == false) 
       { 
        PossiblePositions.RemoveAt(i); 
        if (i != 0) 
        { 
         i--; 
        } 
       } 
      i++; 

     } 

     i = 0; 
     while(i < PossiblePositions.Count) 
     { 
      if (PossiblePositions[i].transform.position == previous) 
      { 
       PossiblePositions.RemoveAt(i); 
       if (i != 0) 
       { 
        i--; 
       } 
      } 
      i++; 
     } 
     // for each obstacle 
     // when targeted = false 
     // choose a target, which is not - 
     // where it is now 
     // or in the no go area 
     i = Random.Range(0, PossiblePositions.Count); 
     noGoPoint = PossiblePositions[i].transform.position; 
     } 


    void setTarget() 
    { 
     PastReachedPoints.Clear(); 
     Targets.Clear(); 
     Speeds.Clear(); 
     int i3 = 0; 
     while (i3 < numberOfBalls) 
     { 
      Vector3 point = Obstacles[i3].transform.position; 
      //if (i3 == 1) 
      //{ 
      // Instantiate(cross, point, Quaternion.identity); 
      //} 
      point.z = 0; 
      PossiblePos.Clear(); 
      // find all the possible positions to move towards 
      int i = 0; 
      while (i < LineInfos.Count) 
      { 
       if (point == LineInfos[i].startpos) 
       { 
        PossiblePos.Add(LineInfos[i].endpos); 
       } 

       else if (point == LineInfos[i].endpos) 
       { 
        PossiblePos.Add(LineInfos[i].startpos); 
       } 
       i++; 
      } 
      //i = 0; 
      //while (i < PossiblePos.Count) 
      //{ 
      // if (i3 == 1) 
      // { 
      //  Instantiate(ocross, PossiblePos[i], Quaternion.identity); 
      // } 
      // i++; 
      //} 
      PossiblePos.Remove(point); 

      // remove any from the no go list 
      i = 0; 
      while (i < PossiblePos.Count) 
      { 
        if (new Vector2(PossiblePos[i].x, PossiblePos[i].y) == new Vector2(noGoPoint.x, noGoPoint.y)) 
        { 
         PossiblePos.RemoveAt(i); 
         if (i != 0) 
         { 
          i--; 
         } 
        } 
       i++; 
      } 
      //choose the random target 
      //i = 0; 
      //while(i < PossiblePos.Count) 
      //{ 
      // 
      // if (i3 == 1) 
      // { 
      //  Instantiate(rmarker, PossiblePos[i], Quaternion.identity); 
      // } 
      // i++; 
      //} 
      PastReachedPoints.Add(point); 
      Targets.Add(PossiblePos[Random.Range(0, PossiblePos.Count)]); 
      float time = 0.3f; 
      float distanceInBetween = Vector3.Distance(Obstacles[i3].transform.position, Targets[i3]); 
      float speed = distanceInBetween/time; 
      Speeds.Add(speed); 
      i3++; 
     } 

    } 
} 

La console Messages

Lorsque la scène est chargée directement

SceneDirect

Mais il est intéressant quand il est chargé d'une autre scène, il n'a pas de debugs de « 2HEY » ou « 3HEY ».

Répondre

0

Time.frameCount compte les trames depuis le début de la partie. Donc, si vous chargez la scène d'une autre scène Time.frameCount sera plus grand que 0 à coup sûr.

Il est également plus rapide de déboguer votre jeu au lieu d'utiliser les journaux pour voir ce qui se passe. Appuyez simplement sur Jouez dans MonoDevelop et (pour Unity 4.3 et ci-dessous) choisissez Unity Debugger, placez les points d'arrêt où vous devez arrêter et vérifier les valeurs des variables, puis appuyez sur Lecture dans Unity.

Bonne chance

+0

Merci beaucoup je sais maintenant pourquoi mon problème arrive, je l'utilise si (Time.frameCount == 1) pour faire en sorte que je puisse accéder aux données d'autres scripts et ce script à partir des fonctions de démarrage. Je suppose que je peux toujours obtenir le même résultat désiré en obtenant le frameCount de la fonction de démarrage, puis dans ma fonction de mise à jour en disant quand il est plus un. –

+0

Intéressant que cette réponse m'a pris moins d'une demi-heure pour obtenir le débordement de la pile, mais après 19 heures sur les réponses de l'unité, tout en mettant à jour ma question avec mes autres tentatives pour résoudre le problème. –

+0

oui, au début j'ai commencé sur Unity Answers mais le nombre de questions stupides là-bas m'a énervé. Et les employeurs accordent plus d'importance à la notation stackoverflow que celle de Unity Answers, alors oui, Salut –