[Unity3D] Character Controller 물체 충돌

oy Hong·2024년 5월 2일

장애물 밀기


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: 불연속 + 질량 무시 : 질량이 다른 오브젝트들을 같은 속도로 움직이고 싶을 때

0개의 댓글