유니티 게임 개발(5)

Proffeine0327·2023년 5월 4일

Unity Basic Development

목록 보기
5/11

플레이어

저번 포스터에서는 입력을 받고, 간단한 움직임을 설정해 보았다.
이번에는 플레이어 기본 움직임을 완성해보도록 하자.

  1. 플레이어 이동 스크립트 수정하기

저번에 썻던 Player 스크립트를 다음과 같이 수정하겠다.

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

public class Player : MonoBehaviour
{
    public float moveSpeed;

    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        var h = Input.GetAxisRaw("Horizontal");

        var dir = new Vector2(h * moveSpeed, 0);

        dir.y = rb.velocity.y;

        rb.velocity = dir;
    }
}

어려운 개념들이 많이 들어가서 복잡해 보일수 있다. 하나하나 설명해주겠다.

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

public class Player : MonoBehaviour
{
    public float moveSpeed; //1)

    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        var h = Input.GetAxisRaw("Horizontal"); //2)

        var dir = new Vector2(h * moveSpeed, 0);

        dir.y = rb.velocity.y; //3)

        rb.velocity = dir;
    }
}

1) 변수이다. moveSpeed라는 이름을 보아, 플레이어의 속도를 결정짓는 변수라고 쉽게 유추할 수 있다.
앞의 public은 유니티의 inspector창에 저 변수를 수정할 수 있게 표시하겠다는 의미이다.
public을 붙이게 된다면 밑에처럼 표시가 된다.


2) var을 먼저 설명하겠다. 원래 변수를 만들때는 int, float 등등, 앞에다 어떤 값을 넣을지 형식을 정해줘야한다. 근데, 앞의 형식의 이름이 긴 경우, 이런 형식들을 쓰기가 귀찮을 수 있다.
var은 뒤에 값을 유추해서 앞의 형식을 알아서 정한다는 표시이다.
Input.GetAxisRaw는 float형을 반환하므로, 코드에서의 var은 float이 된다.
대신 var은 옆에 값을 정하지 않을경우 쓰지 못한다. var을 쓸때는 반드시 값을 바로 정하도록.

Input.GetAxisRaw는 Input에 있는 함수로, 정해놓은 설정의 키가 눌릴경우, 특정한 값을 반환한다.
설정은 유니티 에디터에서 Edit > Project Settings > Input Manager > Axis에서 볼 수 있다.

Horizontal에는 a, d, 화살표 왼쪽, 화살표 오른쪽이 할당되어있으며, 왼쪽을 누를경우 -1, 오른쪽을 누를경우 1, 누르지 않거나 동시에 누를경우 0을 반환한다.

3) 앞서 우리는 Rigidbody2D의 Velocity는 오브젝트의 속력을 정한다고 하였다.
이는 중력에도 영향을 미친다. 만약 우리가 dir의 y값을 0으로 정할경우, 중력의 값을 받아서 조정이 되다가도, 0으로 설정되어버려, 정확한 중력을 계산할 수 없게된다.
따라서 y값은 velocity의 y값 그대로 받게 한다.


2.플레이어 점프

이제 우리는 플레이어를 이동시키고, 이동 속도를 조정할 수 있게 되었다.

이제 플레이어를 점프를 하게 만들어보겠다.

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

public class Player : MonoBehaviour
{
    public float moveSpeed;
    public float jumpScale;

    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        var h = Input.GetAxisRaw("Horizontal");
        var dir = new Vector2(h * moveSpeed, rb.velocity.y);

        if(Input.GetKeyDown(KeyCode.Space))
            dir.y = jumpScale;

        rb.velocity = dir;
    }
    
    // dir.y를 따로 설정하던것을 바로 설정하게 수정했다.
}

지금까지 포스터를 잘 보았다면 위의 코드를 금방 이해할 수 있을것이다.

if와 GetKeyDown(KeyCode.Space)로 스페이스바를 눌렀을때를 확인한 다음, dir의 y를 jumpScale만큼 수정하였다.

이로써 우리는 플레이어의 기본적인 움직임을 만들게 되었다.

profile
Programmer needs Caffeine / 공부하는 학생

0개의 댓글