Skip to content

Instantly share code, notes, and snippets.

@TsubameUnity
Last active February 21, 2020 04:57
Show Gist options
  • Save TsubameUnity/555c0af5f10557d8399d7d0d82a5f99a to your computer and use it in GitHub Desktop.
Save TsubameUnity/555c0af5f10557d8399d7d0d82a5f99a to your computer and use it in GitHub Desktop.
Prefabに付けておくと、ランタイム時にシーン変更・ゲーム終了時に自動でPrefabを更新する機能
using UnityEngine;
public class RuntimePrefabUpdate : MonoBehaviour
{
#if UNITY_EDITOR
UnityEngine.SceneManagement.Scene scene;
void Start()
{
scene = gameObject.scene;
UnityEngine.SceneManagement.SceneManager.sceneUnloaded += OnSceneUnloaded;
DontDestroyOnLoad(gameObject);
}
void OnDestroy()
{
UnityEngine.SceneManagement.SceneManager.sceneUnloaded -= OnSceneUnloaded;
}
void OnApplicationQuit()
{
PrefabUpdate();
}
void OnSceneUnloaded(UnityEngine.SceneManagement.Scene scene)
{
// 所属シーンが消された
if (this.scene == scene)
{
// 特定タイミングだと正常にPrefabが更新されないので、delayCallで処理を遅延
UnityEditor.EditorApplication.delayCall += () =>
{
// 何かしらのシーンに配置されていないとプレハブが正常に保存できないので、仮シーンを制作
var previewScene = UnityEditor.SceneManagement.EditorSceneManager.NewPreviewScene();
transform.SetParent(null);
// DontDestroyOnLoadを指定すると所属シーンが空になり、HideFlagsがDontSaveInEditorになるので
// 保存できるようにデータを修正
gameObject.hideFlags = HideFlags.None;
UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(gameObject, previewScene);
PrefabUpdate();
UnityEditor.SceneManagement.EditorSceneManager.ClosePreviewScene(previewScene);
};
}
}
// Prefabに変更を適用する
void PrefabUpdate()
{
var prefab = UnityEditor.PrefabUtility.GetPrefabParent(gameObject);
UnityEditor.PrefabUtility.ReplacePrefab(gameObject, prefab, UnityEditor.ReplacePrefabOptions.ConnectToPrefab);
Debug.Log(prefab.name + ": Prefabs Saved. ");
}
#endif
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment