[Unity] 오브젝트 이동범위 제한하기

스윗포테이토·2023년 1월 6일
1

지난 글에서 키보드 입력을 받아 오브젝트의 위치를 제어해보았는데, 이 오브젝트가 갈 수 있는 범위를 제한하려고 한다.

우선 좌우 화살표 키를 이용해 오브젝트를 이동하는 전체 스크립트는 아래와 같다.

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);
        }
    }
}
profile
나의 삽질이 미래의 누군가를 구할 수 있다면...

0개의 댓글