Game Development, 게임개발/개발

GameObject를 입력받아서 방향대로 움직이기 [Unity 3D]

게임이 더 좋아 2021. 2. 23. 05:09
반응형
728x170

 

 

움직이게 하는 것은 translate()라는 메서드로 한다고 배웠다.

그렇다면 Input을 받아서 하는 것은??

우리가 기본적으로 WASD가 방향을 뜻하는 것을 알고 있다. 과연 유니티도 그럴까?

 

Edit의 Project Settings로 가보자

 

저기 왼쪽 tab에 Input이 있네?

 

음 WASD가 보이나? 

Negative, Positive 하면서 써있다.

여기서 왜 Negative, Positve로 나눌 수 있냐면..

좌표평면을 생각해보면 알 수 있다.

Y가 +면 위쪽 이니까 아래쪽은 - 겠지?

X도 마찬가지다.

 

++저기있는 Name을 잘 기억해두고 이용할 수 있다는 것을 알아야 한다.

나중에 Call 할 때는 Name을 이용할 거니까.

 

그럼 약간 코드를 수정해주자

public class PlayerController : MonoBehaviour
{
    public float speed = 5.0f;
    public float turnspeed;
    public float horizontalInput; // Left and Right

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        horizontalInput = Input.GetAxis("Horizontal")
        //detect user's input() and make vehicle move forward
        //transform.Translate(0, 0, 1);
        transform.Translate(Vector3.forward*Time.deltaTime * speed); // same as above line. it's just expression difference.
        transform.Translate(Vector3.right * Time.deltaTime * turnspeed * horizontalInput); // same as above line. it's just expression difference.
    }

 

horizontalInput 이라는것이 입력을 할당받는 것이다. 

입력을 받아오게 해주는 것은 Input.GetAxis이고 그 받아올 대상을 "Horizontal"이라는 이름에서 가져온다는 뜻이다.

 

 


 

 

좌우이동을 배웠으면 그 응용이다.

가속하기는 내가 입력받은 방향으로 간다는 말이고

멈추기는 현재 GameObject가 이동하는 속도를 감속시켜서 0으로 만든다는 것이다.

후진하기는 가속하기와 마찬가지로 내가 뒤를 입력했으니까 뒤로 가는 것이다.

 

**주의할 점.. 멈추기는 뒤로가기가 아니다. 물리적으로 차가 감속하지 않고 뒤로갈 수 있나? 그니까

Continuous하게 가야한다는 말이다. 8이 갑자기 -8이 될 수 있나? 연속적이어야겠지?

 

**사실 여기서는 힘으로 앞으로 가게하는 것이 아니라... 가속력이라곤 존재하진 않지만 혹시 착각할까봐

 

코드 한 번 보자

 

public class PlayerController : MonoBehaviour
{
    public float speed = 5.0f;
    public float turnspeed;
    public float horizontalInput; // Left and Right
    public float forwardInput; // Left and Right


    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        horizontalInput = Input.GetAxis("Horizontal");
        forwardInput = Input.GetAxis("Vertical");
        //detect user's input() and make vehicle move forward
        //transform.Translate(0, 0, 1);
        transform.Translate(Vector3.forward*Time.deltaTime * speed * forwardInput);  // same as above line. it's just expression difference.
        transform.Translate(Vector3.right * Time.deltaTime * turnspeed * horizontalInput); // same as above line. it's just expression difference.
    }
}

 

딱히 달라진 것은 없다. forward가 생겼다? 그정도

 

translate는 힘을 줘서 이동시키는 것이 아니라 F=ma같은 것이 통하지 않음을 유념하자

 

 

 

 

728x90
반응형
그리드형