BuildSettings에서 Scene 변환에 사용되는 Scene 이름을 읽는 편집기 확장

9363 단어 UnityC#
우선, Scene 변환은 일반적으로
        SceneManager.LoadScene("遷移先のScene名");
쓰여 있다.
string을 코드에 직접 쓰는 것은 typo의 발생과 Scene 이름의 변경이 약하다는 문제점이 있기 때문에 Build Settings에서 Scene의 Path를 읽고 밑에 있는 메뉴의Property Attribute를 만들었습니다.
SceneChangerAttribute.cs
using UnityEngine;
#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
#endif

class SceneChangerAttribute : PropertyAttribute { }
#if UNITY_EDITOR
[CustomPropertyDrawer(typeof(SceneChangerAttribute))]
public class SceneChangerEditor : PropertyDrawer
{
    //Scene名のList
    List<string> AllSceneName
    {
        get
        {
            List<string> sceneNames = new List<string>();
            //BuildSettingsからSceneのPathを読み込む
            List<string> AllPaths = (from scene in EditorBuildSettings.scenes where scene.enabled select scene.path).ToList();
            //PathからScene名を切り出す
            foreach (string x in AllPaths)
            {
                int slash = x.LastIndexOf("/");
                int dot = x.LastIndexOf(".");
                sceneNames.Add(x.Substring(slash + 1, dot - slash - 1));
            }
            return sceneNames;
        }
    }
    //ドロップダウンメニューの作成
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        var list = AllSceneName;
        var selectedIndex = list.FindIndex(item => item.Equals(property.stringValue));
        if (selectedIndex == -1)
        {
            selectedIndex = list.FindIndex(item => item.Equals(list[0]));
        }

        selectedIndex = EditorGUI.Popup(position, label.text, selectedIndex, list.ToArray());

        property.stringValue = list[selectedIndex];
    }
}
#endif
사용할 때는 위의 ScenneChangerAttribute를 참조하십시오.다음과 같이 Unity 프로젝트에 cs를 배치합니다(예: Buton에서 Scene 마이그레이션을 수행하려는 경우).
SceneChanger4Button.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class SceneChanger4Button : MonoBehaviour
{
    //どんな名前でもいいのでstring型のフィールドに付ける
    [SerializeField, SceneChangerAttribute]
    string _NextScene;

    void OnClick()
    {
        SceneManager.LoadScene(_NextScene);
    }
}

이렇게 하면 BuildSettings에 추가된 Scene의 이름이 표시됩니다.
장점은 typo와 편집기에서 목적지 이동을 알지 못하는 것이다.
단점은 BuildSettings에서 Scene의 순서를 바꾸면 대응이 안 되고 다시 설정해야 한다는 것이다. 다만 제목에 사용된 Scene을 0으로 설정한 것 외에 순서를 바꾸는 경우가 거의 없기 때문에 큰 영향은 없을 것 같다.
참고 문헌
요약 메모리 Unity의 Attribute(속성)

좋은 웹페이지 즐겨찾기