본문 바로가기
SBS아카데미/유니티

[Unity - TIL] Pillar와 Bee — Rigidbody, Is Kinematic, Constraints 완전 이해

by musukie 2025. 11. 5.

🎮 주제 : Pillar와 Bee — Rigidbody, Is Kinematic, Constraints 완전 이해

태그 : #Unity #Rigidbody #IsKinematic #Constraints #Trigger #Transform


📌 학습 요약

  • Rigidbody의 본질 : 오브젝트가 유니티 물리 엔진(Physics Engine)의 계산 대상이 되게 하며, 중력·관성·충돌 등의 물리 효과를 부여함
  • Is Kinematic의 활용 : 물리 엔진의 계산에서 제외시키고 스크립트(transform)를 통해 직접 위치와 회전을 제어하고자 할 때 사용함
  • Constraints와 제약 : 물리 연산은 유지하되 특정 축의 움직임이나 회전을 잠글 때 사용하며, Is Kinematic이 켜진 상태에서는 의미가 없음을 이해함
  • 오브젝트 구성 전략 : 고정된 감지체(Pillar)와 직접 이동하는 객체(Bee)의 컴포넌트 조합을 통해 효율적인 충돌 시스템 구축

🛠 주요 기능 및 구현 상세

1. 물리 엔진 개입 여부에 따른 이동 제어

  • 물리 제어 (OFF) : 중력, 마찰력 등 외부의 힘에 의해 자연스럽게 움직여야 하는 객체에 적합함
  • 직접 제어 (ON) : AI의 경로 이동, 카메라 연출 등 스크립트의 의도대로 정확히 움직여야 하는 객체에 적합함

2. Bee와 Pillar의 충돌 메커니즘

  • 감지 방식 : Pillar의 Collider를 Is Trigger로 설정하여 물리적 밀려남 없이 Bee의 진입만을 감지함
  • 삭제 로직 : OnTriggerEnter에서 태그 비교를 통해 타겟에 도달한 Bee를 즉시 제거하여 메모리 관리 및 연산 최적화

🛠 주요 코드 및 구현 설명

직접 이동 기반의 벌 AI (Bee.cs) - C#

using UnityEngine;

public class Bee : MonoBehaviour
{
    [SerializeField] float speed = 5f;
    [SerializeField] Transform target;

    void Start()
    {
        // 태그를 이용해 목표 지점(Pillar) 탐색
        GameObject pillar = GameObject.FindWithTag("Pillar");
        if (pillar != null)
            target = pillar.transform;
    }

    void Update()
    {
        if (target != null)
        {
            // 1. 목표 방향을 바라보게 회전
            transform.LookAt(target);
            
            // 2. 물리 엔진이 아닌 transform을 통한 직접 이동 (Is Kinematic 권장 구조)
            transform.position += transform.forward * speed * Time.deltaTime;
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        // 3. Pillar와 접촉 시 객체 제거
        if (other.CompareTag("Pillar"))
        {
            Destroy(gameObject); 
        }
    }
}

✅ 문법 및 개념 요약 정리

경우 계산

Is Kinematic = OFF 물리 엔진이 모든 힘(중력 등)을 계산하여 적용
Is Kinematic = ON 물리 엔진 계산 제외, transform으로만 제어 가능
Constraints 물리 연산 중 특정 축의 이동/회전을 고정함
LookAt 전달받은 Transform 방향으로 forward 축을 즉시 회전

 


✨ 느낀 점

  • 단순히 물체를 움직이는 기능을 넘어, 물리 엔진이 개입하는 시점과 제외되는 시점을 구분하는 것이 최적화의 핵심임을 깨달음
  • Is Kinematic이 켜진 상태에서 Constraints를 설정하는 것은 불필요한 연산 낭비임을 이해하여 컴포넌트 설정의 효율성을 높임
  • transform.forward와 Time.deltaTime의 조합이 물리 엔진 없이도 얼마나 일관된 이동을 보장하는지 체감함