Character Controller와 물리 시스템을 이용하여 장애물을 밀어내는 방법에 대해 알아보자.
적당한 상자에 RigidBody 컴포넌트를 추가하고 씬을 구성한다.

Character Controller의 충돌 감지 메서드를 활용하여 상자를 밀어보자.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObstaclePush : MonoBehaviour
{
public float forceMagnitude = 1;
// Character Controller가 충돌하며 호출되는 메서드
private void OnControllerColliderHit(ControllerColliderHit hit)
{
// 부착된 리지드바디 캐싱
Rigidbody rigidbody = hit.collider.attachedRigidbody;
if(rigidbody != null)
{
// 힘을 줄 방향은 캐릭터 정면
Vector3 forceDirection = hit.gameObject.transform.position - transform.position;
// y축은 배제
forceDirection.y = 0;
forceDirection.Normalize();
// 특정 위치에서 힘을 가하는 메서드
rigidbody.AddForceAtPosition(forceDirection * forceMagnitude, transform.position, ForceMode.Impulse);
}
}
}
Rigidbody.AddForceAtPosition
public void AddForceAtPosition (Vector3 force, Vector3 position, ForceMode mode= ForceMode.Force);
지정된 위치에서 물리적인 힘을 가하는 함수
ForceMode.Force: 연속 + 질량 적용 : 현실적인 물리 현상
ForceMode.Accel: 연속 + 질량 무시 : 오브젝트 질량 관계 없이 가속
ForceMode.Impulse: 불연속 + 질량 적용 : 폭발이나 충돌과 같은 짧은 순간의 힘
ForceMode.VelocityChange: 불연속 + 질량 무시 : 질량이 다른 오브젝트들을 같은 속도로 움직이고 싶을 때