【Unity】インポートしたパッケージ内のタグも自動で追加される(ように見える)

【Unity】インポートしたパッケージ内のタグも自動で追加される(ように見える)

もうタイトルで完結してるような気もするけど、Unityでカスタムパッケージをインポートした時にはタグも一緒にインポートしてくれるように見えます。

例えばプロジェクトAで自作タグをつけたPrefabをパッケージ化し、それを新規プロジェクトBでインポートすれば、ちゃんとタグが保持されたままとなります。

が、プロジェクトを閉じるとタグがいなくなっていたりと、自分でタグを追加するときと動きが異なるので注意。

 

環境

macOS 10.13 High Sierra

Unity2018.1.0f2

実験してみる

実際にやってみよう。

タグの追加

まずは既存のプロジェクトでタグを追加します。任意のゲームオブジェクトを選択し、[Add Tag…]を選択。

AddTagからタグを追加する
AddTagからタグを追加する

 

タグの追加画面が現れるので[+]をクリックして新規にタグを作ります。

既に色々とあるけど気にしない
既に色々とあるけど気にしない

 

ホバーウィンドウでタグ名の入力ができるので、任意の名前を入れます。ここでは分かりやすく『TagImport』にしました。入力したら[Save]をクリック。

タグ名を入れる
タグ名を入れる

 

これで『TagImport』が追加されました。

タグが追加された
タグが追加された

 

ゲームオブジェクトに戻って、タグのプルダウンから『TagImport』を選択します。

新しいタグを選択
新しいタグを選択

 

パッケージのエクスポート

続いてこのゲームオブジェクトをPrefabにします。SceneウィンドウからProjectウィンドウにドラッグ&ドロップします。

Prefabにする
Prefabにする

 

パッケージのエクスポートは、メニューバーから[Assets] -> [Export Package…]を選択します。

パッケージのエクスポート
パッケージのエクスポート

 

オブジェクトが選択状態の時にパッケージのエクスポートをしようとすると、その選択されたオブジェクトだけがエクスポート対象となります。もし他にもエクスポートしたいオブジェクトがあるなら、選択状態を解除してからエクスポートしましょ。

ここでは[Export…]をクリック。

Prefabだけ選択している状態
Prefabだけ選択している状態

 

パッケージの出力先を選択します。パッケージ名はお好みで。パッケージを作成したら、新規プロジェクトでインポートします。

パッケージ名の入力
パッケージ名の入力

 

新規プロジェクトでインポート

せっかくなので新しくプロジェクトを作ります。

新規プロジェクトでインポートする
新規プロジェクトでインポートする

 

インポートの前に、デフォルトで存在する『Directional Light』を使ってタグチェックをしておきます。新規プロジェクトなので、『TagImport』は存在しません。

デフォルトのタグだけ
デフォルトのタグだけ

 

次にパッケージをインポートします。メニューバーから[Assets] -> [Import Package] -> [Custom Package…]を選択。

パッケージのインポート
パッケージのインポート

 

パッケージを選択して[Open]をクリックします。

先ほど作ったパッケージを選択
先ほど作ったパッケージを選択

 

パッケージの内容を確認して[Import]をクリックします。

Prefabがいることを確認
Prefabがいることを確認

 

インポートが完了したら、再び『Directional Light』からタグチェック。今度は『TagImport』が増えています。やったぁ!

タグが増えた
タグが増えた

 

ところがどっこい

さっきの状態で終わってくれれば何も問題はないのですが、一度プロジェクトを閉じて開きなおすと……。

いなくなってる!
いなくなってる!

 

どうやら自分で『Add Tag…』した時とは動きが違うようです。

開き直した後、インポートしたオブジェクトを一度クリックし、再度『Directional Light』からタグチェックすると、今度はリストに表示されました。

Prefabに触ると復活
Prefabに触ると復活

 

うーん……。

シーン内にPrefabがいると保持される

Scene内にインポートしたPrefabをインスタンス化した状態でプロジェクトを開き直した場合は、タグの一覧に『TagImport』がいるままでした。

シーン内のオブジェクトはタグの情報も読み込んでくれるのかしら。

自分でタグを追加した場合は、シーン内に該当のタグのオブジェクトがいてもいなくても、プロジェクトを開き直した時にちゃんとタグを読み込んでいました。

となると、インポートしたオブジェクトのタグはメモリ上に保持されているのかな。

問題はあるか

スクリプトから操作する時には、タグマネージャーに登録されたタグでない場合にエラーが出ます。

UnityException: Tag: <タグ名> is not defined.

スクリプトリファレンスのGameObject.tagにも、『タグを使う前にタグマネージャーで宣言してね』とあるので、宣言しておく必要があります。

実例はこちら。

これの何が問題かというと、例えばタグを使ってゲームオブジェクトを特定するスクリプトを作成した時、prefabがインポートされた直後は問題なくても、Unityを再起動したら動かなくなった、なんてことが起こり得ます。

PrefabがSceneでインスタンス化される前にタグを使ってしまうとエラーが出るため、ゲーム実行をする前にProjectウィンドウから手動で触るか、タグを使う前にInstansiateを終えておかないといけません。

スクリプトから何か対応するのは大変なので、インポートしたら手動でタグを追加しておくと安心かも。

まとめ

プロジェクトをいじっていて気になったので、パッケージインポートの時のタグについてメモ。

タグが中心の話でしたが、画面キャプチャを撮りまくったせいでパッケージのインポート・エクスポート講座みたいになっちゃいました。

最初に見つけたときは「親切だ!」なんて思いましたが、プロジェクトを開き直したら消えたりと、そんなことはなかったです。

アセット作ってます!

CTA-IMAGE

Unityでの開発に役立つアセットを作っています。

3DダンジョンRPGを開発するスピードを200%加速するAssetや、ファンタジーRPGのダンジョンを彩るパーツを取り揃えています。

特に3DダンジョンRPGのゲームを1から作るのは結構時間がかかります。ダンジョン部分の作成はこうしたアセットを使って、開発をブーストさせてみませんか?