【Unity】Unityに登録してないタグはスクリプトから使っちゃダメよ
インポートしたパッケージに含まれるタグの扱いについてまとめた記事を書いたんだけど、その補足としてスクリプトから操作した場合はどうなるか確認。
登録されていないタグを使おうとした場合や、パッケージに含まれていたタグを再起動後に使った場合についてスクリプトを書いてみます。
エラーメッセージも含めて何が出るか試してみましょ。
環境
macOS 10.13 High Sierra
Unity2018.1.0f2
スクリプトからタグをセット
確認の流れは次のイメージ。
- SceneにUntaggedのオブジェクトを作成
- スクリプトからそのオブジェクトを取得
- スクリプト内でタグをセット
- スクリプトから、タグを使って何か操作する
- ゲーム実行中、タグはどうなっているかInspectorから確認する
やってることは単純ですね。
ゲームの実行中に、登録されていないタグをセットしてみます。
このオブジェクトに以下のスクリプトをアタッチします。tagNameでUnityに登録していないタグ名をセットしています。
ゲームを実行すると以下のメッセージが。
UnityException: Tag: <タグ名> is not defined.と想定通りの結果です。スクリプトリファレンスに『タグを使う前にタグマネージャーで宣言してね』と書かれてる通りですね。
続いては、インポートしたパッケージ内のオブジェクトが持っているタグ『TagImport』をtagNameにセットして実験。
この辺りは前回の続きになっています。別プロジェクトで『TagImport』というタグを作成し、そのタグをセットしたPrefabをパッケージに含めたのでした。
この状態でゲームを実行すると……。
やはり変わらず。プロジェクト内にあるだけでは、『TagImport』というタグの存在を知らないようです。
今度は少し変えて、『TagImport』のタグを持ったPrefabをインスタンス化してからタグを操作してみます。
FindGameObjectWithTagを使う前に、インポートしたしたPrefabにアクセスしています。これでUnityに気付いてもらえるかな?
ゲームを実行した結果は以下の通り。
AddForceが効いてるので、タグを使った操作はうまく行ったようです。ゲーム実行中にインスタンス化したオブジェクトを確認するとインポートしたタグが使われています。
別のオブジェクトからタグの一覧を確認すると、『TagImport』が選べるようになっています。ただし、これはゲーム実行中のみであって、ゲームを停止すると一覧から消えます。何てこった。
追加タグをインポートした時の扱い
追加タグを持ったオブジェクトをインポートした時の扱いはどうすべきでしょうか。
……と言っても多分有効な解決策はひとつで、インポートしたオブジェクトのタグを手動で登録するのが良さそう。
オブジェクト単体でインポートした場合はそこまで影響無いと思いますが、パッケージの中でそのオブジェクトのタグを使っているスクリプトがあると危ないです。
別プロジェクトの部品を使い回そうとした時、スクリプトも一緒に入れることだって考えられますし、警戒しておいたほうがいいかも。
Scene内にオブジェクトが存在するならそのタグを認識してくれるので、パッケージを作って移行するときにはSceneごと移動させるのもあり。
結構地味な部分だけど引っかかると凹むので、パッケージ内のオブジェクトのタグは確認しておくといいかも。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】インポートしたパッケージ内のタグも自動で追加される(ように見える) 2018.07.06
-
次の記事
【Unity】UIのボタンを使わずにクリックを検知する方法 2018.07.13
コメントを書く