본문 바로가기
관/핫한 닷지 프로젝트 게임개발

닷지 게임제작 기초 07(플레이어 스크립트 편).

by 4차원 박스 2020. 7. 21.

저번에 완료한 플레이어 컨트롤러 스크립트 설명및 완료에 관련된

포스팅이다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    Rigidbody playerRigidbody;
    public float speed = 8f;
    void Start()
    {
        playerRigidbody = GetComponent<Rigidbody>();
    }

   
    void Update()
    {
        float xinput = Input.GetAxis("Horizontal");
        float zinput = Input.GetAxis("Vertical");

        float xspeed = xinput * speed;
        float zspeed = zinput * speed;

        Vector3 NewVelocity = new Vector3(xspeed, 0f, zspeed);
        playerRigidbody.velocity = NewVelocity;
    }


    public void Die()
    {
        gameObject.SetActive(false);
    }
}

 

 

이 코드를 이제 차근히 알아본다.

이동을 입력받는 함수를 본다

GetAxis()메서드 = 어떤 축에 대한 입력값을 숫자로 반환하는 메서드
축 의 이름을 받는다. 
축의 양의 방향 값 = 1.0
축의 음의 방향 값 = -1.0
누르지 않음 = 0
Horizontal,Vertical 등의 축은 수평,수직에 해당하는 키로
주로 사용하는 wasd와 화살표키를 통틀어 나타낸다.

실수형 변수 xinput,zinput은 수평,수직 방향의 입력을 저장한다.

매 프레임마다 입력 받은 값을 실수형태로 반환하고
-1,0,1 의 값만 반환 하므로 속도를 나타내어 움직이는 데 편하다

직관적으로 보아도 여기에는 AddForce()메서드가 없지만 움직인다는 점을 주목하자.
즉 이동에 관련하여 속도가 관여를 하게 된다는 것이다.

속도 계산부분부터 본다.

xspeed 변수는 x방향, zspeed 는 z방향 이동 속도를 표현한다.
xinput * speed 를 통해 왼쪽,정지 오른쪽 이동 표현을 모두 가능하게 한다.
zinput * speed 를 통해 위아래 정지 표현이 가능하게 한다

이렇게 속도를 나타낸후 이를 기반으로 새로운 vertor3변수 newVelocity를 선언한다.
newVelocity 는 x,y,z방향으로의 속도를 나타내기위한 변수임

리지드바디 컴포넌트는 현재 속도를 표현하는 
vector3 타입의 velocity 변수를 제공한다.
velocity변수로 현재 속도를 알 수 있으며, 반대로 해당 변수에 새로운 값을 할당하여
현재 속도를 변경할 수 있다.


Vector3란?
원소 x,y,z를 가지는 타입이다.
위치, 크기, 속도, 방향 등을 나타낼때 주로 사용한다.

다음같은 방식으로 생성한다 x,y,z에는 대응하는 값(flaot 형태로)을 넣으면 된다.

Vector3 vector = new Vector3(x,y,z);

Vector3 vector = new Vector3(100f,100f,100f);
같이 나타내면 x,y,z방향으로 100만큼 가는 속도를 표현하는 Vertor3값을 생성하여
vector라는 변수로 전장한것 이다.(자세한것은 추후에 다룰 예정)

AddForce와 veolocity의 차이
전자의 방식은 조작이 무겁게 느껴지게 한다.
힘을 누적하여 점진적으로 증가시켰다
즉 관성이 있기때문이다.

후자는 이전속도를 지우고 새로운 속도를 사용한다
따라서 관성을 무시하고 속도가 즉시 변경된다.

 

이제 입력매니저를 알아본다.

Input.GetAxis("Vertical"); 을 사용한것을 좀더 자세히 본다

1. GetAxis()메서드에 입력한 Vertical 축은 무엇이며 왜 사용?
: 입력키 커스터마이제이션을 구현하기 위해

2.GetAxis()메서드의 출력값이 부울값이 아닌 숫자인 이유?
: 조이스틱 같이 다양한 I/O장치에 대응하기 위해

처음에 사용한 GetKey()메서드는 조작 키를 실시간으로 변경 불가능하다
(바꾸려면 코드 수정을 해야한다는 의미이다.)

대신에 이름입력을 거쳐가는 방식을 사용한다.

어느 유명한 온라인겜이든 자신에 맞게 편한 키로 변경하는 기능이 있다.
대부분의 조작 키 설정 창은 
'기능의 이름'+'매핑된 키' 이렇게 한 쌍으로 구성된다.
예) 발사 ㅡ> 마우스 왼쪽버튼 이런 방식이다

물론 설정 창에서 매핑된 키를 마음대로 변경할 수 있다.
예) 발사 ㅡ> 마우스 오른쪽버튼

이게 가능한 이유는 실제 총을 발사하는 코드에서는
마우스 왼쪽 버튼 처럼 입력 장치의 구체적인 식별자를 
사용하지 않기 때문이다. 그대신 '발사' 라는 입력 이름을 통해
입력을 감지한다.

코드를 보며 시각적으로 이해하면 다음과 같다.

if(마우스 왼쪽 버튼을 누름){}
if('발사'에 대응되는 버튼을 누름){}

전자는 게임도중에 발사키를 우클릭으로 바꿀수 없다.
하지만 후자는 '발사' 라는 입력 이름에 대응되는 버튼을 감지하므로
가능한 것이다. 

다음과 같은 방식으로 연결된 구조이다
코드(발사기능) <=> 입력이름('발사')<=>입력장치(좌클)
우클로 하고싶으면 발사라는 입력 이름에 대응하는 버튼을 변경하고
코드는 수정할 필요가 없다.
코드(발사기능) <=> 입력이름('발사')<=>입력장치(우클)
이렇게 말이다.

입력이름에 해당하는 유니티에서 사용하는 축 이 Vertical,Horizontal 이다.

축은 축에 대응하는 버튼을 가지고 축을 사용하면 사용할 입력키를 명시하지 않아도 된다.
이러한 축은 유니티의 입력 매니저에서 관리한다.

edit > project setting > Input >Axes 에서 확인가능함


Input.GetAxis("Vertical");의 실행과정은

1. 입력 매니저에서 Vertical축을 찾음
2. Vertical 축에 대응되는 버튼(s,w,화살표위아래)들로 현재 입력을 검사하여 감지된 입력값 변환

참고로 유니티 입력매니저에는 키보드 뿐만아니라 콘솔에도 해당하게 같은 이름으로 축이 되어있기에
별도로 신경쓰지 않아도 된다. 키보드는 부울값 같이 바로 판단이 가능하지만
콘솔경우 살짝미는 경우가 있으므로(이때는 0.5정도로 값이 나옴) GetAxis가 숫자값으로 반환하는 것이다.
즉 살짝이든 강하게 미는것이든 판단이 가능하게 하기위한 것이다.

 

다음 포스팅은 닷지에서 나오는 총알을 다룬다.

댓글