본문 바로가기

졸업프로젝트

유니티 기본강좌_3.리지드 바디

cube object에 rigid body component를 추가해준다.

rigid body란 물리효과를 보여주는 애이다. 대표적인 예로 gravity가 있는데, 이걸 체크해주면 큐브가 아래로 추락하게 된다. 

 

edit > project settings> physics에 들어가면 나오는 화면은 아래와 같음. 

gravity의 x,y,z값 조절이 가능함. 

 

[rigidbody의 구성요소]

- mass(질량): 질량이 높을수록 관성이라던지, 속도에 영향을 받는다. 질량이 다른 물체가 충돌했을 때, 질량이 큰 물체가 질량이 작은 물체를 밀어버린다. 

- drag: 공기저항과 같은 것. (drag = 0이면 우주공간 // drag값의 차이에 따라 떨어지는 속도에 차이가 있음)

- angular drag: 회전값에 대한 저항 (angular drag값이 크면 회전이 빠르게 멈추게 됨.)

- Use Gravity: 중력 사용여부

- Is Kinematic: 물리효과 사용여부

- Interpolate: character의 움직임이 부자연스러울 때, 보간하여 자연스럽게 만드는것. (보통은 큰 차이가 없기 때문에 잘 사용하지 않음)

- Collision Detection: 충돌 탐지기. (descrete - 충돌하면 그냥 충돌했구나 정도 / Continuous - 매우 빠른 스피드를 지닌 총알 같은 것에 적용하면 좋음)

- Constraints: position, rotation을 freeze할 수 있음 (중력이 적용되지 않음)

 

위의 코드처럼 velocity를 이용하여 objcet의 속도를 조절해줄 수 있다. 

위의 코드를 활용하면 object를 회전하게 할 수 있다. 

 

[이외 자주 쓰이는 리지드바디 속성들]

mass = 질량을 바꿀 수 있다.

drag = 저항을 바꿀 수 있다.

angularDrag = 회전에 대한 저항을 바꿀 수 있다.

maxAngularVelocity = 회전의 최대속도로 변경시키는 것 (default값 = 7)

isKinematic, useGravity : 각각 true, false로 설정할 수 있다. 

 

[리지드 바디의 대표젹인 method]

MovePosition() : 일정방향으로 이동시키는 것

ex. myRigid.MovePosition(transform.forward); --> 앞으로 이동시키는 코드임

위의 코드는 MoveRotation()을 이용해서, w키를 눌렀을 때만 큐브가 회전하도록 한 것이다. (w키를 떼면, 큐브는 더이상 회전하지 않음)  

--> MovePosition(), MoveRotation()은 관성과 질량의 영향을 받지 않는다. 

 

관성과 질량에 영향을 받도록 하려면, 

위와 같이 코드를 작성하면 된다. 이렇게 AddForce를 이용하면, 관성과 질량에 영향을 받기 때문에, w키를 누르지 않았을 때 바로 멈추는 것이 아니라 천천히 감속하면서 멈추게 된다. 그리고 AddForce는 질량이 더 가벼운 물체가 더 빠르게 움직이도록 한다. 

 

비슷하게, AddTorque의 경우에도, 키를 더이상 누르지 않게하면, 바로 멈추는 것이 아니라 일정한 회전력이 남아있도록 한다. 

myRigid.AddTorque(Vector3.up); 과 같이 활용한다. (y축 - up 기준 회전하도록)

 

이외에도,

AddExplosionForce(폭발력 세기, 폭발 위치, 폭발 반경) : 폭발 등을 구현 시에 유용 

ex. myRigid.AddExplosionForce(10, this.transform.right, 10);

-->10의 크기로 폭발해서, 왼쪽으로 날라가도록(오른쪽에서 폭발하니까 왼쪽으로 날라감), 반경 10 안에 있는 것들이 폭발 (+@ 질량이 가벼울수록 더 멀리 날라감)

 

Add~~: 물리효과와 관계가 있음. (중력, 저항 등등)

Move~~: 강제로 이동시키는 것이라, 물리효과와 관계가 없음.