티스토리 뷰

오늘은 유니티에서 랜덤한 움직임을 나타내는 방법을 알아보려고한다.

 

랜덤 움직임이 사용되는 예시는 주로 아래와 같다

1. 적이나 사물들이 평소에 어슬렁 거리며 돌아다니는 것을 표현

2. 이펙트를 주기위한 화면 흔들기

 

랜덤 움직임을 사용하기 위해서는 아래의 기능들이 사용된다.

1. 반복하기 

2. 랜덤하게 방향 설정하기

3. 해당 방향으로의 이동하기


Coroutine 이해하기

1. Cotoutine이란

Cotoutine은 일단 오브젝트이다. 그리고 그 안에서 코드를 제어할 수 있다.

Cotoutine이 작동하는 원리는 아래 그림을 보면 된다.

코루틴은 오브젝트이다!

Coroutine의 역할은 IEnumerator라는 인터페이스에 담긴 내용을 "실행"하는 것이다.

 

여기에는 몇가지 의미가 있는데

  • 기본적으로 스크립트의 코드가 수행되는 Update()와 독립적으로 코드를 수행
  • Coroutine이 만들어 지면 없애지 않는 이상 계속 남아있음!

IEnumerator는 yield return yield break로 코드를 조정할 수 있다.

 


IEnumerator에 실행할 코드 작성하기

IEnumerator는 인터페이스다 / 다른 일반적인 클래스와는 다르게

값을 반환할때 yield return이라는 코드를 사용하며, 반드시 적어야 IEnumerator안에 있는 코드가 정상 작동 한다.

 

내가 구현 하고 싶었던 것은 

  1. 일정 시간동안 같은 방향으로 이동하다가
  2. 시간이 지나면 방향을 전환하여 이동
IEnumerator BasicMove(float interval, float speed){ #인자로 움직임 주기와 속도를 받아옴
    while(true){
        int x = Random.Range(-1, 1); # X방향 랜덤
        int y = random.Range(-1, 1); # Y방향 랜덤
        
        yield return new WaitForSeconds(interval);
        Vector3 targetPosition = new Vector3(x, y, 0);
        transform.position = Vector3.translate(targetPosition*speed)
    }
}

 

IEnumerator에 있는 코드를 실행하는 Corountine을 만드는 방법은 StartCoroutine() 함수를 사용하면 된다.

만약 StartCoroutine()을 Update()함수에 넣어서 실행 한다면

프레임마다 Corountine오브젝트가 계속 만들어지는 것이기 때문에 반복효과를 제대로 낼 수 없다

 

따라서 StartCoroutine()은 대부분 Start()함수에 넣어서 한개의 코루틴이 시작되도록 한다.

 

위의 코드를 실행하면 ㅋㅋㅋ 그냥 순간이동 해버리는 결과가 나왔다... ㄷㄷㄷ

나는 스무스하게 나아가길 바란다.

 

RigidBody2D의 velocity를 활용하는 방법도 있지만,

나는 RigidBody를 싫어하기 때문에 (무거워서) 최대한 RigidBody를 사용하지 않고 구현할 방법을 생각해 봤다.

 

그래서 일단 Update에서는 이동만! 

Corountine에서는 방향만!

 

정해보기로 했다.


void Start(){
	StartCoroutine(GetDirection(interval, targetPos);
}

void Update(){
	transform.position += targetPos * speed * Time.deltaTime;
}

IEnumerator GetDirection(float interval, Vector3 targetPos){ #인자로 움직임 주기를 받아옴
    while(true){
        int x = Random.Range(-1, 2); # X방향 랜덤 (-1, 0, 1)반환
        int y = random.Range(-1, 2); # Y방향 랜덤 (-1, 0, 1)반환
        yield return new WaitForSeconds(interval);
        targetPos = new Vector3(x, y, 0);
    }
}

 

그랬더니 잘 움직이게 되었다 :)

 

끝.


참고사이트

https://blog.naver.com/an_4_gel/222800779599

 

[Unity] 유니티 코루틴(Coroutine) 사용법에 관하여!!

이번 시간에는 코루틴(Coroutine) 사용방법에 대해서 알아보겠습니다. 1.코루틴 언제 쓰이는가? 코드가 반...

blog.naver.com

 

 

 

 

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함