2025-04-25 21:14:54 +09:00

63 lines
2.0 KiB
C#

using System;
using System.IO;
using UnityEditor;
using UnityEngine;
namespace UniGLTF.MeshUtility
{
// Instantiate
class PrefabContext : IDisposable
{
public readonly GameObject Instance;
readonly UnityPath _assetFolder;
public bool Keep = false;
public string AssetFolder => _assetFolder.Value;
public PrefabContext(GameObject prefab, UnityPath assetFolder)
{
this._assetFolder = assetFolder;
this.Instance = GameObject.Instantiate(prefab);
if (PrefabUtility.IsOutermostPrefabInstanceRoot(this.Instance))
{
// どういう条件でここに来るかはよくわからない
PrefabUtility.UnpackPrefabInstance(this.Instance, PrefabUnpackMode.Completely, InteractionMode.AutomatedAction);
}
}
// - Instance を Asset に書き出す
// - Instance を削除する
public void Dispose()
{
if (Keep)
{
// for debug
return;
}
UnityEngine.Object.DestroyImmediate(Instance);
}
public static UnityPath GetOutFolder(GameObject _exportTarget)
{
// 出力フォルダを決める
var folder = "Assets";
var prefab = _exportTarget.GetPrefab();
if (prefab != null)
{
folder = AssetDatabase.GetAssetPath(prefab);
// Debug.Log(folder);
}
// 新規で作成されるアセットはすべてこのフォルダの中に作る。上書きチェックはしない
var assetFolder = EditorUtility.SaveFolderPanel("select asset save folder", Path.GetDirectoryName(folder), "Integrated");
var unityPath = UniGLTF.UnityPath.FromFullpath(assetFolder);
if (!unityPath.IsUnderWritableFolder)
{
throw new Exception("not in asset folder");
}
return unityPath;
}
}
}