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

もうタイトルで完結してるような気もするけど、Unityでカスタムパッケージをインポートした時にはタグも一緒にインポートしてくれるように見えます。
例えばプロジェクトAで自作タグをつけたPrefabをパッケージ化し、それを新規プロジェクトBでインポートすれば、ちゃんとタグが保持されたままとなります。
が、プロジェクトを閉じるとタグがいなくなっていたりと、自分でタグを追加するときと動きが異なるので注意。
環境
macOS 10.13 High Sierra
Unity2018.1.0f2
実験してみる
実際にやってみよう。
タグの追加
まずは既存のプロジェクトでタグを追加します。任意のゲームオブジェクトを選択し、[Add Tag…]を選択。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

どうやら自分で『Add Tag…』した時とは動きが違うようです。
開き直した後、インポートしたオブジェクトを一度クリックし、再度『Directional Light』からタグチェックすると、今度はリストに表示されました。

うーん……。
シーン内にPrefabがいると保持される
Scene内にインポートしたPrefabをインスタンス化した状態でプロジェクトを開き直した場合は、タグの一覧に『TagImport』がいるままでした。
シーン内のオブジェクトはタグの情報も読み込んでくれるのかしら。
自分でタグを追加した場合は、シーン内に該当のタグのオブジェクトがいてもいなくても、プロジェクトを開き直した時にちゃんとタグを読み込んでいました。
となると、インポートしたオブジェクトのタグはメモリ上に保持されているのかな。
問題はあるか
スクリプトから操作する時には、タグマネージャーに登録されたタグでない場合にエラーが出ます。
UnityException: Tag: <タグ名> is not defined.
スクリプトリファレンスのGameObject.tagにも、『タグを使う前にタグマネージャーで宣言してね』とあるので、宣言しておく必要があります。
実例はこちら。
これの何が問題かというと、例えばタグを使ってゲームオブジェクトを特定するスクリプトを作成した時、prefabがインポートされた直後は問題なくても、Unityを再起動したら動かなくなった、なんてことが起こり得ます。
PrefabがSceneでインスタンス化される前にタグを使ってしまうとエラーが出るため、ゲーム実行をする前にProjectウィンドウから手動で触るか、タグを使う前にInstansiateを終えておかないといけません。
スクリプトから何か対応するのは大変なので、インポートしたら手動でタグを追加しておくと安心かも。
まとめ
プロジェクトをいじっていて気になったので、パッケージインポートの時のタグについてメモ。
タグが中心の話でしたが、画面キャプチャを撮りまくったせいでパッケージのインポート・エクスポート講座みたいになっちゃいました。
最初に見つけたときは「親切だ!」なんて思いましたが、プロジェクトを開き直したら消えたりと、そんなことはなかったです。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】SpaceAttributeを使ってInspectorウィンドウを見やすく! 2018.07.06
-
次の記事
【Unity】Unityに登録してないタグはスクリプトから使っちゃダメよ 2018.07.06
Unityの操作にも慣れてきてだんだん作れるモノも複雑になってきたので、作りたい大きな部品ごとにプロジェクトを作成、部品が完成したらリソースなどをまとめてpackage化、こうしてひとつにまとめたものを実際にゲームを作るプロジェクトに運び込んで組み立て。
というスタイルでゲーム制作を進めたかったのですが、まさにTag関係の不審な挙動に頭を悩ませていました。おかげでまたひとつ快適にゲーム制作ができそうです。
コメントありがとうございます!
部品をPackage化して簡単に再利用できるのがUnityの魅力ですが、Tagなどのプロジェクトに紐づいた設定があると思わぬ動きをしますよね。
かと言ってプロジェクトと疎結合にするためTagを使わないのも不便だし……というジレンマ。
ゲーム制作、応援してます!