Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
Archives
Today
Total
관리 메뉴

시작은 0부터

5. 코루틴(Coroutine), 자식 오브젝트 가져오기, Mathf.SmoothDampAngle 본문

Unity 학습일지

5. 코루틴(Coroutine), 자식 오브젝트 가져오기, Mathf.SmoothDampAngle

0base 2022. 8. 13. 01:49

코루틴(Coroutine)

: 스레드 형식은 아니지만 스레드처럼 딜레이를 주면서 메인 프로그램을 진행시킬 수 있다. 원리는 딜레이를 준 코루틴을 한번 돌고 > 메인 한줄 돌고 > 코루틴 한번 돌고... 를 빠른 속도로 처리하여 마치 다중 처리가 되는 것같은 효과를 준다.

 

형식은 다음과 같다.

StartCoroutine(A());



IEnumerator A();

{
	yield return new WaitForSeconds(1);
        a++;
}

StartCoroutine으로 코루틴함수인 IEnumerator 를 호출하면 호출한 시점에서 1초 뒤에 a++를 실행한다. 이때 1초를 지연시키는 동안 프로그램처리가 멈추는 것이 아니기 때문에 프로그램은 계속 동작하면서 코루틴함수를 설정한 시간값이 지난 이후에 실행하는 개념이다. 딜레이를 주고 싶을 때 간편하게 줄 수 있는 유니티 기능이다.

 

<코루틴 반환 형식>

 

yield break; 

// 코루틴 종료
            
yield return null; 

// 다음 프레임까지 대기

yield return new WaitForFixedUpdate(); 

// 다음 물리프레임까지 대기

yield return new WaitForEndOfFrame(); 

// 모든 렌더링작업이 끝날 때까지 대기

yield return new WaitForSeconds(float seconds); 

// 지정된 초 만큼 대기

yield return new WaitForSecondsRealtime(float seconds); 

// 지정된 초 만큼 대기

yield return StartCoroutine(IEnumerator routine); 

// 다른 코르틴이 끝날 때까지 대기

yield return new WWW(string url); 

// 웹 통신 작업이 끝날 때까지 대기

yield return new AsyncOperation; 

// 비동기 작업이 끝날 때까지 대기(씬로딩)

yield return WaitUntil(delegate함수); 

// delegate 함수의 내용이 만족할 때까지 (예:yield return new WaitUntil(() => <내용>);

yield return WaitWhile(delegate함수); 

// delegate 함수의 내용이 만족할 때까지 (예:yield return new WaitUntil(() => <내용>);

 

수요일부터 유니티로 슈팅게임을 만들어보면서 교수님께서 가르쳐주시고 필기해주신 내용이다. 딜레이를 주기 위해서 자주 쓰이는 기능인 만큼 숙지하도록 노력하고 가능한 만큼 응용해봐야곘다. 아직은 쓰는게 미숙해서인지 Time.deltaTime으로 시간값을 가져와서 그 값과 딜레이를 비교하는 식으로 딜레이를 주는 이전부터 쓰던 방법이 더 익숙하고 편한 느낌이다.

 

비활성화되어있는 자식오브젝트 활성화시키기

: GameObject.Find("ParentName").transform.Find("ChildName").gameObject.SetActive(true);

 

원래는 오브젝트를 찾을 때 GameObject.FindOfType<Component>().gameObject; 를 써서 해당 컴포넌트를 가진 오브젝트를 찾아서 그 오브젝트 안의 변수를 읽거나 썼다. 그리고 이 코드를 적용시키기 위해서 불필요한 오브젝트식별용 빈 코드를 만드는 비효율적인 방법을 썼는데, 굳이 그럴 필요가 없이 직접적으로 오브젝트의 이름을 찾아 가져올 수 있었다. 그리고 특정 부모오브젝트 안에 있는 자식오브젝트를 가져올 때는 Find로 먼저 부모 이름을 찾고 transform(이동).Find로 그 안의 자식오브젝트 이름을 찾을 수 있다. (원래는 자식 오브젝트 찾는 코드는 FindChild라는 보다 직관적인 이름이었으나 최신 버전에서 바뀌었다.)

 

이 기능을 찾게 된 경로는 슈팅게임을 만들면서 이펙트 기능을 구현할 때, 특정 트리거를 작동시 활성화되어있던 오브젝트를 비활성화하고, 비활성화되어있던 오브젝트를 활성화하는 식으로 이펙트 변화를 주려고 했는데, 비활성화되어 있는 오브젝트를 FindOfType으로 가져오려고 하니 가져와지지 않았다. 그래서 찾은 해결방안이 바로 Find였다. FindOfType은 비활성화되어있는 오브젝트의 컴포넌트를 찾을 수 없고, Find는 비활성화되어있어도 찾을 수 있었다.

 

Mathf.SmoothDampAngle(float a,float b,ref float c,float d);

:  부드럽게 기울기를 조절하는 기능이다. 교수님이 보여주신 예제 파일의 플레이어 스크립트 내부에 있던 기능인데, 실수 a 값은 현재, 실수 b값은 최대기울기값, ref c값은 현재 이동값, d가 부드럽게 기울어지는 속도다.

 

오늘은 적 오브젝트의 2 유형과 아이템을 만들었다.

적이 플레이어를 향해 다가오는 방식이며, 하나는 다가오면서 플레이어의 방향을 바라보며 총알을 발사하는 유형, 다른 하나는 플레이어를 향해 다가오며 총알을 발사하는 유형이다.  수차례의 시행착오 끝에 얼추 만들었다 싶었는데 X축값이 고정된 채로 플레이어를 바라보면서 쏘는 첫번째 유형의 총알이 가끔 이상한 위치에서 발사되는 문제가 발생하는데 아직 원인을 찾지 못했다. 진행하면서 원인을 찾아 해당 문제를 수정해야한다.