본문 바로가기

Unity

[Unity] 캐릭터 이동

캐릭터가 움직일 수 있는 땅을 먼저 만들어줍시다.

땅의 재질은 Hierarchy에서 우클릭을 한 후 3D Object > Plane 으로 만들어줍니다.

 

 

Plane을 생성하셨으면 Plain의 Inspector 창에서 Transform > Position을 0, 0, 0 으로 바꿔주고, Scale을 5, 1, 5로 설정해줍시다.

 

 

다음은 캐릭터를 만들어줄 차례입니다. 저는 Capsule 오브젝트를 사용하여 만들어주겠습니다.

 

 

Capsule의 이름을 Player로 바꾸고, 위치를 0, 1, 0 으로 설정합니다. Y좌표의 위치가 1인 이유는 Plane의 Y좌표가 0이기 때문에 두 오브젝트가 겹치지 않게 하기 위함입니다. Plane의 Y좌표를 -1로 하고 새로 생성하는 오브젝트의 Y좌표를 0으로 설정해도 무방합니다.

 

 

오브젝트의 이동을 위해서는 오브젝트에 RigidBody라는 컴포넌트가 있어야 합니다. Player의 Inspector 창에서  맨 밑의 Add Component를 누르고 RigidBody를 추가해주도록 합시다.

 

 

이제 본격적으로 Player 오브젝트를 이동시킬 스크립트를 짜주도록 합시다. Script들을 모아둘 수 있도록 Assets 밑에 Scripts라는 폴더를 생성해주겠습니다.

 

 

 

이제 Scripts 폴더 밑에 Player라는  C# Script를 생성해주겠습니다.

 

 

 

 

스크립트 생성 시 주의할 점은 스크립트의 이름과 스크립트 내 클래스 명이 다를 경우 오류가 날 수 있다는 점입니다. 스크립트 이름을 잘못 적어서 변경한다면 꼭 클래스명도 변경해주도록 합시다.

 

다음은 함수 내 코드입니다. 간단한 설명은 주석으로 처리했습니다.

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

public class Player : MonoBehaviour
{
    public float Speed = 10.0f;     // 움직이는 속도. public으로 설정하여 유니티 화면에서 조정할 수 있다.
    
    float h, v;                     // 가로축과 세로축을 담을 변수를 전역변수로 생성. FixedUpdate에서 직접 생성하지 않은 이유는
                                    // 이후 다른 함수에서도 접근할 것이기 때문.

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

    }

    // Update is called once per frame
    void Update()
    {

    }

    // 이동 관련 함수를 짤 때는 Update보다 FixedUpdate가 더 효율이 좋다고 한다. 그래서 사용했다.
    void FixedUpdate()
    {
        // Point 1.
        h = Input.GetAxis("Horizontal");        // 가로축
        v = Input.GetAxis("Vertical");          // 세로축

        // Point 2.
        transform.position += new Vector3(h, 0, v) * Speed * Time.deltaTime;
    }
}

Point 1.

1. Input.GetAxis(string name)

-1.0f 부터 1.0f 까지의 범위의 값을 반환합니다. 즉, 부드러운 이동이 필요한 경우에 사용됩니다.

 

2. Input.GetAxisRaw(string name)

-1, 0, 1 세 가지 값 중 하나가 반환된다. 키보드 값을 눌렀을 때 즉시 반응해야한다면 GetAxisRaw를 사용하면 됩니다.

 

[Edit] -> [Project Settings] -> Input Manager 에 보면 괄호 안에 들어가는 항목들을 확인할 수 있고 수정할 수 있습니다.

 

*출처 : onecoke.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-GetAxis%EC%99%80-GetAxisRaw

 

유니티 :: GetAxis와 GetAxisRaw

1. Input.GetAxis(string name) -1.0f 부터 1.0f 까지의 범위의 값을 반환한다. 즉, 부드러운 이동이 필요한 경우에 사용된다. 2. Input.GetAxisRaw(string name) -1, 0, 1 세 가지 값 중 하나가 반환된다. 키보드..

onecoke.tistory.com

 

기본 설정은 키보드의 상하좌우 화살표와 wasd로 되어있습니다. 임의로 변경할 수 있습니다.

 

Point 2.

 

transform.position은 월드 좌표를 기준으로 해당 스크립트를 가진 오브젝트의 transform의 위치를 설정합니다. 자세한 설명은 notyu.tistory.com/23를 참고하시면 좋습니다.

 

유니티 오브젝트 이동 [기초 1]

오브젝트를 이동하는 방법에 대해 알아보겠습니다. 오브젝트를 이동시키는 방법은 한 가지만 존재하지 않습니다. 코딩 방법, 클래스의 사용에 따라 달라집니다. 2D 이동과 3D 이동하는 방법도 다

notyu.tistory.com

new Vector3(h, 0, v) : h, v값은 Input에 의해 결정되고, 이 결정된 값에 따라 새로운 위치가 Vector를 통해 설정됩니다.

* Speed : 처음 설정한 이동속도를 곱해줍니다.

* Time.deltaTime : 각 컴퓨터마다 처리하는 속도가 다르므로 프레임당 처리속도를 설정하여 모든 컴퓨터에서 처리하는 속도가 동일해주도록 보정하는 역할을 합니다

 

 

스크립트가 완성되었으니, 이 스크립트를 Player에게 부여해주도록 합시다. 스크립트를 플레이어에게 드래그하거나 Inspector 창에서 Add Component할 수 있습니다.

 

주석에서 설명했듯 Speed를 public으로 설정했기 때문에 유니티 화면에서 Speed를 조정할 수 있는 것을 알 수 있습니다.

 

 

스크립트를 부착하였으니 실행해보도록 합시다. 실행 버튼을 누르고 Game화면을 클릭해야 Input이 들어갑니다.

이 때, Capsule 오브젝트를 사용했기 때문에 움직이는 도중 넘어지는 경우가 생길 수 있습니다. 그때는 Player의 Inspector 창에서 RigidBody > Constraints에서 Freeze Rotation 옵션을 체크해주면 됩니다.