Ad Block 한번만 꺼주시면 안될까요..?
게임 개발/유니티C#

Unity) 플레이어 조작하기. (여러 방법)

UniCoti(유니코티) 2022. 10. 31.

유니티를 처음 켜본 후, 강좌를 알아본

많은 사람들은 첫걸음으로 "Hello World"를 찍은 후

 

아마 캐릭터를 이동시키는 것부터 시작했을 것이다.

 

당연하다시피, 캐릭터를 이동시키는 것은 한 가지 방법에 국한되지 않는다.

 

서론은 집어치우고, 지금부터 여러 가지 방법을 소개해보겠다.

(쉬운 편인 것들로)


1. Input Manager의 Axes를 이용한 움직임.

 

프로젝트 세팅의 Input Manager에 들어가 보면

이렇게 여러 가지 기본 세팅이 있는데,

어느 키를 누르면 저 변수의 값이 자동으로 바뀌게

유니티에서 세팅을 미리 해준 것이다.

 

float x = Input.GetAxis("Horizontal");
float y = Input.GetAxis("Vertical");

rigid.velocity = new Vector3(x, 0, y) * speed * Time.deltaTime; //속력 바꾸기
or
transform.position += new Vector3(x, 0, y) * speed * Time.deltaTime; //위치 바꾸기

이렇게 사용할 수 있다.

즉석으로 만든 코드라 실제 작동하는지는 테스트 안 해보았다.

아마 작동되긴 할 건데 조작감이 살짝 별로 일 수 있다.

그러면 키를 누를 때마다 가속도가 초기화되게 해서

 

즉각적으로 반응할 수 있게 한다거나

가속력에 최댓값을 주는 코드를 작성해서 

방지해주면 된다.

https://alpaca-code.tistory.com/2(가속도 한계 코드 게시물)

 

유니티 가속도를 제한하는 방법

if(Mathf.Abs(rigid.velocity.x) > 5) { rigid.velocity = new Vector2(Mathf.Sign(rigid.velocity.x) * 5, rigid.velocity.y); } Mathf.Abs 는 절댓값을 구하는 함수이다. 그러므로 rigid.velocity.x(양옆으로 이..

alpaca-code.tistory.com


2. 힘을 이용한 움직임.

 

물리를 관장하는 컴포넌트인 RigidBody를 이용한 방법으로,

원하는 방향으로 힘을 주는 메서드인

AddForce()를 활용한 움직임 코드이다.

(필자는 주로 이걸 우선으로 시도해본다.)

 

if(Input.GetKey(KeyCode.W)) {
	rigid.AddForce(transform.forward);
} else if(Input.GetKey(KeyCode.A)) {
	rigid.AddForce(-transform.right);
} else if(Input.GetKey(KeyCode.S)) {
	rigid.AddForce(-transform.forward);
} else if(Input.GetKey(KeyCode.D)) {
	rigid.AddForce(transform.right);
}

코드가 좀 더럽긴 하지만

공통되는 부분을 함수 처리해주면 나름 보기 좋다.

물리로 움직이는 코드이기에 transform으로 위치를 바꿔주는 코드보다

물리의 현상이 조금 더 자연스럽게 처리된다.

 

예를 들면 벽을 뚫는 문제라던가, 끼임 문제가

transform에 비해 덜 발생한다.

그런 부분에서 좋다.

 

그리고 이것 또한 힘을 계속 주면(키를 계속 누르고 있으면) 

무한대로 힘을 주는 것이기에

슈퍼소닉의 속도를 느끼고 싶은 게 아닌 이상

가속도의 한계치를 정해주는 게 좋다.


3. 가속도를 활용한 움직임.

 

사실 이건 1번과 크게 다르지 않다.

1번에선 Input Manager라는 기능이

키 입력을 관리해주었다면

 

이번엔 직접 키를 눌렀는지 확인해가며

속도를 주는 것이다.

이걸 쓰는 장점은

float x =...

float y =... 등

Input Manager를 사용하기 위해

있었던 줄들을 없앨 수 있기 때문이다.

 

하지만 그 과정에서 if문 4개가 발생하기 때문에

마음이 안 좋은 것도 사실이다.

 

그럼에도 사실상 연산과정의 차이는 크게 없기에

마음에 드는 걸 쓰는 게 맞는 듯하다.

if(Input.GetKey(KeyCode.W)) {
	rigid.velocity = new Vector3(transform.forward) * speed * Time.deltaTime;
} else if(Input.GetKey(KeyCode.A)) {
	rigid.velocity = new Vector3(-transform.right) * speed * Time.deltaTime;
} else if(Input.GetKey(KeyCode.S)) {
	rigid.velocity = new Vector3(-transform.forward) * speed * Time.deltaTime;
} else if(Input.GetKey(KeyCode.D)) {
	rigid.velocity = new Vector3(transform.right) * speed * Time.deltaTime;
}

여기까지 내가 주로 쓰는 캐릭터를 움직이게 하는 코드를 몇 줄 써봤는데,

이걸 많이 쓰는 거지 더 좋은 코드가 없다는 건 아니다.

 

당장 2 , 3번만 보더라도 if문이 4개가 있는 게 

굉장히 불편하다는 생각이 든다.

 

그런 이유들로 볼 때, 전문가의 코드에서는 뭔가 다른 움직이는

코드가 존재할 걸로 예상된다.

 

또한 초보 입장에서는 그리 쉽진 않을 것 같아

Player Controller를 활용한 움직임도 제외했다.

 

그리고 저 코드들은 맨날 써오던 거라 필자가 즉석에서 제조한 것일 뿐

돌려보지 않았기 때문에 실행되는지 확신할 수 없다.

적당히 이런 방법이 있구나 정도로 넘어갔으면 좋겠다.

 

이상 도움이 되었길 바라며,

 

요즘 카카오톡으로 유입되는 방문자들이 종종 있는데,

무슨 의도로 카카오톡에 내 사이트가 있고,

들어오는지 좀 무섭기도 하다.

 

내 사이트가 도움이 되었을 수도 있지만

어디서 놀림당하고 있는 건 아닌가 싶다.

 

혹시라도 카카오톡 유입자는 댓글 달아줬으면 한다..

 

끝.

 

 

댓글

💲 추천 글