유니티 버전 : 2020.3.25f1
작업환경 : Mac (Monterey 12.2.1)
유니티에서 기본적인 움직임 구현을 해 볼 예정입니다.
움직임 구현에는 여러가지 방법이 있는데 간단한 것 부터 시작해보려 합니다.
1. Position을 이용한 이동
큐브 오브젝트 하나를 생성합니다. 인스펙터의 Transform을 reset 시켜 오브젝트를 원점에 위치 시킵니다.
저는 scprits라는 폴더를 만들고 안에 스크립트를 작성하는데 이건 편하신대로...
Movement.cs라는 스크립트를 만들어 줍니다.
하이어라키의 Cube를 선택하고 스크립트를 Add Component해줍니다.
Movement.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement : MonoBehaviour
{
public float MoveSpeed = 1f;
// Update is called once per frame
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
//float h = Input.GetAxisRaw("Horizontal");
//float v = Input.GetAxisRaw("Vertical");
Vector3 dir = new Vector3(h, 0, v).normalized;
transform.position += dir * MoveSpeed * Time.deltaTime;
}
}
보시면 Input.GetAxis와 Input.GetAxisRaw가 있는데, Input.GetAxis 약간 밀리게 동작하고 Input.GetAxisRaw는 바로 멈추는 동작합니다. 원하는 동작에 맞춰 작성해주시면 됩니다.
그리고 Horizontal과 Vertical 이 문자열로 써있는데 Progect Settings → Input Manager → Axes를 확인하시면 됩니다.
2. Translate
transform 클래스에 있는 Translate함수를 사용하는 방법입니다.
주로 한방향?으로 이동을 시킬 떄 많이 사용하는 것 같습니다. 저는 1.Position이동과 마찬가지로 작성했습니다.
TranslateMove.cs를 생성하고 작성합니다.
TranslateMove.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TranslateMove : MonoBehaviour
{
public float MoveSpeed = 1f;
private void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 dir = new Vector3(h, 0, v).normalized;
transform.Translate(dir * MoveSpeed);
}
}
3. MoveToWards
Vector3의 MoveToWards를 이용한 방법입니다.
Translate와는 좀 다르게 특정 위치까지 이동시키는 함수입니다. 그래서 방향보다는 도착위치(Target)이 매개변수로 있습니다.
하지만 저는 그대로 dir으로 해봤습니다.
MovetowardsMovement.cs를 생성하고 작성합니다.
MovetowardsMovement.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MovetowardsMovement : MonoBehaviour
{
public float MoveSpeed = 1f;
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 dir = new Vector3(h, 0, v).normalized;
transform.position = Vector3.MoveTowards(transform.position, dir, Time.deltaTime * MoveSpeed);
}
}
위처럼 작성한다면 1만큼이동하고 다시 가운데(원점)로 오는 재밌는 동작이 나타나는데, 이유는 간단합니다.
입력에 따라 dir의 값이 변화하는데 입력이 되지 않는다면 다시 (0,0,0)이 됩니다. 현재 Target위치를 dir으로 설정했기 때문에 다시 원점으로 오게 됩니다.
4. CharaterController
좀 있어보이는? CharaterController를 이용한 움직임 구현입니다.
CharaterMove.cs를 생성하고 작성합니다.
CharaterMove.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement : MonoBehaviour
{
public float MoveSpeed = 1f;
// Update is called once per frame
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
//float h = Input.GetAxisRaw("Horizontal");
//float v = Input.GetAxisRaw("Vertical");
Vector3 dir = new Vector3(h, 0, v).normalized;
transform.position += dir * MoveSpeed * Time.deltaTime;
}
}
중력값을 넣어서 하는 방법도 있지만 그건 점프를 구현할 때 해보도록 하겠습니다.
감사합니다.
'유니티' 카테고리의 다른 글
Unity HexGrid (0) | 2022.05.16 |
---|---|
유니티 동영상 재생 + Youtube(유료 에셋) (0) | 2022.04.21 |
유니티 PlanarReflection (0) | 2022.04.20 |
유니티 Laser reflection 구현 (0) | 2022.04.19 |
유니티 에셋 번들 사용법(Unity AssetBundle) (0) | 2022.04.07 |