うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】GUID を変更せずにファイルを置き換える拡張

あらまし

Unity で Asset (例えば画像ファイル) を入れ替える際に Finder や Explorer から
ドラッグアンドドロップ を行いファイルを入れ替えることがあると思う

その際にファイル名が **** 1 になってしまい、前のファイルを消して
再度ファイル名を変更したり

f:id:hacchi_man:20200120234539p:plain:w300

Reveal in Finder を用いて画像を上書きしたり面倒なことがある

f:id:hacchi_man:20200120234736p:plain:w300

Assets メニューに置換メニューを追加

ファイルを右クリックした際のメニューに Replace Selection Asset を追加し

f:id:hacchi_man:20200120235542p:plain:w300

これを選ぶことで、同じ拡張子のフィルターがかかったファイル選択パネルが表示される

f:id:hacchi_man:20200120235718p:plain:w300

開いたパネルよりファイルを選ぶことでファイル名が異なっていたとしても
元のファイル名に置換してコピーをする

f:id:hacchi_man:20200120235808p:plain:w300

これにより、GUIDも変更されず meta も更新されないためファイル更新時の手間を減らすことができる

複数ファイルを選択した場合でも、1ファイルずつ置換するファイルを選択することができる

ソースコード

Windows PC が無いため、動作確認を Mac で行っておりWindows PC で動作するか不明

using UnityEditor;
using UnityEngine;
using System.IO;
 
public class ReplaceAssetMenu
{
    [MenuItem("Assets/Replace Selection Asset")]
    private static void Replace()
    {
        var objects = Selection.objects;
        foreach (var selectObj in objects)
        {
            var path = AssetDatabase.GetAssetPath(selectObj);
  
            if (string.IsNullOrEmpty(path))
                continue;
  
            var fullPath = Application.dataPath.Replace("/Assets", "/" + path);
            var ext = Path.GetExtension(path).Substring(1);
            var fileName = Path.GetFileName(path);
            var sourcePath = EditorUtility.OpenFilePanel("Select Replace Asset\n" + fileName, "", ext);
 
            if (string.IsNullOrEmpty(sourcePath))
                continue;
  
            File.Copy(sourcePath, fullPath, true);
        }
        
        AssetDatabase.Refresh();
    }
}