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
Mais il est intéressant quand il est chargé d'une autre scène, il n'a pas de debugs de « 2HEY » ou « 3HEY ».
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. –
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. –
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 –