Unity | 2D | Effector 2D, Cinemachine Confiner, Animation

Clean·2025년 5월 21일

2D

목록 보기
1/4
post-thumbnail

오늘 배운 것

  • Effector 2D의 물리효과들

  • Cinemachine Confiner 2D로 카메라 영역 제한

  • Animator.Play(hash) 함수로 트랜지션없이 애니메이션 전환


Effector 2D의 물리효과들

Platform Effector

메이플스토리처럼 아래층에서 위로 점프할 때 위층을 통과하고,
착지하면 위층 플랫폼 위에 서있게 되는 이펙터다.

즉, 아래에서는 통과되고, 위에서는 막히는 단방향 플랫폼을 구현할 수 있다.


Surface Effector

무빙워크처럼 플랫폼에 서있는 오브젝트를 이동시키는 이펙터다.


Point Effector

중심점을 기준으로 오브젝트를 끌어당기거나 밀어내는 이펙터다.

  • IsTrigger를 체크해야함

Buoyancy Effector

Collider 영역 안에 들어온 오브젝트를 물 위에 둥둥 떠 있는 것처럼 해주는 이펙터다.

  • IsTrigger를 체크해야함

Area Effector

Collider 영역 안에 들어온 오브젝트를 바람처럼 일정한 방향으로 밀어내는 이펙터다.

  • IsTrigger를 체크해야함

Cinemachine Confiner 2D로 카메라 영역 제한

3D에서 Cinemachine 을 사용한 것처럼 2D 에서도 사용할 수 있다.

Add Extension 에서 Cinemachine Confiner 2D 를 선택하면 자동으로 컴포넌트가 추가된다.

Bounding Shape 2D 는 카메라가 나가지 못하게 하는 영역으로

Polygon 이나 Composite 콜라이더를 넣어야한다.


Bound (GameObject)
- Transform
- Rigidbody 2D
- Composite Collider 2D
ㄴ Box (GameObject)
	- Transform
    - Box Collider 2D

RigidbodyComposite 컴포넌트가 추가된 게임 오브젝트 자식으로

Box Collider 2D 를 추가한 오브젝트를 생성하고 Used By Composite 를 체크하고

Bound 오브젝트를 Cinemachine Confiner 2D 에 추가하면 된다.

그럼 사진과 같이 카메라가 저 영역 밖으로 나가지 못하게 할 수 있다.


또한 Virtual Camera 컴포넌트의 BodyFraming Transposer 를 선택하면

카메라의 offset도 조정할 수 있다.

[SerializeField] CinemachineVirtualCamera virtualCamera;
CinemachineFramingTransposer cinemachine;

void Start()
{
	cinemachine = virtualCamera.GetCinemachineComponent<CinemachineFramingTransposer>();
}

void PlayerInput()
{
	inputX = Input.GetAxis("Horizontal");
	if (inputX > 0)
	{
		sprite.flipX = false;
		cinemachine.m_TrackedObjectOffset = new Vector3(2, 0, 0);
	}
	else if (inputX < 0)
	{
		sprite.flipX = true;
		cinemachine.m_TrackedObjectOffset = new Vector3(-2, 0, 0);
	}
}

코드를 통해서도 offset을 조정할 수 있다.


Animator.Play(hash) 함수로 트랜지션없이 애니메이션 전환

Animator anim;
anim = GetComponent<Animator>();

readonly int IDLE_HASH = Animator.StringToHash("Idle");
readonly int WALK_HASH = Animator.StringToHash("Walk");
readonly int JUMP_HASH = Animator.StringToHash("Jump");
readonly int MOVEJUMP_HASH = Animator.StringToHash("MoveJump");

anim.Play(IDLE_HASH);
anim.Play(WALK_HASH);

지금까지 애니메이션 전환을 파라미터로 변경했었는데

HashCode를 사용하면 트랜지션없이 애니메이션을 즉시 변경할 수 있다.

Idle, Walk, Jump 에 사용하기에는 즉시 변경되서 어색한데

캐릭터가 죽거나 즉시 변경해야할 상황에 사용하면 좋을 것 같다.


0개의 댓글