2014-11-20 2 views
2

내 목표 : 달팽이가 스스로 움직이는 것처럼 보이게하려면. 예 : 몇 초 동안 오른쪽으로 이동하고 몇 초 동안 왼쪽으로 이동하여 몇 초 동안 한 곳에 머물러보세요.Unity, C# | 메소드 간 대기 시간은 어떻게됩니까?

현재 상태 : 내가 WaitForSeconds없이 WaitForSeconds

를 사용하려고 할 때 달팽이 내 달팽이

난 단지 시작했습니다 (이 정말 빨리 일을 제외)을 성공적으로 앞뒤로 방향을 변경 한 곳에서 여전히 앉아 어제 Unity와 C#을 배웠습니다. 모든 팁/제안은 원래의 질문에 있지 않더라도 많은 도움이 될 것입니다. 내가 도와 줄 수있는 다른 방법이 있다면 알려주십시오! :)

using UnityEngine; 
using System.Collections; 

public class SnailMove : MonoBehaviour { 
void Start() 
{ 

} 
// Use this for initialization 
void Update() 
{ 
    Waiting(); 
} 

// Update is called once per frame 
void Movement() 
{ 

    int direct = Random.Range(-1, 2); 
    if (direct == 1) 
    { 
     transform.Translate(Vector3.left * 1f * Time.deltaTime); 
     transform.eulerAngles = new Vector2(0,180); 
    } 
    if (direct == -1) 
    { 
     transform.Translate(Vector3.left * 1f * Time.deltaTime); 
     transform.eulerAngles = new Vector2(0,0); 
    } 
} 
    IEnumerator Waiting() 
    { 
    Movement(); 
    yield return new WaitForSeconds (5); 
    } 
} 

답변

2

코 루틴은 StartCoroutine으로 시작해야합니다. 귀하의 설명에서 다음과 같은 것을 원하는 것 같습니다.

using UnityEngine; 
using System.Collections; 

public class SnailMove : MonoBehaviour 
{ 
    public float speed = 1f; 
    int direction = 0; 
    void Start() 
    { 
     StartCoroutine(ChangeDirection()); 
    } 

    void Update() 
    { 
     if (direction == 1) 
     { 
      transform.Translate(Vector3.left * speed * Time.deltaTime); 
      transform.eulerAngles = new Vector2(0,180); 
     } 
     else if (direction == -1) 
     { 
      transform.Translate(Vector3.left * speed * Time.deltaTime); 
      transform.eulerAngles = new Vector2(0,0); 
     } 
    } 

    IEnumerator ChangeDirection() 
    { 
     while(true) 
     { 
      yield return new WaitForSeconds (5); 
      direction = Random.Range(-1, 2); // returns "-1", "0" or "1" 
     } 
    } 
} 
+0

Omg. 나는 너를 너무 많이 사랑해! 이것은 완벽 해!! <3 – FireFoxxie

1

논리 흐름이 다소 혼란 스럽습니다. Waiting() coroutine을 모든 프레임에서 시작합니다 (예 : Start()). coroutine을 루프합니다. 결과적으로 당신은 Waiting() coroutines를 실행하고 서로 경쟁합니다.

현재 두 가지 옵션이 있습니다

void Start() { 
    StartCoroutine(Waiting()); 
} 

IEnumrator Waiting() { 
    while(true) { 
     Movement(); 
     yield return new WaitForSeconds(5f); 
    } 
} 

나는 구역질 입력 얻었다을 그하지만, while(true) 끔찍한 생각이기 때문이다. 더 나은과 같이, Update() 시간을 추적하고 Movement() 5 초마다 호출하는 것입니다 :

private float timer = 0f; 

void Update() { 
    timer += Time.deltaTime; 
    if (timer > 5f) { 
     Movement(); 
     timer -= 5f; 
    } 
} 
+0

답변이 가장 필요한 솔루션입니다. 그것은 다소 효과가 있었고, 나의 달팽이는 무작위 방향으로 작은 여백을 가르고있었습니다. 내가 말했어야만했던 것은 누군가가 왼쪽과 오른쪽 화살표 키를 누르지 만 내 달팽이는 모방하고 싶다는 것입니다. 현재 내가하고있는 일은 내가하고 싶은 것을 얻기 위해 코드 (두 번째 코드)를 조작하려고하는 것입니다. 다른 아이디어가 있다면, 나는 그들을 기쁘게 생각합니다. 그렇지 않다면, 해결책을 제시해 주셔서 대단히 감사드립니다! 그것은 많은 도움이되었습니다! :) – FireFoxxie

+0

업데이트 방법에서 입력을 확인하여 사용자가 키를 눌렀는지 확인하십시오 (예 : if (Input.GetKey (KeyCode.RightArrow)) MoveRight(); else if (Input.GetKey (KeyCode.LeftArrow)) MoveLeft(); MoveRight와 MoveLeft가해야 할 일 (기본적으로 달팽이의 transform.position 벡터 업데이트)을 이해하는 것은 당신에게 달려 있습니다. – stromdotcom

+0

(사실)은 코 루틴에서 끔찍한 생각이 아닙니다. 그러나, 당신은 코 루틴을 전혀 시작하지 않았습니다. 코 루틴을 시작하려면 StartCoroutine을 사용해야합니다. IEnumerator 메서드를 호출하면 아무 일도 일어나지 않습니다. – Bunny83

1

좋은 하루 내가 당신의 문제에 관계없이 모든 프레임에 호출되는 사용자의 업데이트 방법에서 대기 호출하는 것입니다 믿습니다 이전의 실행은 기다리기 전에 대기 호출 한 스레드 만이 다른 스레드가 대기 할 때 다시 호출 할 수 있음을 의미합니다.

이 시도 :

using UnityEngine; 
using System.Collections; 

private bool waiting = false; 

public class SnailMove : MonoBehaviour { 
void Start() 
{ 

} 
// Use this for initialization 
void Update() 
{ 
    if(waiting == false) 
    { 
     Waiting(); 
    } 
} 

// Update is called once per frame 
void Movement() 
{ 

    int direct = Random.Range(-1, 2); 
    if (direct == 1) 
    { 
     transform.Translate(Vector3.left * 1f * Time.deltaTime); 
     transform.eulerAngles = new Vector2(0,180); 
    } 
    if (direct == -1) 
    { 
     transform.Translate(Vector3.left * 1f * Time.deltaTime); 
     transform.eulerAngles = new Vector2(0,0); 
    } 
} 
    IEnumerator Waiting() 
    { 
    Movement(); 
    waiting = true; 
    yield return new WaitForSeconds (5); 
    waiting = false; 
    } 
} 

이 업데이트 기능을 다시 함수를 호출하기 전에 false로 설정 대기 부울 기다려야 할 것입니다.

+0

불행히도 나는 일하지 않았다. 그것은 나에게 나의 원래 코드와 같은 영향을 주었다. 그래도 업데이트 방법에 대한 사실을 지적 해 주셔서 감사합니다 :) – FireFoxxie

관련 문제