[유니티 커스텀] 좌표 이동 툴

양규빈·2023년 12월 1일

유니티

목록 보기
8/34
post-thumbnail

필요성

기능 개발 구현 후 정상적으로 작동하는지 확인하기 위해서 오픈월드 및 던전에서 활동하는 RPG 게임을 제작하다보면, 필연적으로 플레이어블 캐릭터 객체를 이동하는 행위를 빈번하게 하게 됩니다.

캐릭터를 조이스틱와 터치패드로 이동을 하는 반복되는 작업의 누적은 시간의 손실로 다가오게 되고, 일련의 과정을 단축시키기 위한 간단한 아이디어를 떠올렸습니다.

캐릭터를 목표 좌표로 바로 이동시키는 것입니다.

다만, 인게임 플레잉 중, 좌표를 건드는 것은 위험성이 있습니다.
x축 - z-축 - y축을 순차적으로 수정하다보면, 목표한 지점에서 벗어나 추락할 수 있기 때문입니다.
(캐릭터에는 중력이 작용되고 있습니다.)

따라서, 객체 이동은, 모든 좌표를 한번에 입력하여, 입력받은 값을 토대로 Transform을 해야 했습니다.

이를 위한, 간단한 커스텀 툴을 제작했습니다.

사용

GameObjects는 gameobject 컴포넌트 인스턴스를 저장할 수 있는 리스트 입니다.
리스트 초기화 버튼을 누르면, 리스트를 Clear 합니다.

좌표는 수동으로 값을 입력하거나,
개발자가 하이어라키 상에서 선택한 객체의 월드좌표를 복사하여 저장할 수 있습니다.

객체 이동하기 버튼을 누르면 이렇게 입력한 좌표 값으로 객체를 이동시킵니다.

이동할 객체를 리스트에 넣습니다.

목표 오브젝트를 클릭한 후에, 좌표 복사 버튼을 눌러, 월드 좌표를 따옵니다.

이후, 객체 이동하기를 누르면 다음과 같이 이동이 완료됩니다.

코드

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

public class ECTransformObject : EditorWindow
{
    private bool _bEditOn = true;

    [SerializeField]
    public List<GameObject> ins_GameObjects = new List<GameObject>();

    [MenuItem("Tools/ECTransformObject")]
    private static void Open()
    {
        ECTransformObject win = GetWindow<ECTransformObject>();
        win.titleContent = new GUIContent("Transform tool");
        win.Show();
    }

    private void OnEnable()
    {
        _bEditOn = true;
    }

    private void OnDisable()
    {
        _bEditOn = false;
    }

    private Vector3 _newPosition;

    private void OnGUI()
    {
        if (!_editor)
        {
            _editor = Editor.CreateEditor(this);
        }

        if (_editor)
        {
            _editor.OnInspectorGUI();
        }

        if (GUILayout.Button("리스트 초기화"))
        {
            ClearObjectList();
        }

        EditorGUILayout.Space();

        GUILayout.Label("Transform Object", EditorStyles.boldLabel);

        EditorGUILayout.BeginHorizontal();

        if (GUILayout.Button("현재 선택된 객체의 좌표 복사"))
        {
            CopySelectedObjectPosition();
        }

        _newPosition = EditorGUILayout.Vector3Field("이동할 좌표", _newPosition);

        EditorGUILayout.EndHorizontal();

        if (GUILayout.Button("객체 이동하기"))
        {
            MoveSelectedObjects();
        }
    }

    private void MoveSelectedObjects()
    {
        foreach (var obj in ins_GameObjects)
        {
            if (obj != null)
            {
                Undo.RecordObject(obj.transform, "Move Object");
                obj.transform.position = _newPosition;
            }
        }
    }

    private void ClearObjectList()
    {
        ins_GameObjects.Clear();
    }

    private void CopySelectedObjectPosition()
    {
        if (Selection.activeTransform != null)
        {
            _newPosition = Selection.activeTransform.position;
        }
    }

    private Editor _editor;
}
profile
훌륭한 개발자를 꿈꾸는 중입니다

0개의 댓글