게임프로그래밍/Unity_C#

[MMORPG 게임 개발(C#, Unity)] Part 3. Collision(충돌)

shine94 2025. 4. 20. 22:27

* 해당 글은 게임 프로그래머 입문 올인원 강의를 보고 정리한 글입니다

   https://www.inflearn.com/roadmaps/355#introduce

 

MMORPG 게임 개발, 켠김에 끝판왕까지! (유니티 + C#) 로드맵 - 인프런

C#, Unity 스킬을 학습할 수 있는 게임 개발 로드맵을 인프런에서 만나보세요.

www.inflearn.com

 

 

 

 

* Physics Simulation

   현실 세계의 물리 법칙을 컴퓨터로 흉내내는 것

 

* 대표적인 물리 요소들

   중력(Gravity)

   물체가 아래로 떨어지는 힘

   마찰(Friction)

   물체가 움직일 때 저항하는 힘

   충돌(Collision)

   물체끼리 부딪혔을 때 반응

   탄성(Elasticity)

   튕김 효과

   질량(Mess)

   무게가 클수록 힘을 더 받아야 움직임

   관성(Inertia)

   가만히 있던 건 계속 가만히 있고, 움직이던 건 계속 움직이려는 성질

 

* Rigidbody

   물리 연산을 적용하기 위한 컨포넌트

   질량, 속도, 중력, 힘 등을 설정할 수 있고, 중력이나 힘 같은 물리 효과가 적용되도록 만든다

   물체를 움직이게 하는 계산기

https://docs.unity3d.com/6000.0/Documentation/ScriptReference/Rigidbody.html

 

Unity - Scripting API: Rigidbody

Adding a Rigidbody component to an object will put its motion under the control of Unity's physics engine. Even without adding any code, a Rigidbody object will be pulled downward by gravity and will react to collisions with incoming objects if the right C

docs.unity3d.com

 

* Collider

   물체의 충돌 범위를 정의하는 컨포넌트

   실제로는 보이지 않지만, 설정한 모양(Box, Sphere 등)에 따라 충돌 판정을 수행할 수 있다

   어디까지가 물체인지 정의하는 경계

https://docs.unity3d.com/6000.0/Documentation/ScriptReference/Collider.html

 

Unity - Scripting API: Collider

 

docs.unity3d.com

 

* Mesh Collider

   모델의 실제 모양(mesh)을 그대로 따라가는 충돌 영역(콜라이더)

   모델이 둘쭉날쑥한 탱크, 건물, 캐릭터 등 복합한 형태도 그대로 충돌 판정 가능

 

* OnCollisionEnter 발생 조건

   (1) 나에게 Rigidbody가 있어야 함
        단, isKinematic은 체크 해제되어 있어야 함(즉, 물리 영향을 받아야 함)
   (2) 나에게 Collider가 있어야 함
        isTrigger가 꺼져 있어야 충돌로 인식함(트리거일 경우 충돌 이벤트 X)
   (3) 상대 오브젝트에도 Collider가 있어야 함
        마찬가지로 isTrigger가 꺼진 상태여야 충돌 이벤트 발생

 

* isTrigger

   트리거 이벤트 전용 설정

   물리적 충돌을 하지 않지만, 두 Collider 간의 접촉은 감지된다

   따라서 겹치기는 하지만, 튕기거나 멈추지 않는다

   isTrigger가 켜지면 충돌 이벤트는 무시되고, 트리거 이벤트만 반응한다

 

* OnTriggerEnter 발생 조건

   (1) 양쪽 모두 Collider가 있어야 함

   (2) 둘 중 하나는 isTrigger가 켜져 있어야 함

   (3) 둘 중 하나는 Rigidbody가 있어야 함

 

* OnCollisionEnter vs OnTriggerEnter 공식문서

https://docs.unity3d.com/6000.0/Documentation/Manual/collider-types-interaction.html

 

Unity - Manual: Interaction between collider types

Use collisions to trigger other events Interaction between collider types The following collisionA collision occurs when the physics engine detects that the colliders of two GameObjects make contact or overlap, when at least one has a Rigidbody component a

docs.unity3d.com

  ▶ Static, Dynamic, Kinematic Collider는 Rigidbody 유무와 설정 상태에 따라 구분되는 물리적 동작 방식

타입 의미 Rigidbody
Static Collider 정적인 오브젝트 (움직이지 않음) 없음 (Rigidbody 없음)
Dynamic Collider 물리적으로 움직이는 오브젝트 Rigidbody 있음 + isKinematic = false
Kinematic Collider 직접 움직이되 물리 충돌은 무시 Rigidbody 있음 + isKinematic = true

 

* OnCollisionEnter vs OnTriggerEnter 예시

   총알이 벽에 부딪히는 건 Collision(isTrigger = false)

   플레이어가 아이템을 먹을 땐 Trigger(isTrigger = true) → 충돌은 안 해도 접촉 감지 필요

 

* Ctrl + D 단축키

   선택한 오브젝트를 그대로 복사

 

* Raycasting

   보이지 않는 레이(광선)을 쏴서, 그 경로에 있는 오브젝트들과 충돌 여부 감지

   ㄴ 쉽게 말해, 마우스나 총구에서 쭉 한 방향으로 선을 쏴서 무엇에 맞았는지 알아보는것!

   ㄴ Physics.Raycast, Physics.RaycastAll, Debug.DrawRay는 월드 좌표계(World Space) 기준으로 작동

       (즉, 씬 전체를 기준으로 선을 그리고 충돌을 검사함)

 

* 유니티에서의 좌표계 흐름
   Local ↔ World ↔ [Viewport ↔ Screen]


   Local Space

       오브젝트 자신의 좌표계(자식 기준)
   World Space

       씬 전체 기준 좌표계(DrawRay, Raycast 기준)
   Viewport Space

       정규화 좌표계(0~1, 카메라 기준)
   Screen Space

       실제 화면 픽셀 단위 좌표(좌측 하단 (0,0))

 

   Transform.TransformDirection

        Local → World 변환
   Camera.main.ScreenToWorldPoint

        Screen → World 변환
   Camera.main.WorldToScreenPoint

        World → Screen 변환

 

* 투영(Projection)의 개념

   3D 공간의 정보를 2D 화면에 투영하여 표현하는 것

   ㄴ 투영(投影) : 물체의 형태나 위치를 기준 평면(예: 화면)에 비춰 표현하는 과정

개념 비유
렌더링 투영 3D 건물을 사진으로 찍는 것
Ray 투영 2D 사진 속 점을 기준으로 진짜 공간에서 쏘는 레이저를 만드는 것

 

* 절두체(Frustum, 프러스텀)

   카메라가 렌더링 가능한 시야 범위를 나타내는, 앞이 잘린 피라미드 형태의 입체 도형

    3D에서 2D로 투영되는 과정에서 Z(깊이) 값은 카메라 기준 거리로 바뀌고, 2D 평면 좌표만 남게 됨

 

   [유니티에서..?]

   카메라가 실제로 렌더링하는 공간의 범위

 

   [Clipping Plane]

   절두체의 앞/뒤를 잘라주는 가상의 평면

   ㄴ 카메라가 렌더링 하는 시야 범위 = Near ~ Far 사이의 공간

   ㄴ Near과 Far 값이 너무 가까우면 절두체 깊이가 얕아져,

        대부분의 오브젝트가 시야 범위를 벗어나고 이로 인해 렌더링되지 않을 수 있다

 

* LayerMask

   현재 기준이 되는 광선을 누가 맞을지 정해주는 필터

   ㄴ 레이어 : 오브젝트를 그룹지어 특정 연산(raycasting, 충돌 등)에 포함/제외할 수 있게 해주는 설정

 

   (예)

   광선을 하나 쐈는데 주변에 사람, 유리, 벽, 좀비가 있는 상태
   LayerMask로 "나는 좀비만 맞을 거야" 라고 설정하면 좀비에만 반응하고 나머진 무시한다