2017-07-23 3 views
0

J'ai un préfixe Sphère qui est juste une sphère avec le script MoveSphere attaché. Il a Rotate() méthode qui commence la coroutine. La méthode Rotate() fait bouger la sphère le long de la trajectoire du cercle. Le problème est quand j'appelle la méthode Rotate() dans la méthode Start() du script MoveSphere cela fonctionne bien, mais quand j'essaie de l'appeler dans la méthode Start d'un script GameController - cela ne fonctionne pas (la sphère reste au même endroit). Voici mon code pour les scripts MoveSphere et Gamecontroller: MéthodeL'appel de StartCoroutine() ne fonctionne pas

public class MoveSphere : MonoBehaviour 
{ 
    // ...some fields 

    void Start() 
    { 
     rb = GetComponent<Rigidbody>(); 

     // if i uncomment next line of code - it works fine 
     // Rotate(); 
    } 

    public void Rotate() 
    { 
     StartCoroutine(rotate()); 
    } 

    void Update() { } 

    public IEnumerator rotate() 
    { 
     int n = (int)(360/dAngle); 
     float da = 360f/n; 
     vAmp = radius * da * Mathf.Deg2Rad/dt; 
     currentAngle = 0; 
     for (int i = 0; i < n; i++) 
     { 
      Vector3 pos = getPosition(currentAngle); 
      currentAngle += da; 
      rb.position = pos; 
      yield return new WaitForSeconds(dt); 
     } 
    } 

    //...some mathematical methods 
} 

public class GameController : MonoBehaviour 
{ 
    public GameObject obj; 
    public int numOfInstances; 

    // Use this for initialization 
    void Start() 
    { 
     GameObject sphere1 = Instantiate(obj, new Vector3(-5,0,-2), Quaternion.identity); 

     // this one doesn't work 
     sphere1.GetComponent<MoveSphere>().Rotate(); 
    } 

    void Update() { } 
} 
+0

Est-ce que 'MoveSphere' est préfabriqué ou simplement attaché à un objet existant dans la scène? – Programmer

+0

Sphère est un préfabriqué. – Eugene

+0

S'il vous plaît, expliquez ce que signifie «ça ne marche pas». Avez-vous une erreur? Etes-vous sûr que le coroutine ne démarre pas (ajoutez un simple 'Debug.Log' à vérifier)? Je suis presque sûr que vous avez un 'NullReferenceException' parce que' rb' est nul. Vous devez appeler 'rb = GetComponent ();' à l'intérieur de la méthode ** Awake **, et non ** Start ** dans la classe 'MoveSphere'. – Hellium

Répondre

0

Je ne sais pas comment cela est arrivé, mais je remarque que si je l'appelle à l'intérieur de mise à jour() du script appelant - il travaux!!!.