Unityのヒエラルキー上で右クリックするとCreate Emptyという空のゲームオブジェクトを作成する事が出来ます。
このCreate Emptyで作成した空のゲームオブジェクトの用途について考えてみます。
空のゲームオブジェクトを使う
空のゲームオブジェクトを作成する
まずは空のゲームオブジェクトを作成してみましょう。
ヒエラルキー上で右クリック→Create Emptyを選択します。
空のゲームオブジェクトを作成するとGameObjectという名前の空のゲームオブジェクトが作成されます。
GameObjectを選択すると
インスペクタに↑のようにTransformだけが設定されている事がわかります。
用途1-全体を管理出来る-
空のゲームオブジェクトの一つの使い方を試してみます。
空のゲームオブジェクトの名前をStageに変更し、その子要素にゲームステージの部品を配置していきます。
↑のようにStageの子要素にCubeが配置されました。
↑が作成したゲームステージで床以外の坂や山等はCubeを変形しStageの子要素に配置した状態です。
ゲームステージの部品はStageの子要素なので、いざゲームステージをずらしたいと思った時に個々の部品をそれぞれ移動する必要がありません。
Stageを選択し移動させればゲームステージ全体を移動する事が出来ます。
その為、まとめて管理したいゲームオブジェクトを空のゲームオブジェクトの子要素に配置しておけばそれぞれの位置や角度はそのままに全体を移動させる事が出来ます。
↑がStageを動かした後の状態です。
それぞれの部品の配置はそのままで全体を移動させる事が出来ます。
用途2-子要素のモデルを簡単に変更出来る-
もうひとつの用途はキャラクターの当たり判定や移動スクリプト等を空のゲームオブジェクトに取り付け、その子要素にキャラクターモデルを配置すれば
いつでもキャラクターモデルを取り変える事が出来るようになります。
空のゲームオブジェクトを作成し名前をEmptyCharaとします。
EmptyCharaにはCharacterControllerの取り付けと設定、キャラクター操作スクリプトを取りつけます。
子要素にキャラクターモデルを配置し、Animatorにキャラクター用のAnimatorを設定します。
これらの設定については

等を参考にしてください。
ヒエラルキーは
↑のような階層になります。
空のゲームオブジェクトであるEmptyCharaにキャラクター操作関連のコンポーネントを取りつけています。
キャラクターモデルのAnimatorにはキャラクター用のAnimatorControllerを設定するだけです。
Animatorは子要素のキャラクターモデルが持っているのでキャラクター操作スクリプトでは子要素から取得するようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | using UnityEngine; using System.Collections; public class CreateEmptyMove : MonoBehaviour { private Animator animator; private CharacterController cCon; private float x; private float y; private Vector3 velocity; public float jumpPower; private Vector3 input; // 入力値 void Start () { animator = GetComponentInChildren<Animator>(); cCon = GetComponent<CharacterController>(); velocity = Vector3.zero; } void Update () { // キャラクターコライダが接地、またはレイが地面に到達している場合 if(cCon.isGrounded) { // 地面に接地してる時は初期化 velocity = Vector3.zero; // 着地していたらジャンプフラグをfalse animator.SetBool("Jump", false); x = Input.GetAxis("Horizontal"); y = Input.GetAxis("Vertical"); input = new Vector3(x, 0, y); // 方向キーが多少押されている if(input.magnitude > 0.1f) { animator.SetFloat("Speed", input.magnitude); transform.LookAt(transform.position + input); velocity += transform.forward * 2f; // キーの押しが小さすぎる場合は移動しない } else { animator.SetFloat("Speed", 0); } // ジャンプ if(Input.GetButtonDown("Jump") && !animator.GetCurrentAnimatorStateInfo(0).IsName("Jump") && !animator.IsInTransition(0) // 遷移途中にジャンプさせない条件 ) { animator.SetBool("Jump", true); velocity.y += jumpPower; } } velocity.y += Physics.gravity.y * Time.deltaTime; cCon.Move(velocity * Time.deltaTime); } } |
子要素からAnimatorを取得する以外は通常と同じです。
これで設定が完了したのでキャラクターを動かしてみましょう。
↑のように問題なくキャラクターのEthanが動きました。
ここでキャラクターのモデルをEthanからゾンビのキャラクターに変更する必要が出たとします。
操作スクリプト等は親のEmptyCharaに設定しているので子要素のキャラクターモデルだけを変更すればいい事になります。
↑のようにゾンビのキャラクターモデルを配置しAnimatorの設定とTransform情報のResetだけをします。
↑がゾンビキャラクターのインスペクタです。
位置情報は親要素からの相対値になるのでScaleは1、PositionとRotationは0にします。
これでキャラクターモデルの変更が完了しましたので動かしてみましょう。
↑のようにゾンビキャラクターも問題なく動きました。
このように簡単にキャラクターモデルを変更する事が出来ますが、キャラクターモデルのボーンの子要素に武器を装備させたりスクリプトを設定していたりすると、
単純なモデルの変更とはいかないので注意が必要です。
武器もスクリプトもキャラクター操作スクリプト内の処理でコンポーネントを取り付けるようにすればこの問題は解決しそうです。
スクリプトで武器やスクリプトの取り付けを行おうとするとそれはそれで大変にはなりますが・・・・・。