유니티 애니메이션의 특징
키프레임 기반의 애니메이션 시스템
- 키프레임은 특정 시간에 오브젝트의 상태, 속성(위치, 회전, 크기, 색상 등)을 정의하는 핵심 프레임으로, 유니티는 자동으로 중간 프레임을 보간하여 부드러운 움직임을 표현합니다.
- 애니메이션 타임라인을 통해 특정 시간에 키프레임을 삽입한 다음 애니메이션 커브 편집기에서 키프레임 간의 보간을 제어합니다. 여기서 필요에 따라 선형, 2차 곡선, 계단 등 다양한 보간 방식을 선택할 수 있습니다.
- 그리고 키프레임의 시간적 위치와 값을 정확히 조정합니다. 마지막으로 키프레임이 올바르게 동작하는지 미리 보기를 통해 확인하고 필요에 따라 조정을 수행합니다. 이를 통해 복잡한 움직임도 정확하게 표현하여 정교한 애니메이션을 구현할 수 있습니다.
C#을 이용한 프로그래밍 기반 애니메이션
- 스크립팅을 통해 사용자는 애니메이션의 객체 제어, 이벤트 처리, 상호작용, 물리 시뮬레이션, AI 행동 패턴, 사용자 상호작용 등 애니메이션의 복잡한 동작로직을 직접 구현할 수 있습니다.
- 유니티의 애니메이션 스크립팅 기능은 사용자의 창의력과 프로그래밍 능력을 기반으로 애니메이션 기능을 더욱 확장하며 생동감 있고 역동적인 애니메이션을 만들어낼 수 있습니다.
모션 캡처 기술 지원
- 모션 캡처 - 실제 사람이나 동물의 움직임을 디지털 데이터로 포착하여 3D 모델에 적용하는 기법
- 외부 모션 캡처 장비와의 호환성을 제공하고 다양한 데이터 포맷과 소프트웨어와의 연동을 지원합니다.
- 모션 캡쳐 데이터를 사용자가 직접 보정 및 편집하여 세부적으로 조정하고, 이를 캐릭터에 적용하여 생동감 넘치고 자연스러운 애니메이션을 원활하게 구현할 수 있습니다.
물리 시뮬레이션과 연계하여 보다 실제적인 움직임과 상호작용을 표현
- 유니티의 강력한 물리 시뮬레이션 기능을 활용하여 중력, 충돌, 관성 등 다양한 물리 법칙을 적용하고, 질량, 탄성, 마찰력 등 물체의 물리 속성을 조정하여 실제와 같은 움직임을 구현할 수 있습니다.
- 사용자는 프로파일링 도구를 통해 물리 연산의 성능을 분석하고 개선할 수 있으며, 플랫폼 및 하드웨어에 맞는 설정으로 물리 시뮬레이션을 최적화할 수 있습니다.
- 복잡한 물리 기반 애니메이션도 원활하게 구동될 수 있도록 지원하여 애니메이션에 생동감과 사실감을 더할 수 있습니다.
캐릭터 애니메이션
캐릭터 발소리 컴포넌트 만들기
- 프리팹(MyCharacter) > Add Component > Audio Source > AudioClip에 원하는 발자국 소리를 드래그하여 삽입
- 프리팹 > Add Component > FootController (New script) 작성 > 이전에 설정한 Audio Source를 연결
- OnFoot 함수가 실행될 때마다 AudioSource가 재생되도록 함.
public class FootController : MonoBehaviour
{
public AudioSource FootSoundSource;
public void OnFoot()
{
if(FootSoundSource != null)
FootSoundSource.Play();
}
}
애니메이터 컨트롤러 설정하기
- Project창에서 마우스 오른쪽 클릭 > Create > Animator Controller 선택 > MyCharacterAnimController.controller > Open
- 마우스 오른쪽 버튼 > Create State > From New Blend Tree
- 'Blend Tree'에 대고 마우스 오른쪽 버튼 > Set as Layer Default State를 선택
- 'Blend Tree' 더블클릭 > Inspector창의 Motion List "+"버튼을 클릭하여 모션필드를 추가 (Add Motion Field)
- 파라미터에 Float Speed 추가
- anim 파일을 모션필드에 드래그하여 연결
public class CharacterController_Me : MonoBehaviour
{
// 이동하는 방향에 대한 변수
private Vector3 MoveDirection;
// 회전하는 방향에 대한 변수
private Vector3 RotDirection;
...
void Update(){
MoveDirection = Vector3.zero;
RotDirection = Vector3.zero;
float Vertical = Input.GetAxis("Vertical");
float Horizontal = Input.GetAxis("Horizontal");
MoveDirection = transform.forward * Vertical;
RotDirection = transform.right * Horizontal;
GetComponent<Animator>().SetFloat("Speed", Vertical);
//GetComponent<Animator>().SetFloat("Speed", GetComponent<Ridgidbody>().velocity.magnitude);
//GetComponent<Animator>().SetFloat("Speed", MoveDirection != Vector3.zero ? 1.0f : 0.0f);
}
...
}
✏️Input Manager : Vertical(수직이동) Horizontal(수평이동) 키는 인풋매니저에서 관리할 수 있다.
Gravity : 조이스틱이 돌아오는 속도
캐릭터 애니메이션 설정하기
- Ctrl+6 또는 Window > Animation > Animation
- 애니메이션이 있는 오브젝트를 클릭하면 해당 오브젝트의 애니메이션을 움직임 단위로 볼 수 있다.
- 원하는 타이밍에 Add Animation Event를 하여 특정 함수가 실행되도록 지정할 수 있다.
- Add Animation Event > FootController > Methods > OnFoot()이 실행되도록 지정.
자료🔍 변수명 짓기 규칙
https://blog.unity.com/kr/engine-platform/clean-up-your-code-how-to-create-your-own-c-code-style
자료🔍 벡터, 쿼터니언
Vector3.RotateTowards()
⇒ https://docs.unity3d.com/ScriptReference/30_search.html?q=rotatetowards
Quaternion.LookRotation()
⇒ https://docs.unity3d.com/ScriptReference/Quaternion.LookRotation.html
보석 획득시 효과 만들기 (트리거 활용)
⑴ 에셋스토어 무료 에셋 추가하기
에셋스토어 구매 > Unity에서 열기
또는 Window > Package Manager > My Assets > Download > Import
- 보석 에셋 - https://assetstore.unity.com/packages/3d/props/simple-gems-ultimate-animated-customizable-pack-73764
- 사운드 에셋 - https://assetstore.unity.com/packages/audio/sound-fx/rpg-essentials-sound-effects-free-227708
- 파티클 이펙트 에셋 - https://assetstore.unity.com/packages/vfx/particles/spells/magic-effects-free-247933
- fire이펙트 에셋 - https://assetstore.unity.com/packages/vfx/particles/fire-explosions/procedural-fire-141496
⑵ 태그 Jewelry 설정 + 트리거 체크하기
- Assets > AurynSky > Gems Ultimate Pack > Prefabs > Diamondo5side 프리팹 복제 (ctrl+D) > 이름 변경(F2) Diamondo_Score > Open 편집
- 프리팹에 Add Component > Sphere Collider 컴포넌트 추가 > is Trigger 체크
Tip👍:: Inspector창의 자물쇠를 잠가두면 Project창에서 다른 파일을 눌러도 Inspector창이 변경되지 않는다.
- Assets > AurynSky > Gems Ultimate Pack > Materials에 있는 Red material을 Diamondo_Score 프리팹에 드래그한다.
⑶ 보석 이펙트 설정하기
public class ScoreEffectScript : MonoBehaviour
{
public GameObject HitEffect; //내 오브젝트가 나타날때 나타날 효과
public void OnHit()
{
//내 오브젝트가 있는 곳에 HitEffect게임오브젝트를 스폰한다.
GameObject.Instantiate(HitEffect, this.transform.position, Quaternion.identity);
//내 오브젝트를 삭제한다.
GameObject.Destroy(this.gameObject);
}
}
⑷ 보석 사운드 설정하기
캐릭터가 "Jewelry" 태그를 가진 트리거에 닿으면 해당 오브젝트의 ScoreEffectScript의 OnHit()를 실행한다.
public class CharacterController_Me0605 : MonoBehaviour
{
...
void OnTriggerEnter(Collider other)
{
Debug.Log(other);
if (other.gameObject.CompareTag("Jewelry"))
{
other.gameObject.GetComponent<ScoreEffectScript>().OnHit();
}
}
}
💡질문 :: CollisionEnter와 TriggerEnter의 차이점이 뭔가요?
⇒ CollisionEnter는 콜라이더를 가진 두 게임오브젝트가 충돌할 때 실행한다. 그리고 TriggerEnter는 두 게임오브젝트 콜라이더 중 하나 이상이 트리거 콜라이더일때 실행된다. 트리거충돌은 오브젝트간 물리적 연산이 이루어지지 않으며 오브젝트에 가로막히지 않고 통과한다.
🧑🏫강사님 추가 코멘트 :: 오브젝트 풀링 (메모리 풀링)
모바일 게임에서 여러 오브젝트를 관리할 때 오브젝트풀링을 쓰지 않으면 가비지콜렉터가 돌아서 셰이더 버벅임(히칭hitching)을 방지할수가 없습니다. 오브젝트 풀링(메모리 풀링)은 비슷한 오브젝트를 만들어내는 유니티식 메모리 할당이라고 이해하면 편합니다. 자주 패치하는 모바일 게임에서는 패치데이터를 다룰 때 어드레서블을 사용해 인스턴시에이트를 쓰는 기법 활용하기도 합니다.
+) 보통은 여러 프리팹을 꺼내놓지 않고 데이터를 엑셀/csv로 설정하여 필요한 부분만 로드해서 사용합니다만 이에 대해서는 최적화 시간에 다루도록 하겠습니다.
'UNITY > 유니티게임스쿨' 카테고리의 다른 글
유니티 UI 이해 :: UI 스프라이트, 한글폰트 설정, 버튼 작성하기 (1) | 2024.06.10 |
---|---|
Unity 비동기 프로그래밍 :: Node.js 설치, 간단한 비동기 서버 구축 (0) | 2024.06.07 |
[유니티게임스쿨 TIL] C# 기초 문법 이해 :: 파일 입출력, Collection, LINQ (0) | 2024.06.04 |
[유니티게임스쿨 TIL] 유니티 기본 :: 프리팹과 오브젝트, 캐릭터 이동, 점프 기능 추가하기 (1) | 2024.06.03 |
[유니티게임스쿨 TIL] 유니티 기본 :: 유니티 설치와 인터페이스 이해 (0) | 2024.05.31 |