본문 바로가기

Unity/3D

Unity 3D mmorpg 스러운 이동 구현 [JavaScript]

반응형

여기저기 막 조사하다가 찾아내었고 

한쪽방향으로만 회전해서 API를 열심히 뒤져서 구현해냈다.


나도 막 시작한 참이라 자세히 하는건 아니지만... 블로그에 올리기로 한거 최대한 자세히 적겠다 ㅠㅠ

틀린거? 모르는거? 알려주셨으면 좋겠네요!


#Vector3

 3차원 좌표를 저장한다. 이거를 통해서 연산하면 물체의 좌표를 이동시켜서 움직임을 구현도 할 수 있다.

따라서, 연산을 잘 응용하면 방향을 정할 수 있다.


#Quaternion

 으.. 아직도 정확히 말하기 어렵다. 3차원 x,y,z 좌표를 통해 공간좌표? 계산을 하는 듯 하다.

함수 몇개를 봤는데 보통 2개의 공간좌표를 통해 연산하도록 되어있었다.

여기서는 구형보간? 이란것을 이용해서 카메라의 이동을 부드럽고 자연스럽게 하려고 한다.

공간좌표1에서 공간좌표2로 t의 시간동안 이동하겠다라는 연산이 있는데

이를 통해 자연스러운 회전이 가능하다.

 허나, 좌표1,2 의 위치를 잘못쓰면 카메라가 미친듯한 회전을 보여준다



---------------------------------------------------------------------------

변수


private var moveDirection : Vector3; //역시나 이동 위치를 구하려 하는 변수다. 여기서는 화면을 회전할 때에도 필요하다.

private var mCamera : Transform; //카메라를 회전시키기 위해 필요하다.

private var toRotation : Quaternion; //회전 목표지점을 저장할 변수다. 사실 지역변수로 써도 상관없으나 설명을 위해  전역으로 뒀다.

public var mSpeed : float; //이동속도다.

public var rb : Rigidbody; //캐릭터의 강체 변수다.

private var h   : float; //수평

private var v   : float;//수직



----------------------------------------------------------------------




function Start () {

mCamera = transform.Find("Camera");

mCamera.transform.LookAt(transform.position);

mCamera.transform.RotateAround(transform.position, Vector3.up, transform.rotation.z);


//카메라가 오브젝트를 쳐다보게 하고, 약간 위쪽에 위치하게 한다. 


} //시작 때 호출되는 함수



function FixedUpdate(){ //역시나 프레임 마다 불러와진다.

h= Input.GetAxis("Horizontal");

v = Input.GetAxis("Vertical");

if(v != 0.0f ) run(); // W,S 중 하나를 눌러야 이동한다.


if(h != 0.0f) rotation( (h > 0 ) ? (Vector3.right) : (Vector3.left) ); //단순히 A,D를 누르면 회전만 한다. h의 부호에 따라서 회전방향을 정한다.


}


function run(){


moveDirection.Set(h,0,v);

moveDirection = transform.TransformDirection(moveDirection);

moveDirection*=Time.fixedDeltaTime*mSpeed;

moveDirection += transform.position;

rb.MovePosition( moveDirection);

}//이동함수


function rotation(i : Vector3){//회전 함수


       mCamera = transform.Find("Camera"); //자식객체로 속해있는 카메라를 불러온다.

mCamera.transform.LookAt(transform.position); //캐릭터를 쳐다보게한다.

mCamera.transform.RotateAround(transform.position, Vector3.up, transform.rotation.z); //캐릭터에 맞춰서 회전한다.


 

toRotation = transform.rotation * Quaternion.LookRotation(Vector3.Scale(moveDirection ,i)); // 회전할 목표 좌표를 정한다. 

//Vector3.Scale은 Vector3 두개를 곱한다. 여기선 좌우를 곱함으로서 방향을 정해준다.


transform.rotation = Quaternion.Slerp(transform.rotation, toRotation, Time.fixedDeltaTime);

// 현위치에서 회전할 방향으로 목표를 잡고, 목표 시간동안 회전한다.


}



------------------------
적용방법은

캐릭터를 만들고, 캐릭터 하위에 카메라를 생성한다.
카메라의 설정좌표는 어디든 상관없이 고정된다.

점프는 전 글을 보고 적용하면 가능하다!


반응형