이번 글은 이전에 작성한 포스팅에서 이어집니다.
이번 글에서는 캐릭터가 이동할 때 걷기 동작을 하고 발이 바닥에 닿는 순간 이벤트를 발생시켜 발소리를 재생하는 법에 대해 알아보도록 하겠습니다.
▶ 추가 준비물 - 사운드 에셋
발자국 소리를 내기 위해 추가로 사운드 에셋을 다운로드 받아 import 해주세요.
▶ 새로운 Animator 생성
Project 창의 Assets 폴더에서 마우스 우클릭 [Create > Animator Controller] 로 새로운 Animator Controller 를 생성하고 이름을 Hero 로 변경해줍니다.
Animator Controller "Hero" 를 Player 객체의 Animator 컴포넌트에 있는 Controller 필드에 다음과 같이 연결합니다. 잠시 비활성화 시켜 놓았던 Animator 도 다시 활성화시킵니다.
▶ Idle Animation
생성한 Animator Controller 인 Hero 를 더블 클릭하면 Animator 창이 열립니다. 아래와 같이 Animator 창에 [RPG Tiny Hero Duo] 에셋에 있는 "Idle_Normal_SwordAndShield" animation 을 등록합니다.
등록한 "Idle_Normal_SwordAndShield" State 를 클릭하고 Inspector 창에서 이름을 Idle 로 변경해 주세요.
▶ Move Animation
이번엔 아래와 같이 "MoveFWD_Normal_InPlace_SwordAndShield" 를 등록하고 이름을 Move 로 변경해 주세요.
▶ Parameter 생성
State 변환의 조건으로 사용할 파라미터를 등록합니다. 파라미터는 아래의 그림과 같이 Bool 형식으로 선택하고 이름을 ㅑIsMove 로 합니다.
▶ Transition 연결
Idle 을 선택하고 마우스 우클릭 [Make Transition] 을 선택한 후 Move state 를 선택합니다. 아래 이미지의 하단에 있는 Conditions 를 위에서 등록한 파라미터 IsMove 를 선택하고 true 로 선택합니다.
이렇게 하면 animation 상태가 Idle 일 때 IsMove 파라미터가 true 가 되면 Move state 로 변경됩니다.
이번엔 반대로 Move 를 선택하고 마우스 우클릭 [Make Transition] 을 선택한 후 Idle state 를 선택합니다. Conditions 에 파라미터 IsMove를 선택하고 false 를 선택합니다.
애니메이션이 Move 상태일 때 IsMove 파라미터가 false 가 되면 Idle state 가 됩니다.
▶ 애니메이션 이벤트 만들기
이제 발소리를 내기 위해 Move 애니메이션의 특정 프레임에 이벤트를 넣는 방법을 알아보도록 하겠습니다. Animator 창에서 Move state 를 더블클릭하면 Inspector 창에 다음과 같은 내용이 나타납니다.
먼저 Inspector 창의 화면이 좌측과 같다면 아래의 빨간 테두리 영역을 클릭해주면 오른쪽과 같이 바뀝니다.
우측의 1 번 영역을 좌우로 움직이면 애니메이션을 프레임 단위로 움직일 수 있습니다. 애니메이션을 움직이면서 다리가 땅에 닿는 부분에서 2번을 클릭하면 해당 프레임에 이벤트가 만들어지고 3번에 이벤트 이름을 입력하면 됩니다.
왼쪽 오른쪽 다리가 닿는 부분을 찾아 이벤트를 만들어주고 이름은 동일하게 FootStep 으로 해주세요. 작업을 완료하면 [Apply] 버튼을 클릭해 주세요.
▶ Player 스크립트 수정
Player 스크립트를 다음과 같이 수정합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
Vector3 destPos;
Vector3 dir;
Quaternion lookTarget;
bool move = false;
// Animator 컴포넌트
Animator anim;
// 발소리 오디오 클릭
public AudioClip footstep;
// Start is called before the first frame update
void Start()
{
// Animator 컴포넌트 가져오기
anim = GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
RaycastHit hit;
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit, 100f))
{
destPos = new Vector3(hit.point.x, transform.position.y, hit.point.z);
dir = destPos - transform.position;
lookTarget = Quaternion.LookRotation(dir);
move = true;
}
}
Move();
}
void Move()
{
if (move)
{
transform.position += dir.normalized * Time.deltaTime * 2f;
transform.rotation = Quaternion.Lerp(transform.rotation, lookTarget, 0.25f);
move = (transform.position - destPos).magnitude > 0.05f;
}
// IsMove 파라미터 값 설정
anim.SetBool("IsMove", move);
}
// FootStep 이벤트
void FootStep()
{
// 이벤트가 발생하면 발소리 사운드 재생
AudioSource.PlayClipAtPoint(footstep, Camera.main.transform.position);
}
}
▶ 발소리 Audio Clip 연결
다운받은 발자국 소리 에셋에 있는 사운드 파일 중 하나를 다음과 같이 Palyer 스크립트의 footstep 필드에 연결합니다.
이제 Play 를 하고 마우스로 바닥을 클릭하면 Move 애니메이션과 발소리가 들리면서 캐릭터가 이동하게 됩니다. 이동하지 않으면 Idle 애니메이션이 플레이 됩니다. 아래는 애니메이션 GIF 라 소리가 나지 않아 아쉽습니다.
'게임 프로그래밍 > 유니티 활용' 카테고리의 다른 글
[유니티 활용] NavMeshAgent 사용법 (Simple Monster AI) (26) | 2023.01.11 |
---|---|
[유니티 활용] Character Controller 로 캐릭터 이동과 점프 (22) | 2023.01.11 |
[유니티 활용] 마우스 클릭한 곳으로 부드럽게 바라보며 캐릭터 이동시키기 (16) | 2023.01.08 |
[유니티 활용] 3D 캐릭터를 UI 로 표시하는 방법 (10) | 2023.01.06 |
[유니티 활용] 간단한 포물선 궤적 그리기 (3) | 2023.01.05 |
댓글