J'ai besoin de faire fonctionner mon mur de personnages, mais j'ai des problèmes de code avec IEnumerator
Ceci est pour Unity 4.5.x
, code écrit en C # p>
using UnityEngine; using System.Collections; public class Moving : MonoBehaviour { public float speed = 6.0F; public float jumpSpeed = 8.0F; public float gravity = 20.0F; public float runTime = 1.0f; private Vector3 moveDirection = Vector3.zero; private bool isWallL = false; private bool isWallR = false; private RaycastHit hitL; private RaycastHit hitR; private int jumpCount = 1; IEnumerator afterRun() { yield return new WaitForSeconds (runTime); isWallL = false; isWallR = false; gravity = 20; } void Update() { CharacterController controller = GetComponent<CharacterController>(); if (controller.isGrounded) { jumpCount = 0; moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= speed; if (Input.GetButton("Jump")) moveDirection.y = jumpSpeed; } if (Input.GetKeyDown (KeyCode.Space) && !controller.isGrounded && jumpCount <= 1) { if (Physics.Raycast (transform.position, -transform.right, out hitL, 1)){ if (hitL.transform.tag == "Wall"){ isWallL = true; isWallR = false; jumpCount = 1; gravity = 0; StartCoroutine (afterRun); } } if (Physics.Raycast (transform.position, transform.right, out hitR, 1)){ if (hitR.transform.tag == "Wall"){ isWallL = false; isWallR = true; jumpCount = 1; gravity = 0; StartCoroutine (afterRun); } } } moveDirection.y -= gravity * Time.deltaTime; controller.Move(moveDirection * Time.deltaTime); } }
Aucune erreur attendue, mais j'en ai deux:
erreur CS1502: La meilleure correspondance de méthode surchargée pour UnityEngine.MonoBehaviour.StartCoroutine (System.Collections.IEnumerator) "a des arguments non valides" et "erreur CS1503: Argument # 1" impossible de convertir l'expression du groupe de méthodes "en type System.Collections .IEnumerator '.
3 Réponses :
afterRun dans votre code est une fonction, mais vous l'appelez sans crochets. Donc:
namespace someNamespace { public class SomeClass { IEnumerator afterRun() { yield return new WaitForSeconds(3); } public void Test(IEnumerator enumerator) { while(enumerator.MoveNext()) { //do some work } } public void YoureCode() { Test(afterRun()); } } public class WaitForSeconds { public WaitForSeconds(int a) { } } }
par exemple:
StartCoroutine (afterRun());
Pour plus d'informations, voir entrez la description du lien ici
Hé, votre message était déjà correct avant .. maintenant vous avez ajouté un exemple plutôt insignifiant;) Je ne ferais pas cela car il était déjà assez clair quoi faire et où et plutôt un lien vers le StartCoroutine
API à la place
Suite à la documentation de Unity coroutines , il semble que la fonction coroutine doit être appelé comme StartCoroutine ("afterRun");
Les deux sont des réponses valides (voir StartCoroutine
) mais Je préférerais utiliser la solution de Maxim sans utiliser les paramètres string
car ils sont assez sujets aux erreurs. Surtout lorsque vous commencez à vouloir passer plus d'un paramètre à IEnumerator
;)
Pourquoi ne pas aimer ceci:
coroutine = afterRun(); StartCoroutine(coroutine);
puis définissez-le et appelez-le:
private IEnumerator coroutine;
CharacterController controller = GetComponent (); pas besoin d'appeler cela dans la mise à jour, vous pouvez simplement l'appeler une fois dans la méthode Start :)
@phantasm en fait pas
vous pouvez
mais plutôtvous devriez
! ;)GetComponent
est très performantafterRun
est une fonction et non unIEnumerator
, il faut donc utiliserStartCoroutine (afterRun ())