/// <summary> /// アセットをプレハブが置かれているディレクトリの直下のフォルダへ複製します。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="source">複製元のオブジェクト。</param> /// <param name="prefabInstance">プレハブインスタンス。</param> /// <param name="fileName">ファイル名が複製元と異なる場合に指定。</param> /// <returns></returns> internal static T DuplicateAssetToFolder <T>( T source, GameObject prefabInstance, string fileName = "" ) where T : Object { string destinationFileName; if (string.IsNullOrEmpty(fileName)) { var sourceUnityPath = UnityPath.FromAsset(source); if (!sourceUnityPath.IsUnderAssetsFolder || AssetDatabase.IsSubAsset(source)) { destinationFileName = source.name.EscapeFilePath() + ".asset"; } else { destinationFileName = Path.GetFileName(sourceUnityPath.Value); } } else { destinationFileName = fileName; } return(Duplicator.DuplicateAsset( source, destinationPath: Duplicator.DetermineAssetPath(prefabInstance, typeof(T), destinationFileName) )); }
/// <summary> /// アセットの種類に応じて、保存先を決定します。 /// </summary> /// <param name="prefabInstance"></param> /// <param name="type">アセットの種類。</param> /// <param name="fileName">ファイル名。</param> /// <returns>「Assets/」から始まるパス。</returns> internal static string DetermineAssetPath(GameObject prefabInstance, Type type, string fileName = "") { return(Duplicator.DetermineAssetPath( PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(prefabInstance), type, fileName )); }
/// <summary> /// オブジェクトをプレハブが置かれているディレクトリの直下のフォルダへ保存します。 /// </summary> /// <remarks> /// 保存先にすでにアセットが存在していれば上書きし、metaファイルは新規生成しません。 /// </remarks> /// <typeparam name="T"></typeparam> /// <exception cref="ArgumentException">source がすでにアセットとして存在するか、<see cref="AnimatorController"> の場合。</exception> /// <param name="source">オブジェクト。</param> /// <param name="prefabInstance">プレハブインスタンス。</param> /// <param name="destinationFileName">ファイル名がオブジェクト名と異なる場合に指定。</param> /// <returns></returns> internal static T CreateObjectToFolder <T>( T source, string prefabPath, string destinationFileName = null ) where T : Object { var path = AssetDatabase.GetAssetPath(source); if (!string.IsNullOrEmpty(path)) { throw new ArgumentException($"source はすでにアセットとして「{path}」に存在します。", nameof(T)); } if (source is AnimatorController) { throw new ArgumentException($"{nameof(AnimatorController)} は上書きできません。", nameof(T)); } var destinationPath = Duplicator.DetermineAssetPath( prefabPath, typeof(T), destinationFileName ?? source.name.EscapeFilePath() + ".asset" ); var destination = AssetDatabase.LoadMainAssetAtPath(destinationPath); if (destination) { EditorUtility.CopySerialized(source, destination); } else { AssetDatabase.CreateAsset(source, destinationPath); } return(AssetDatabase.LoadAssetAtPath <T>(destinationPath)); }