유니티는 Input Manager 키를 불러와서 GetAxis로 수치화 한 후 이를 Vector 에 적용시킬 수 있다.
(참고 : Input Manager와 GetAxis https://greenchoco.tistory.com/221)
(참고 : Vector https://greenchoco.tistory.com/142)
아래와 같이 스크립트를 작성하고 오브젝트에 적용하면 해당 오브젝트는 방향키로 움직일 수 있게 된다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public float moveSpeed;
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
transform.position += new Vector3(h, 0, v) * moveSpeed;
}
}
InputManager 에서 방향키와 WASD 키를 불러오기 위해 "Horizontal"와 "Vertical"를 인수로 사용했다.
GetAxis로 버튼 값을 수치화 하여 h와 v 변수를 만든다.
transform의 position을 Vector3에 입력된 변수 h와 v의 수치로 움직인다.
moveSpeed 라는 속도 변수를 하나 만들어주고, 그 수치를 Vector3에 곱하여 속도를 조절하도록 한다.
movoSpeed 변수를 public를 써서 인스펙터에서 직접 조절할 수 있다.
처음 moveSpeed의 기본상태는 이렇게 0으로 되어있기 때문에 방향키를 움직여도 움직이지 않는다.
0.03 정도로 입력하면 딱 좋은 속도가 된다.
이때 방향키와 WASD 로 움직이면 앞뒤오른쪽왼쪽으로 움직이고, 화살표 두개를 동시에 누르면 그 사이로 움직이게 되는데, 대각선으로 움직이게 되면 이동하는 속도가 더 빠르게 된다.
(수학적으로 계산하기 때문에 대각선이 당연히 빠를수밖에 없다.)
위의 스크립트에 dir과 Normalize를 사용해 수정해주면 된다.
dir는 dir.normarlized로, normarlized 변수를 사용하는데, dir 값을 정규화하여 dir 에 할당하는 것이고,
dir.Normarlize() 함수는 dir 값을 정규화해서 반환하는 것이다.
수정된 스크립트는 아래와 같다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public float moveSpeed;
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 dir = new Vector3 (h, 0, v);
dir.Normalize();
transform.position += dir * moveSpeed;
}
}
Vector3을 dir 변수로 선언했고, dir.Normalize()함수를 써서 dir 값을 정규화해서 반환한다.
정규화된 dir에 속도 moveSpeed를 곱하면 대각선 가로세로 모두 속도가 같아진다.
컴퓨터 성능에 따라 이동속도가 다른 경우도 있다. 이는 deltaTime으로 해결하면 된다.
유니티 C# 코딩시 기본적으로 생기는 Start와 Update 메서드 중 Update는 프레임마다 실행된다.
프레임은 정지된 화면을 뜻하는데, 1초에 나타나는 프레임 수가 적을수록 끊켜보이고 많을수록 부드럽게 보인다.
1초당 보여주는 프레임 수를 Frames Per Second 라고 하는데, 줄여서 FPS 라고 한다.
FPS는 기기마다 다르기 때문에 프레임마다 실행되는 Uptate함수는 기기마다 다른 횟수만큼 실행될 수밖에 없다.
예를들어 20FPS와 50FPS인 컴퓨터가 있다면 50FPS가 훨씬 빠르게 움직이게 된다.
이러한 Update의 프레임 사이 간격를 조절할 수 있는 것이 바로 Time.deltaTime 이다.
Time 클래스에 있는 deltaTime변수는 이전 프레임에서 현재 프레임까지 도달하는 시간으로, 프레임 길이라고 할 수 있다.
Time.deltaTime를 쓰면 프레임만큼 다시 나누기 때문에 속도는 동일해진다.
사용법은 마지막 속도에 Time.deltaTime만 곱해주면 된다.
따라서 최종 스크립트는 아래와 같다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public float moveSpeed;
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 dir = new Vector3 (h, 0, v);
dir.Normalize();
transform.position += dir * moveSpeed * Time.deltaTime;
}
}
이렇게 되면 모든 컴퓨터에서 동일한 속도로 움직일 수 있다.
참고로 Time.deltaTime으로 프레임 시간을 조절할 수도 있는데, 다른 예시는 아래와 같다.
https://greenchoco.tistory.com/170
'유니티 C# > C#' 카테고리의 다른 글
C#기초 - isTrigger에 따른 OnCollision함수와 OnTrigger함수 (0) | 2024.04.30 |
---|---|
C#기초 - Addforce함수와 ForceMode 종류 (0) | 2024.04.30 |
C#기초 - 이동 함수와 인수 종류 (키보드, 마우스, 모바일) (1) | 2024.04.26 |
C#기초 - Destroy 함수 사용법 (0) | 2024.04.23 |
C#기초 - FindObjectOfType 함수 사용법 (0) | 2024.04.23 |
댓글