[Unity/作業効率化][コピー可]未使用アセットの一括削除

Unity

皆さんはUnityの未参照(未使用)アセットを削除したい時ってありますよね。そんな時にどのように未参照(未使用)ファイルを探していますか?プロジェクトが大きくなるにつれて、どこにどんなファイルがあるのか、そのファイルはどこの参照を持っているのかを調べるのは大変ですよね。
今回は未参照(未使用)アセットを一括で削除する方法をご紹介します。

まず未参照(未使用)アセットの調べ方

未参照(未使用)アセットはつまり、どこにもアタッチされていないアセットのことを言います。
例えば、あるプレハブを作りました。そのプレハブにいろんな画像がアタッチされているとします。とある時に、UI変更により、その中のある画像Aをプレハブから外しました。仮に画像Aは他にアタッチしているプレハブはない場合、その時点で画像Aはどこにも使われていない画像、つまり未参照(未使用)のアセットになってしまうわけですね。
プロジェクトはまだ初期の段階でしたら、その時点で消せばいいですがプロジェクトが大きくなってくると、どうしても画像Aのような未参照アセットがどこかに溜まってしまいがちです。
そこで未参照ファイルの調べ方ですが、私はいつもアセットのguidを調べて、そのguidに紐付いているファイル一覧を出して、もし紐付いているファイルがなければ、削除するといった流れでやっています。

guidはいわゆるファイルの身分証明書みたいなもので、Unityではこのguidでアセットを管理しています。すべてのファイルに固有のguidを持っています。guidは各々のファイルのmetaファイルに書いてあります。
  1. catコマンドでmetaファイルの中身を表示してguidを取得する
  2. 取得したguidを使ってgit grep guidコマンドでそのファイルの参照ファイル一覧を出す
  3. 参照ファイルがなければ、手動で削除する

% cat /Users/ユーザー名/プロジェクト/Assets/Resources/ItemData/BombData.asset.meta

fileFormatVersion: 2
guid: df8f84e06cb0d4cc09bba3536c01d59f  <=これをコピー
NativeFormatImporter:
  externalObjects: {}
  mainObjectFileID: 11400000
  userData:
  assetBundleName:
  assetBundleVariant:

% git grep df8f84e06cb0d4cc09bba3536c01d59f
Assets/Prefabs/Items/Bomb_item.prefab:    itemInfoData: {fileID: 11400000, guid:
df8f84e06cb0d4cc09bba3536c01d59f, type: 2}
Assets/Prefabs/Items/use_Bomb_item.prefab:    itemInfoData: {fileID: 11400000, guid:
df8f84e06cb0d4cc09bba3536c01d59f, type: 2}
Assets/Resources/ItemData/BombData.asset.meta:guid: df8f84e06cb0d4cc09bba3536c01d59f

上記はgitを使って調べる方法ですが、もしgitを使ってない場合はag(The Silver Searcher)を使えば同じことができます。

ag(The Silver Searcher)は高速な文字列検索、ファイル検索ツールです。詳細はこちらの記事でまとめました!

一括削除の仕方(シェル)

guidで検索して紐付いているファイルがなければ削除するとお伝えしましたが、これだと手間が掛かってファイルが大量にある時に、とても効率的とは言えません。しかも、どのファイルが未使用なのかは結局手動で調べないと分からないじゃ、とてもじゃないがやる気が失せってしまいますよね。
そこで、「未参照のファイルを一覧化し、削除できるシェル」を作りました。
以下はそのシェルの中身です。そのままコピーして使っていただいて構いません!
※前提として前出したag(The Silver Searcher)をインストールしておくこと

#!/bin/sh

#第一引数
# 削除したいアセットのディレクトリを指定。例: "/Users/ユーザー名/Unityプロジェクトのディレクトリ/Assets/texture/*"
#第二引数
# 検索範囲の指定。例:プロジェクト全体を範囲として検索したい場合は /Users/ユーザー名/Unityプロジェクトのディレクトリ/
<< howToUse
前提:ag(The Silver Searcher)をインストールしておくこと
ag(The Silver Searcher)とは https://tomi-no-tubuyaki.com/game-develop/command/about_ag_silver_searcher/
sh unRefAssetCleaner.sh 第一引数 第二引数
howToUse

ESC=$(printf '\033')

#削除対象リスト
removeList=()

checkNoRefResource(){
    refCount=$(cat $1 | grep "guid" | awk -v searchPath=$2 '
        {
            print $2 FS searchPath
        }
    ' | ag $(cat) | wc -l)
    rmTarget=$(echo $1 | sed s/.meta//g)

    if [ $refCount -lt 2 ]; then
        printf "${ESC}[31m%s %s%s %s${ESC}[m\n" $rmTarget 参照数 $((refCount - 1)) 削除予定
        removeList+=($rmTarget)
    else
        echo $rmTarget 参照数 $((refCount - 1))
    fi
}

removeResource(){
    if [ ${#removeList[*]} -eq 0 ]; then
        exit 0
    fi
    read -n1 -p "Would you like to remove unref asset? (y/N): " yn
    if [[ $yn = [yY] ]]; then
      for file in ${removeList[@]};
      do
          metaFile=$file".meta"
          printf "\n${ESC}[31m%s %s${ESC}[m" "remove" $file
          rm $file $metaFile
      done
    else
      echo " abort"
    fi
}

assetPath=$1
searchPath=$2
files=`find $assetPath -maxdepth 0 -type f -name *.meta`
for file in $files;
do
    checkNoRefResource $file $searchPath
done
removeResource

未参照ファイルを一括で削除するシェルの使い方

上記のコードをコピーしてunRefAssetCleaner.shなど任意のファイル名で保存してください。
保存したらターミナルを起動し、以下のコマンドを打つと指定のディレクトリ下にあるファイル群を検索し、ファイルの参照結果を表示してくれます。未参照未使用のファイルは赤く表示され、最後にWould you like to remove unref asset? (y/N)と聞かれるので、削除しても問題ないようであればyを入力し一括で削除してくれます。逆に削除したくない場合はnを入力すれば中断します。

#コマンド例:
#未使用のItemData(scriptableObject)を削除する

sh unRefAssetCleaner.sh “/Users/ユーザー名/プロジェクト/Assets/Resources/ItemData/*” /Users/ユーザー名/プロジェクト/Assets/ 


#出力結果
/Users/ユーザー名/プロジェクト/Assets/Resources/ItemData/BombData.asset 参照数 2
/Users/ユーザー名/プロジェクト/Assets/Resources/ItemData/HeartData.asset 参照数 1
/Users/ユーザー名/プロジェクト/Assets/Resources/ItemData/MagnetData.asset 参照数 2
/Users/ユーザー名/プロジェクト/Assets/Resources/ItemData/SmallKeyData.asset 参照数 2
/Users/ユーザー名/プロジェクト/Assets/Resources/ItemData/testItemData1.asset 参照数0 削除予定
/Users/ユーザー名/プロジェクト/Assets/Resources/ItemData/testItemData2.asset 参照数0 削除予定

Would you like to remove unref asset? (y/N):y

remove /Users/ユーザー名/プロジェクト/Assets/Resources/ItemData/testItemData1.asset
remove /Users/ユーザー名/プロジェクト/Assets/Resources/ItemData/testItemData2.asset

まとめ

  • 上のシェルスクリプトをコピーし、任意のファイル名で保存する
  • ターミナルで下記のコマンドを打つ、第一引数はダブルクォーテーションで囲んでください
    • sh 保存したファイル名.sh “削除検索したいディレクトリ/*” 検索範囲ディレクトリ
  • 各ファイルの参照数が表示され、未参照のファイルは赤く表示される
  • 最後にWould you like to remove unref asset? (y/N):と聞かれ
    • yで削除。nで中断する

Unityの未参照ファイルの削除に是非試してみてください!

シェルスクリプト書籍紹介

コメント

タイトルとURLをコピーしました