7일차 요약(Layer, Physic Material, Animtion, Tag)
Layer
- 상호작용을 나타내는 preset이다.
- Layer 간 상호작용에 대한 설정도 할 수 있다.
Physic Material
- 물리적인 재질을 나타내는 Asset이다.
- 마찰력, 탄성 등 다양한 값을 가진다.
- 이는 게임상에서 물리적인 계산에 영향을 미친다.
Animation
- gameObject의 모든 속성을 시간에 맞게 움직이게 하는 Animation을 생성할 수 있다.
- 예를 들어, 이동, 회전, 스케일 등 기본적인 동작도 가능하며 소리의 크기나 pitch 등 역시 조절할 수 있다.
- Animation을 만들 때, 녹화를 켜두고 원하는 값들을 조정해도 되지만, Key를 수동으로 생성하는 게 좋다고 생각한다.(실수 방지)
- Animation을 만들 때, 되도록이면 최상위 부모에 생성하는 것이 좋다.
- 다른 Component를 같이 제어할 수 있기 때문이다.
- Animation을 생성하면 Animator도 자동으로 같이 생성된다.
- Animation은 자동으로 Loop설정이 되어 있다. (Inspector로 설정 가능)
- Animator는 Animation의 상태를 나타내는 VisualScripting 툴이다.
- Animation에서 특정 시점에 Event를 발생하는 것이 가능하다.(AnimNotify)
- 하지만, 바인딩된 함수를 체크하는 것이 번거로워 사용하지 않는 것을 권장한다.
- Script에서 Animation을 실행하는 것이 가능하다.
- Animator의 Parameter를 Script에서 변경하면 이에 맞게 Animator가 State 간 전이를 수행한다.
- State → State: Transition (각 Transition에는 Condition을 설정할 수 있다.)
Tag
- Object를 구별할 수 있는 식별자이다.
- Object를 구별하는 방법으로는 타입, 이름 등 다양한 방법이 있지만 설정이 간편하고 이를 지원하는 함수도 만들어져 있어 적극 사용하는 것이 좋아 보인다.
Layer
Layer란 상호작용에 대한 preset을 설정하는 것이다.
예를 들어, 특정 물체에 대해서 Raycast가 적용되지 않도록 만들고 싶다.
만약, 이런 물체가 여러 종류라면 각 물체마다 Raycast를 무시하는 설정을 해줘야 할 것이다.
그러한 물체들의 Layer를 Ignore Raycast로 설정한다면 Raycast를 무시하도록 설정할 수 있다.
각 Layer들 간의 작용을 설정할 수도 있다.
Physic Material
물리 연산에 대한 설정을 할 수 있는 Material이다.
움직이는 대상에 대한 마찰, 멈춘 물체에 대한 마찬, 탄성 등을 설정할 수 있다.
Animation
애니메이션을 실행하는 Animation Component가 존재하지만 지금은 사용하지 않는다.
대신 Animator를 이용하여 관리한다.
Animation을 만들 때, 최상위 객체에서 진행하는 것이 좋다.
최상위 객체에서는 다른 자식 Object를 제어할 수 있지만, 자식에서는 다른 자식에 접근할 수 없기 때문이다.
녹화를 누른 뒤, 값들을 조정해도 되지만 실수할 여지가 있기 때문에 Property와 Key를 수동으로 추가해도 된다.
Animation을 만들면 기본적으로 Loop로 실행된다.
Inspector를 조정하여 Loop설정을 할 수 있다.
Animation 실행 중 Event를 발생시켜 script를 실행하는 것도 가능하다.
표시된 버튼을 누르면 Event를 생성할 수 있다.
파란색으로 표시된 부분이 생겨난 Event를 나타내는 것이다.
Event를 누르면 다음과 같은 창을 확인할 수 있다.
Function에서 자신이 소유한 Script의 함수들을 확인하여 적용할 수 있다.
반대로 Script에서 해당 Animation을 실행하도록 하는 것도 가능하다.
Animation은 Animator를 통해 관리되기 때문에 다른 Script에서 Animator를 참조하여 실행을 요청하면 된다.
Animator doorAnim;
doorAnim.SetTrigger("파라미터 이름");
위와 같이 동작하기 위해서는 Animator에서 State설정을 해줘야 한다.
처음 Animator에 들어가면 Door라는 State가 Default로 설정되어 있다.
따라서, 에디터에서 실행하면 Animation이 자동으로 시작된다.
이를 Trigger 되었을 때만 동작하도록 하기 위해 Empty State를 만들어 Default로 설정해 준다.
그리고 Parameter를 만들어 실제 Door Animation을 제어할 수 있다.
State에서 다른 State로 전환하는 것을 Transition이라고 한다.
Transition에는 Parameter로 조건을 제어할 수 있다.
지금의 경우 Entered라는 이름의 Trigger Parameter가 발동하는 순간 Any State에서 Door로 이동하여 Door State의 Animation을 실행한다.
정리하자면, 문을 열고 닫는 Animation을 올바르게 적용하기 위해서는 다음과 같이 설정하면 된다.
- Animator 설정
AnyState → Open | AnyState → Close |
Enter, Leave라는 이름의 Trigger Parameter를 만들어 각가 Open, Close State에 Transition Condition으로 설정한다.
Close Animation은 따로 구현할 필요 없이 재생속도를 -1로 설정하면 reverse로 동작한다.
- Script 처리
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DoorEvent : MonoBehaviour
{
public Animator doorAnim;
public void OnTriggerEnter(Collider other)
{
doorAnim.SetTrigger("Entered");
}
public void OnTriggerExit(Collider other)
{
doorAnim.SetTrigger("Leaved");
}
}
추가적으로 Player Character에게만 TriggerEvent로 문을 여는 Animation을 적용하기 위해서는 OnTriggerEnter/OnTriggerExit 함수에서 other이 Palyer인지 확인하는 과정이 필요하다.
Tag를 활용하면 간단하게 구현할 수 있다.
Character에 Player라는 Tag를 부착한 뒤, 다음과 같이 Script를 처리하면 된다.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DoorEvent : MonoBehaviour
{
public Animator doorAnim;
public void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
doorAnim.SetTrigger("Entered");
}
}
public void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
{
doorAnim.SetTrigger("Leaved");
}
}
}
Tips
- RigidBody를 둥근 물체로 설정할 경우 충격에 의해 회전하여 넘어지거나 뒤지어질 수 있다.
- 이를 방지하는 방법은 회전에 대해 Freeze를 적용하는 것이다.