지난 글에서 키보드 입력을 받아 오브젝트의 위치를 제어해보았는데, 이 오브젝트가 갈 수 있는 범위를 제한하려고 한다.
우선 좌우 화살표 키를 이용해 오브젝트를 이동하는 전체 스크립트는 아래와 같다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float horizontalInput;
private float speed = 20.0f;
void Update() {
horizontalInput = Input.GetAxis("Horizontal");
transform.Translate(Vector3.right * Time.deltaTime * speed * horizontalInput);
}
}
x좌표의 이동 범위를 [-10, 10]으로 제한하려고 할 때, 처음 생각난 방법은 아래와 같다.
if (-10 < 위치 < 10) {
// 이동하기
}
그러나 위와 같이 코드를 작성한 후 플레이해보면 무언가 이상할 것이다.
경계에 멈춰서기는 하는데, 한번 경계에 걸리면 다시 안쪽으로 돌아오지 않고 멈춰버리는 것이다.
오동작하는 이유를 값으로 설명해보겠다. 만약 캐릭터를 오른쪽으로 계속 움직였다면, x가 10에 가까워지다가 어느 순간(x = 9.9999) 조건문을 통과해 오른쪽으로 "조금" 더 이동해 10을 넘어서게(x = 10.000001) 된다. 그럼 이후로는 범위([-10, 10]) 조건문을 통과하지 못해서 이동할 수 없게 되는 것이다.
따라서 로직을 수정해보겠다.
if (위치 < -10) {
// 위치 -10으로 강제 이동
}
else if (위치 > 10) {
// 위치 10으로 강제 이동
}
이렇게 되면 캐릭터가 순간 경계값을 넘더라도, 다음 Update에서 위치가 10으로 이동되기 때문에 다시 컨트롤할 수 있다.
완성된 전체 코드는 아래와 같다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
public float horizontalInput;
private float speed = 20.0f;
private float xRange = 10;
// Update is called once per frame
void Update() {
// 왼쪽 경계를 넘어간 경우
if (transform.position.x < -xRange) {
transform.position = new Vector3(-xRange, transform.position.y, transform.position.z);
}
// 오른쪽 경계를 넘어간 경우
else if (transform.position.x > xRange) {
transform.position = new Vector3(xRange, transform.position.y, transform.position.z);
}
// 경계 내부에 있는 경우
else {
horizontalInput = Input.GetAxis("Horizontal");
transform.Translate(Vector3.right * Time.deltaTime * speed * horizontalInput);
}
}
}