【Unity】InstantiateやDuplicateでの複製について

GameObjectをInstantiateしたり、右クリックメニューでDuplicateを行うと、Unity内部で都合よく複製して参照先も上手いこと変更してくれる。
普通に使う分には便利な機能だが、ちょっとしたエディタ拡張を作ろうとすると結構なはまりポイントがある。

まず、複製されるのは、複製するGameObject以下にあるコンポーネントで、参照している場合も自動的に切り替えてくれる。
逆にコンポーネント以外のObjectは、そのGameObjectでしか持つ必要がない場合でも複製されずに共有する。

たとえばメッシュなどを内部的に生成し、そこでしか使わないけど実行時に生成するのも重いからとSerializedFieldやpublicで持たせておくと、
いざ複製した時に編集結果が共有されてしまう。
なので、Objectを個別管理したい場合は実行時に生成する他ない。

ちなみに、インスペクタからCopy Component→Past Component~を行うとコンポーネントの参照も引き継がれてしまうので、
内部的に生成するコンポーネントも含めて、基本的には実行時に取得しなおす構造の方がトラブルが少なくなると思われる。

ただし、自動生成したコンポーネントも編集できてパラメータもまとめてCopy Componentしたい場合(挙動を総合的に管理するスクリプトなど)もあると思うが、
これについての解決策はなさそうなので、ドキュメントでCopy ComponentせずにDuplicateにするよう注意躍起するくらいしかできない。

Unityのアセット販売中!

ステートマシンの状態遷移やパラメータはエディタで編集でき、
ゲームロジックに依存するステートの挙動はスクリプトで記述可能なエディタ拡張。

詳細はこちら

RPGツクールVXやWOLF RPGエディターのオートタイルに準拠したエディタ拡張。

詳細はこちら

オススメ!