Unity/Unity 3D

[Unity 3D]물리엔진 Rigidbody에 대해서 알아보고 사용해보자

tangent0426 2024. 8. 5. 23:33
728x90
반응형

우리가 흔히 물체를 끌어당기는 힘을 중력이라고 하죠 그럼 Unity을 통해 만든 게임들은 무엇으로 중력을 잡아주는 게임들이 존재할까요? 오늘은 이러한 중력의 영향을 받는 기능을 잡아주는 물리엔진인 Rigidbody에 대해 설명과 Unity에서 어떻게 구현하는지 사용해 보는 시간을 가져보도록 하겠습니다.

물리엔진, RigidBody란?

Unity 메뉴얼

물리엔진은 일상생활에서 접할수 있는 힘, 중력, 마찰력등의 물리 현상을 컴퓨터에서 시뮬레이션을 한 것을 말합니다. 현실과 같은 상호작용을 하고 물체를 표현하기 위해 개발되며, 물리엔진이 보편화되면서 게임이 현실적인 효과를 추가가 가능해졌습니다. 현재는 영화, CG 등 다양한 영상물, 그래픽 작업등에도 폭넓게 사용하고 있습니다.

RigidBody(강체:리지드바디)는 천체 물리학 등 물리학에서 사용되는 개념으로 물리학에서는 형태가 고정되어 변하지 않는 물체를 가리키며 바깥 힘이 가해져도 모양이나 크기가 변형되지 않습니다.(물체의 운동을 분석할 때 보통 물체를 강체로 가정합니다.)

 

Unity에서 RigidBody는 Game Object가 물리 제어로 동작하게 하며 현실적인 충돌 현상 등의 물리현상을 구현할 수 있게 해 줍니다.(GameObject에 물체를 추가하여, Inspector에서 추가하여 조작합니다.)

 

0

GameObject가 물리 제어로 동작하게 하고 힘을 받아 오브젝트가 사실적으로 움직이도록 하며 힘(Forces)를 가하여 게임 오브젝트를 밀고, 물리 엔진이 결과를 계산하도록 해야합니다.

 

 

RigidBody3 D와 RigidBody2d의 차이점에 대해서 간단하게 말하자면 

RigidBody2D RigidBody3D
기능적인 부분은 동일함
RigidBody2d에는 평면에서만 작동함(차원이란 개념이 없음)
RigidBody는 3D에서 작동함

 

자세하게 Rigidbody를 알고 싶으시면 아래링크에 들어가시면 됩니다.

https://docs.unity3d.com/kr/2020.3/Manual/class-Rigidbody.html

 

리지드바디 - Unity 매뉴얼

Rigidbody 는 GameObject 가 물리 제어로 동작하게 합니다. 리지드바디는 힘과 토크를 받아 오브젝트가 사실적으로 움직이도록 해줍니다. 리지드바디가 포함된 모든 게임 오브젝트는 중력의 영향을

docs.unity3d.com

 

 

RigidBody 속성을 살펴보자면 위의 Mass는 Object의 질량을 나타내고 무게 단위가 아닌 상대적 의미의 질량을 나타냅니다.

 

 

Drag는 이동할 때 적용되는 마찰계수입니다.

 

 

Angular Drag 회전할 때 적용되는 마찰계수입니다.

 

 

Use Gravity는 중력 적용 여부를 결정할 수 있습니다.

 

 

IS Kinematic는 중력과 외부에서 가해지는 물리적 힘에 반응을 결정할 수 있습니다.

 

 

Collision Detection은 세밀한 충돌을 검출하기 위한 옵션으로 너무 빠른 물체는 물리엔진 충돌 검출을 놓칠 수 있습니다.

 

 

움직임에 제약 사항을 걸 수 있으며 다음 X,Y,Z에 체크박스에 체크를 하면 그 좌표는 움직임을 멈추며 Position은 위치 제약을, Rotation은 회전 제약을 할 수 있습니다.
 

 

RigidBody를 사용해 보기

Unity 내에서 RIgidbody를 이용해서 마우스를 우클릭하여 Object를 날리게 해 보겠습니다.

 

 

프로젝트 내에 발사할 Object를 생성해 줍니다.

 

 

Prefab에서 위의 사진처럼 Collider와 Rigidbody를 설정해 줍니다.

(Collider은 나중에 설명해 드리겠습니다.)

 

 

이제 투척물을 발사할 수 있는 즉, 어디서 나가는지 확인할 수 있는 용도인 Object를 생성해 줍니다.

이러한 생성된 객체 안에 Script를 생성 및 추가합니다.

 

[SerializeField]
    private GameObject gameobject;
    [SerializeField]
    private Transform projectileSpawnPoint;
    [SerializeField]
    private float projectileSpeed = 10f;
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            GameObject projectile = Instantiate(gameobject, projectileSpawnPoint.position, Quaternion.identity);
            Rigidbody projectileRb = projectile.GetComponent<Rigidbody>();
            projectileRb.velocity = transform.right * projectileSpeed;
        }
    }

 

더보기
Script 선언 및 코드 내용
변수 선언
1.GameObject를 이용하여 프리펩 인스턴스화
2.Transform을 이용하여 위치 정보 가져옵니다.
3.Speed 설정합니다.
코드 내용
1.마우스 좌 클릭시  설정한  좌표 위치에 프리펩 인스턴스화
2.설정한 속도로 객체가 날라감

 

좌표 설정 시 사용하는 코드는 아래의 표와 같습니다.

X좌표 설정시 transform.right
Y좌표 설정시
transform.up
Z좌표 설정시 transform.forward

 

0

위의 슬라이드 쇼처럼 Rigidbody를 이용해 물체를 발사하는 Object를 만들어보았습니다.

 

이번 시간을 통해 RigidBody를 간단하게 알아보았습니다. 다음에는 Collider를 알아보는 시간을 갖아보도록 하겠습니다.

 

읽어주셔서 감사합니다.&>&

반응형