반응형
InitializeOnLoad를 이용하면 Play 실행 시 에디터의 코드를 실행할 수 있다.
아래의 스크립트를 누르고 Play를 눌러보자.
using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;
[InitializeOnLoad]
public class AutoSaveSceneBeforePlay : MonoBehaviour
{
static AutoSaveSceneBeforePlay()
{
Debug.Log("Up and running");
}
}
이제 playModeStateChanged에 이벤트를 추가해보자.
플레이 버튼을 누르고 종료하면 아래와 같은 로그를 볼 수 있다.
using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;
[InitializeOnLoad]
public class AutoSaveSceneBeforePlay : MonoBehaviour
{
static AutoSaveSceneBeforePlay()
{
EditorApplication.playModeStateChanged += saveCurrentScene;
}
private static void saveCurrentScene(PlayModeStateChange state)
{
Debug.Log(state);
}
}
Play 버튼을 눌러 Editor의 State가 변경될 때마다 로그가 호출되고 있다.
이제 저장하는 코드를 작성해보자.
현재 에디터를 실행하면 Scene을 저장하려고 한다.
이것은 EditorApplication의 isPlaying과 isPlayingOrWillChangePlaymode로 판단할 수 있다.
isPlaying은 에디터가 재생 모드인지 알 수 있는 bool 값이다.
isPlayingOrWillChangePlaymode은 에디터가 현재 재생 모드 또는 재생 모드로 전환하려는지의 여부다.
using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;
[InitializeOnLoad]
public class AutoSaveSceneBeforePlay : MonoBehaviour
{
static AutoSaveSceneBeforePlay()
{
EditorApplication.playModeStateChanged += saveCurrentScene;
}
private static void saveCurrentScene(PlayModeStateChange state)
{
Debug.Log("state : " + state
+ "/ isPlaying : " + EditorApplication.isPlaying
+ "/ isPlayingOrWillChangePlaymode : " + EditorApplication.isPlayingOrWillChangePlaymode);
}
}
에디터를 실행하고 종료하면 아래와 같은 로그를 볼 수 있다.
따라서 현재 실행중이 아니고(isPlaying == false)
Playmode로 전환하려고 할 때(isPlayingOrWillChangePlaymode == true) 현재의 씬을 저장한다.
현재 씬은 GetActiveScene으로 구할 수 있다.
if (EditorApplication.isPlaying == false
&& EditorApplication.isPlayingOrWillChangePlaymode == true)
EditorSceneManager.SaveScene(EditorSceneManager.GetActiveScene());
최종 코드는 아래와 같다.
using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;
[InitializeOnLoad]
public class AutoSaveSceneBeforePlay : MonoBehaviour
{
static AutoSaveSceneBeforePlay()
{
EditorApplication.playModeStateChanged += saveCurrentScene;
}
private static void saveCurrentScene(PlayModeStateChange state)
{
Debug.Log("state : " + state
+ "/ isPlaying : " + EditorApplication.isPlaying
+ "/ isPlayingOrWillChangePlaymode : " + EditorApplication.isPlayingOrWillChangePlaymode);
if (EditorApplication.isPlaying == false
&& EditorApplication.isPlayingOrWillChangePlaymode == true)
EditorSceneManager.SaveScene(EditorSceneManager.GetActiveScene());
}
}
아래와 같이 재생 버튼을 누르면 TestScenes의 *이 사라지는 것을 볼 수 있다.
Unity Plus:
Unity Pro:
Unity 프리미엄 학습:
반응형
'개발 > Unity' 카테고리의 다른 글
유니티 UI - 간단한 토스트 메시지 만들기 (Toast Message) (0) | 2022.03.14 |
---|---|
유니티 - Line Renderer로 게임 오브젝트끼리 연결하기 (연결 선 그리기) (0) | 2022.03.12 |
유니티 스크립트 추상 클래스와 상속 (0) | 2022.03.10 |
유니티 더블 클릭 구현하기 (Unity Double Click) (1) | 2022.03.09 |
유니티 - 게임 오브젝트 기준으로 카메라 움직이기 (0) | 2022.03.07 |
댓글