Rigid Body 를 이용한 캐릭터 위치 이동

2018. 12. 30. 13:48Example project

Rigid body? Rigid Body 란, 물리 시뮬레이션을 통해서 오브젝트의 위치를 조절합니다.


리지드바디(rigidbody) 컴포넌트는 오브젝트의 위치를 제어합니다. - 중력의 영향에 의해 오브젝트를 아래로 떨어지도록 만들고,

충돌에 대한 오브젝트의 반응의 크기를 계산할 수 있습니다.

리지드바디 파라미터를 다루는 경우에는, FixedUpdate function내에서 작업을 진행해야 합니다.

물리 시뮬레이션은 discrete timesteps단위로 수행됩니다. FixedUpdate function은 각 단계 전에, 즉시 호출됩니다


출처 URL : https://docs.unity3d.com/kr/530/ScriptReference/Rigidbody.html 를 참고하면 편합니다.


쉽게 말해, 오브젝트를 이동시키고 싶을 때 사용하는 컴포넌트 입니다.


리지드 바디의 파라미터를 다룰때는, 일반 Update 함수가 아닌 FixedUpdate 함수 내에서 작업을 하여야 합니다.

Ex)


Rigid Body 의 함수인 Addforce를 쓰기위해서, FixedUpdate 함수를 이용해 구현한 간단한 캐릭터 이동 코드입니다.

( FixedUpdate 에서 d 를 빼고 FixeUpdate 함수로 사용해 봤는데, 안먹히네요. 지정된 함수명인가 봅니다.)

먼저, 이동하기 위해 Addforce Function 을 사용할 것이고, AddForce를 사용하기위해 예제는 다음과 같습니다.


using UnityEngine;

public class ExampleClass : MonoBehaviour { public float thrust; public Rigidbody rb;

void Start() { rb = GetComponent<Rigidbody>(); }

void FixedUpdate() { rb.AddForce(transform.forward * thrust); } }

(출처 URL : https://docs.unity3d.com/kr/530/ScriptReference/Rigidbody.AddForce.html)


예제에서는 실수형 변수를 thrust 로 선언, rb를 리지드 바디형(?) 으로 선언 한거 같습니다.


Start 함수 안에서,  비어있는 rb에 컴포넌트의 RigidBody의 속성을 넣어준후,


FixedUpdate 함수에서, Addforce 함수를 사용해서 rb에 실제로 먹히는 함수를 넣어주는거 같습니다.


rb.AddForce(transform.forward * thrust) ;  // rb는 AddForce함수를 호출해 transfrom.forward 즉 앞으로 이동시키는데, 여기서 thrust는 이동속도 변수? 로 많이 쓰이는거 같습니다. 저도 이동속도 변수로 비슷하게 사용했습니다.


AddForce함수는 X,Y,Z 3축방향으로 이동시킬 수 있습니다. 


이제 제가 적용한 방법에 대해 설명 하겠습니다.


저는 Vector3를 이용해, y축을 제외한 x,z를 이동시킬 것으로 다음과 같이 선언합니다.


Vector3 movement = new Vector3(InputH , 0.0f ,InputV);


이미 입력값으로 x 좌표(Horizontal) , z 좌표(Vertical) 입력을 받아오기때문에, 대입합니다.


다음 코드로 나가기 전에, 이동속도 변수를 선언한다고 했는데, 저는 이동속도 변수를 걷기 상태, 뛰기 상태일 때, 다른 속도를 주고 싶기 때문에, 두 개의 변수를 선언합니다.


public float Walk_Speed;
public float Running_Speed;


public 으로 선언했을 시 ,


처럼 inspertor 창에서 스피드를 주는 것이 가능합니다.

걷기일 때, 10 , 뛰기일 때, 50 을 줍니다. (잘 실행되는지 확인하기 위해 비교를 어느정도 많이 나게 주는것을 추천드립니다,)


이미 vector3 에 inputH , 0.0f , inputV 를 주었기 때문에 위치변화에 대한 수는 충분히 입력되었습니다.

다음은 if문 을 통해 뛰기 모션 Trigger key 인 LeftShift 를 이용해, animamor 또한 뛰기 모션, 속도 또한 뛰기에 맞는 속도를 주기 위한 코드입니다. 

if(Input.GetKey(KeyCode.LeftShift)) // 두 개의 변수를 주어서 걷기,뛰기 모션의 이동속도를 각각따로 제어
{
rb.AddForce(movement*Running_Speed); // 선택문을 이용해 LeftShift 가 눌렸을 때, 이동속도 증가
}


복잡해 보이지만 코드 전문은 단순합니다.


void FixedUpdate() // Rigid Body를 이용하기 위한 함수
{
Vector3 movement = new Vector3(InputH , 0.0f ,InputV); //Vector3 성분 x,y,z >> Horizon = InputH ,
// Vertical = InputV >> Vertor3(InputH,0.0f,InputV); y는 고정 Set

if(Input.GetKey(KeyCode.LeftShift)) // 두 개의 변수를 주어서 걷기,뛰기 모션의 이동속도를 각각따로 제어
{
rb.AddForce(movement*Running_Speed); // 선택문을 이용해 LeftShift 가 눌렸을 때, 이동속도 증가
}
rb.AddForce(movement*Walk_Speed); // 걷기 일 때, movement * Walk_Speed 연산
}


이제 실행해 보겠습니다.



(음악소리가 들릴수 있습니다.)

의도한 대로 ,문제없이 잘 실행 됩니다.

이상 캐릭터 위치 이동 포스팅이었습니다.

'Example project' 카테고리의 다른 글

플레이어 체력 소모  (0) 2019.01.25
몬스터 접근 영역  (0) 2019.01.25
캐릭터 이동  (0) 2018.12.19
게임 스테이지 제작  (0) 2018.03.14