주녘공부일지

[해피스케치] 카메라 인스펙터 툴 본문

GameDevelopment/[Unity] Project

[해피스케치] 카메라 인스펙터 툴

주녘 2024. 11. 3. 17:10

카메라 인스펙터 툴

해피스케치의 요청에 따라 모션 감지를 이용한 AR게임 프로토타입 모델을 제작하는 과정에서 구현

- 여러 가지 미니게임 스테이지를 구현하여 2명의 사용자가 대전을 하는 AR 멀티 게임

- 기획자가 직접 특정 스테이지의 카메라 세팅 값을 설정하여 Save&Load 할 수 있음

 

- 인게임에서 사용되는 TeamCamera 클래스를 상속받아 CameraEditor를 구현
- 스테이지가 로드되면 저장되어 있던 데이터를 스테이지 시작 시 로드하여 세팅하도록 설계

 

 

 

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

[CustomEditor(typeof(CameraEditor))]
public class EditCamera : Editor
{
    bool isInitUnlocked = false;
    bool isLoadUnlocked = false;
    bool isSaveUnocked = false;

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        CameraEditor cameraEditor = (CameraEditor)target;

        GUILayout.Space(10);
        GUILayout.Label("[ 카메라 에디터 ]", EditorStyles.boldLabel);

        // 초기 값 세팅
        GUILayout.Space(10);
        isInitUnlocked = EditorGUILayout.Toggle("초기 세팅 잠금 해제 ", isInitUnlocked);
        GUILayout.Space(5);
        if (GUILayout.Button("초기 값으로 세팅") && isInitUnlocked)
        {
            isInitUnlocked = false;
            cameraEditor.InitCameraInfo();
            Debug.Log("초기 값으로 세팅 완료");
        }

        // 데이터 불러오기
        GUILayout.Space(5);
        isLoadUnlocked = EditorGUILayout.Toggle("불러오기 잠금 해제 ", isLoadUnlocked);
        GUILayout.Space(5);
        if (GUILayout.Button("데이터 불러오기") && isLoadUnlocked)
        {
            isLoadUnlocked = false;
            if(cameraEditor.LoadCameraInfo())
                Debug.Log("스테이지 데이터 불러오기 완료");
        }

        // 데이터 저장
        GUILayout.Space(5);
        isSaveUnocked = EditorGUILayout.Toggle("저장하기 잠금 해제 ", isSaveUnocked);
        GUILayout.Space(5);
        if (GUILayout.Button("데이터 저장하기") && isSaveUnocked)
        {
            isSaveUnocked = false;
            if (cameraEditor.SaveCameraInfo())
                Debug.Log("스테이지 데이터 저장하기 완료");
        }

        GUILayout.Space(20);
    }
}

 

#if UNITY_EDITOR
using System;
using System.IO;
using UnityEngine;

public class CameraEditor : TeamCamera
{
    [Header ("[ 카메라 세팅 영역 ]")]
    [Space(5f)] [SerializeField] EStageType stageType = EStageType.None;
    [Space(5f)] [SerializeField] BaseObject testTarget;
    [Space(10f)] 
    [Range(0f, 180f)]  [SerializeField] float fieldOfView = 60f;
    [Range(5f, 15f)]   [SerializeField] float targetDistance = 5f;
    [Range(-10f, 10f)] [SerializeField] float cameraHeight = 5f;
    [Range(-10f, 10f)] [SerializeField] float lookAtHeight = 0f;

    private void Update() { ... }
    private void UpdateCameraInfo() { ... }
    
    public override bool Init() { ... }
    public void InitCameraInfo() { ... }
    
    public bool LoadCameraInfo()
    {
        if(stageType == EStageType.None)
        {
            Debug.LogWarning("스테이지 타입이 세팅되지 않았습니다.");
            return false;
        }

        string loadPath = Application.dataPath + DataPath.STAGE_JSONDATA_PATH + $"/CameraData{(int)stageType}.json";
        return base.LoadCameraDataInfo(loadPath);
    }
    
    public bool SaveCameraInfo()
    {
        if (stageType == EStageType.None)
        {
            Debug.LogWarning("스테이지 타입이 세팅되지 않았습니다.");
            return false;
        }

        string savePath = Application.dataPath + DataPath.STAGE_JSONDATA_PATH + $"/CameraData{(int)stageType}";
        Util.Editor_FileDelete(savePath);
        
        string jsonData = JsonUtility.ToJson(cameraInfoData);
        File.WriteAllText(savePath + ".json", jsonData);

        return true;
    }
}
#endif