부트캠프

[멋쟁이사자처럼 유니티 TIL] 에셋을 통한 애니메이션 구현과 비동기 프로그래밍(코루틴, async, await)

맛난과자 2024. 6. 5. 22:28

유니티 실습

 

현재 사용하고 있는 무료 에셋 :

https://assetstore.unity.com/packages/3d/characters/unity-chan-model-18705

 

Unity-Chan! Model | 3D 캐릭터 | Unity Asset Store

Elevate your workflow with the Unity-Chan! Model asset from unity-chan!. Find this & other 캐릭터 options on the Unity Asset Store.

assetstore.unity.com

 

 

애니메이션 구현

오늘은 에셋에 포함되어 있는 걷는 모션을 구현해보았다.

 

① 에셋의 애니메이션에서 원하는 애니메이션을 선택한 후 ctrl + D를 눌러 복제한다.

수업에서는 앞으로 뛰는 모션, 기다리는 모션, 뒤로 걷는 모션 3개를 골랐다.

세모 아이콘이 애니메이션이다

 

애니메이션 보는 법

해당 모션을 클릭하면 인스펙터 창에 재생 버튼이 있는 창이 뜰 것이다.

(안 보일 경우, 인스펙터 맨 밑에 숨겨져 있는 것이다. 해당 모션이 적혀져 있는 줄을 위로 끄집어내자)

재생 버튼을 클릭하면 모델이 애니메이션대로 움직일 것이다.

 

모델 바꾸는 법

동그라미 친 부분 클릭

사람 모양 아이콘을 누르고 other...을 누른 뒤 원하는 모델을 선택하면 된다.

 

② Animations 폴더에 복제한 애니메이션들을 보관할 새로운 폴더를 만든다. (선택사항)

 

③ 플레이어의 Animator 컴포넌트의 Controller를 클릭하여 Animator 창으로 들어간다.

 

④ Creat State -> From New Blend Tree 를 눌러 새로은 스태이트를 생성한다.

(다른 스태이트 이미 있어서 모두 지운 후 진행하였다)

 

⑤ Blend Tree를 클릭 후 인스펙터 창의 Motion에 복제해둔 애니메이션들을 등록한다.

 

⑥ Threshold 와 속도를 원하는 대로 조정한다.

 

Threshold : 애니메이션의 그래프 상의 위치

위의 사진에서는 Speed가 -0.3~0.3 값 사이에서만 움직이고,

-0.3~0 값에서는 WALK00_B 와 WAIT00가, 0~0.3 값에서는 WAIT00 와 RUN00_F 가 겹치게 된다.

 

⑦ 플레이어에 새로운 스크립트를 추가한다.

 

⑧ AudioSource 변수를 public으로 선언하고, 오디오 소스를 재생하는 함수를 생성한다.

 public AudioSource FootSoundSource;
 public void OnFoot()
 {
     if ( FootSoundSource != null)
     {
         // 오디오 소스 재생
         FootSoundSource.Play();
     }
 }

 

⑨ 애니메이션을 클릭하여 애니메이션 창에 들어간 후,

소리가 들어가길 원하는 초를 클릭하여 흰 선을 놓은 뒤, 'Add Event' 버튼을 누른다.

 

⑩ Function 에 방금 작성한 함수를 선택한다.

 

 

결과

 

걷는 모션과 함께 소리가 난다

 


 

 

유니티 이론

비동기 프로그래밍

: 성능 저하 방지, 긴 작업 병렬로 실행하여 게임의 프레임 속도 유지에 사용하는 프로그래밍 기법이다.

 

 

1) 코루틴

 

반 비동기. 가볍게 사용하는 비동기 프로그래밍.

IEnumerator를 반환하고 StartCoroutine 메소드를 사용하여 시작한다.

float waitTime = 0.1f;

void Start()
{
    // 코루틴 시작
    StartCoroutine(TestCoroutine());
}

IEnumerator TestCoroutine()
{
    // 대기
    yield return new WaitForSeconds(waitTime);
    
    Debug.Log("Coroutine done.")
}

 

● StartCoroutine : 코루틴을 시작한다.

● yield return null: 한 프레임 후 다음 코드 실행

● yield return new WaitForSeconds() : 몇 초 뒤에 다음 코드 실행

 

현재는 async 말고 코루틴만으로 포폴을 만들어도 충분하다고 하셨다.

 

 

2) async 와 await

 

앞에서 main을 실행할 동안 뒤에서 다른 것을 실행한다.

주로 게임 중 로딩이나, 보스전 직전 보스 소개 등에 쓰인다.

 

비동기할 함수에 async 를 붙이고,

함수 안 코드 앞에 await Task.Run(() => 실행할 함수); 를 작성하면 된다.

async void TestRun()
{
    await Task.Run(() => TestAsync());

    Debug.Log("AsyncFinish");
}

void TestAsync()
{
    for (Int64 i = 0; i < 50000000000; i++)
    {
        // 실행 코드
    }
}
float startTime = 0.0f;
void Start()
{
    startTime = Time.realtimeSinceStartup;
    TestRun();
    Debug.Log("AsyncFinish");
    // main 실행 하는 동안 뒤에서 다른 동작을 하는 것
}

 

 


 

고찰

취업 준비 개발자의 고충이라는 에셋을 다루는 법을 알게되어 좋은 것 같다.

확실히 에셋을 잘 사용하지 못했던 예전에 비해 작업물의 때깔(?)도 좋아지고,

2D에서 벗어나 견문이 넓어진 것 같아 좋다.

 

비동기 프로그래밍에 대해 아직 잘 이해하지 못했다.

내일이 휴일이니 비동기 프로그래밍과 코루틴, async와 await에 대해 자세히 알고 가야겠다.