To Paint a World

RPG Extreme - 2 본문

3D Engine/Unity

RPG Extreme - 2

Polariche 2025. 5. 1. 14:21

간단한 캐릭터 애니메이션 (대기, 걷기) 와 레벨 시스템을 구현하였다

 

구현

플레이어의 걷기 동작에는 다음 로직이 구현되어야 한다.

1. 걸어갈 위치를 선정한다

2. 걷는 동안엔 플레이어의 입력을 무시한다

3. 걷기 애니메이션을 재생한다

4. 일정 시간동안 목적지까지 걸어간다 

    public async Awaitable MoveForwardAnim()
    {

        const float duration = 0.2f;
        float deltaTime = 0.0f;

	// 1. 걸어갈 위치를 선정한다
        Vector3 direction = transform.forward;
        Vector3 curPos = transform.position;
        Vector3 targetPos = curPos + direction;

	// 2. 걷는 동안엔 플레이어의 입력을 무시한다
        lockMovement = true;
        
	// 3. 걷기 애니메이션을 재생한다
        animator.SetBool("walking", true);

	// 4. 일정 시간동안, 목적지까지 걸어간다
        while (deltaTime < duration)
        {

            await Task.Delay(TimeSpan.FromSeconds(Time.deltaTime));
            deltaTime += Time.deltaTime;
            transform.position = curPos + (targetPos - curPos) * (deltaTime / duration);
        }

        lockMovement = false;
        animator.SetBool("walking", false);
    }

 

 

Animator 에 walking parameter 를 입력하고, idle 과 walking 사이의 transition 조건으로 설정하였다

 

 

목표 타일 위치에 실제로 걸어갈 수 있는지는 GameManager 가 맵을 보고 결정한다. 만약 걸어갈 수 있는 타일이라면, 플레이어의 걷기 동작을 await 으로 호출한다.

	// if we can actually step onto the tile
            if (newTile.GetComponent<TerrainComponent>().CanStep())
            {
                await player.GetComponent<PlayerController>().MoveForwardAnim();

                x = nx;
                y = ny;

                currentTile = newTile;
            }

 

 

 

궁금증

현재 코드에서는 "걷기" 동작 재생 시간을 코드에서 설정하고, 애니메이션 재생은 Animator 의 변수값 조정을 통해 

그러다보니 실제 애니메이션의 재생 시간과는 잘 맞지 않는다

싱크를 맞출 수 있는 방법이 있을까?

 

A1. 애니메이션 클립 자체에 Animation Event 을 달아주어, 애니메이션 종료 시점 때 특정 코드를 호출한다.

       -> 단점: 종료 처리용 코드를 따로 작성하고 관리해주어야 한다
                    액션 게임의 회피 프레임 / 패링 가능 프레임 등을 구현할 게 아니면, 굳이? 싶은 작업량이다

A2. Animation.Play 를 활용한다. 

       -> 단점: Animation 컴포넌트를 달아야 하며, 이는 Animator 컴포넌트와 호환되지 않는다.

A3. Animator.speed 를 조절한다

       -> 단점: 애니메이션 클립마다 적절한 speed 를 테스팅해가며 찾아야 한다

 

A1과 A2 의 장점을 합쳐서 Animation 의 시작과 끝을 함께하는 coroutine 같은 코드를 만들어서, 이를 await 하는 것이 사용하기에 가장 편리할 것 같다.

 

 

기타 이슈 해결

유니티 버전 6 으로 업그레이드 (Awaitable API 를 쓰기 위함)

Q. Unity 6 로 재 임포트했더니 material / 조명 등이 이상해짐… 어떻게 고치지?

 

 

A. Windows > Rendering > Lighting 탭을 열어서 Scene > Generate Lighting 버튼을 클릭한다

 

Environment > Sun Source 에 scene 에 있는 light 을 배정해준다

 

 

'3D Engine > Unity' 카테고리의 다른 글

ILSPY 로 유니티 게임 뜯어보기  (0) 2025.05.01
RPG Extreme - 1  (0) 2025.04.07
Elden Ring in Unity - Episode 2  (0) 2025.03.31
Elden Ring in Unity - Episode 1  (0) 2025.03.31
VR 게임 아바타 설정 및 녹화 방법  (1) 2024.12.12