본문 바로가기
UNITY/유니티게임스쿨

[유니티게임스쿨 TIL] 유니티 기본 :: 캐릭터 애니메이션 설정하기, 트리거 활용하기

by 램플릿 2024. 6. 5.

유니티 애니메이션의 특징


키프레임 기반의 애니메이션 시스템

  • 키프레임은 특정 시간에 오브젝트의 상태, 속성(위치, 회전, 크기, 색상 등)을 정의하는 핵심 프레임으로, 유니티는 자동으로 중간 프레임을 보간하여 부드러운 움직임을 표현합니다.
  • 애니메이션 타임라인을 통해 특정 시간에 키프레임을 삽입한 다음 애니메이션 커브 편집기에서 키프레임 간의 보간을 제어합니다. 여기서 필요에 따라 선형, 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 : 조이스틱이 돌아오는 속도

Edit > Project Settings > Input Manager > Vertical, Horizontal



 

캐릭터 애니메이션 설정하기

  • 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

 

 

⑵ 태그 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로 설정하여 필요한 부분만 로드해서 사용합니다만 이에 대해서는 최적화 시간에 다루도록 하겠습니다.