[Unity]캐릭터 움직이기

dd_ddong·2022년 5월 16일
0

Unity

목록 보기
1/9

Player 생성


Asset Store에서 유니티짱 임포트

임포트한 에셋에서 Models 파일에 있는 unitychan으로
player 생성
컴포넌트로 PlayerController C# Script도 생성해주자

transform관련 API

transform 키워드로 바로 게임오브젝트 transform에 접근

void Update()
{
	if(Input.GetKey(KeyCode.W))
    	transform.position += new Vector3(0,0,1.0f);
}

Update문 안에 position 값을 증가시켜 player가 앞으로 이동하게 만들었다.
Update가 frame마다 호출되므로 속도가 일정하지 않다.

void Update()
{
	//Time.deltaTime추가
	if(Input.GetKey(KeyCode.W))
    	transform.position += new Vector3(0,0,1.0f) * Time.deltaTime;
}

deltaTime은 이전 프레임에서 현재 프레임까지 걸린 시간으로 단위는 초를 쓴다.
Time.deltaTime을 곱해줌으로서 position에 프레임 당 Vector3(0,0,1)을 더해주는게 아니라 초당 Vector3(0,0,1)를 더해주게 된다.

float _speed = 10;

void Update()
{
	//Time.deltaTime추가
	if(Input.GetKey(KeyCode.W))
    	transform.position += Vector3.forward * Time.deltaTime * _speed;
}

speed를 정해주는 필드까지 곱해주게 되면 _speed로 설정한 속도로 player가 움직이게 된다.
+ Vector3.forward 키워드 == new Vector3(0,0,1f);

Local 좌표계 Global 좌표계

player의 y축 rotate를 45로 설정하고 play를 해보자

W키를 눌러보면 player가 보고 있는 방향이 아니라 밑에 화살표 방향을 기준으로 이동하는 것을 알수 있다.
player가 보고 있는 방향을 기준으로 움직이도록 해보자

빨갛게 동그라미친 버튼을 눌러보자. 그러면 밑의 좌표 화살표가 player가 바라보는 방향으로 바뀌는 걸 볼 수 있다.


사실 Unity에는 2개의 좌표계가 있는데 Global 좌표계와 Local 좌표계다.
처음 봤던 화살표가 Global좌표계, 버튼을 누른뒤가 Local 좌표계이다.
player가 이상하게 움직였던 건 Global 좌표계를 기준으로 position을 움직였기 때문이다.


그럼 Local좌표계를 기준으로 player가 움직이게 바꿔보자

float _speed = 10;

void Update()
{
	//Time.deltaTime추가
	if(Input.GetKey(KeyCode.W))
    	transform.position += tranceform.TransformDirection(Vector3.forward * Time.deltaTime * _speed);
}

transform.TransformDirection()은 Local좌표를 Global좌표로 바꿔주는 함수다.
Local좌표를 기준으로 이동하려 한 위치값을 Global좌표에 해당되는 위치값으로 변환한 후 position에 더해줘 local좌표로 움직일 수 있게 해준다.

아니면

float _speed = 10;

void Update()
{
	//Time.deltaTime추가
	if(Input.GetKey(KeyCode.W))
    	transform.Translate(Vector3.forward * Time.deltaTime * _speed);
}

tranceform.Translate()쓰면 Local기준으로 움직일 수 있다.

0개의 댓글