Unityで床を生成して進むキャラクターを作成する

今回はUnityのゲームで床のゲームオブジェクトを前方に生成し、その床を使って進むキャラクターを作成したいと思います。

何もない空間に床を積み上げて階段を作り、目的地に進んでいくようなゲームを作成する時に役立つと思います。

今回の機能を作成すると、

↑のような感じで自分で床を生成して進めることが出来ます。

スポンサーリンク

作り方概要

今回の機能は床に対応するキーを押した時にキャラクターの前方に床のプレハブをインスタンス化します。

床のゲームオブジェクトにはRigidbodyを取り付け重力で落下するようにします。

床の大きさの違いによっては主人公キャラクターの上に落ちてきてしまう可能性もあるので、床ごとにどの位置から落下するかを保持するスクリプトを持たせ落下位置を変更出来るようにします。

プレハブのインスタンス化のやり方がわかっていればそれほど難しい処理をするわけではありません(オブジェクトの向きに関してはちょっと難しいかも?)。

プレハブに関しては以下の記事を参照してください。

Unityのプレハブ(prefab)機能を使うと銃から飛ばす弾や敵を大量生産する事が出来ます。そんなプレハブの作り方と使い方を解説しました。

使用するゲームオブジェクトの準備

機能を作成する前に使用するゲームオブジェクトを準備します。

キャラクターの準備

まずは床を生成するキャラクターを準備します。

キャラクターにはスタンダードアセットのEthanを用いて、CharacterControllerの取り付けコライダのサイズの調整をし、AnimatorControllerでIdle状態とWalk状態を作成しAnimatorに設定します。

ここら辺は

Unityのアニメーションの切り替えシステムであるAnimatorControllerの設定とスクリプトからアニメーションを制御していきます。

を参照してください。

床のゲームオブジェクトの準備

次はキーを押した時にインスタンス化する床のゲームオブジェクトのプレハブを作成していきます。

使用する床のゲームオブジェクトはなんでもいいですが、今回はCubeのScaleを調整した床と、スタンダードアセットのPrototypingにあるゲームオブジェクトを使用してみます。

UnityのスタンダードアセットのPrototypingにあるブロックを使って、簡単なゲームの舞台を作ってみます。

今回は4つの床オブジェクトのプレハブを用意し、対応するキーを押した時にその床を生成する事にします。

ヒエラルキー上に床のゲームオブジェクトを配置した後、それをAssetsエリアにドラッグ&ドロップしプレハブにします。

床のゲームオブジェクトのTransformのPositionは全て0にし、Rotationは必要に応じて変更します。

これはインスタンス化した時にそのPositionとRotationで登場させそのまま落下させる為です。

プレハブにしたゲームオブジェクトはヒエラルキー上から削除します。

作成した床のプレハブは

生成する床のゲームオブジェクトプレハブ

↑のような感じで4つ作成しました。

間にマテリアルが入って邪魔だなぁ・・・・(-_-)

機能を作成する

使用するゲームオブジェクトの作成が出来たので、キャラクターのスクリプト、床のスクリプト、コンポーネントを取り付け機能を作成していきます。

床のプレハブにコンポーネントを取り付け

床のプレハブは4つ作成しましたが、全部同じように作成し取り付けてください。

まずはFloor1の床を選択し、インスペクタのAdd Component→Physics→Rigidbodyを選択し取り付けます。

床はRigidbodyの重力を使って落下させるのでUse Gravityにチェックを入れます。

また、床のゲームオブジェクトが落下する際に回転すると他のゲームオブジェクトと接触した際に回転してしまい床の意味を持たなくなってしまうので回転しないようにConstraintsにチェックを入れます。

床のゲームオブジェクトのRigidbodyの設定

これで床は登場してから重力で落下しますが、回転をしないようになります。

次にFloorScriptスクリプトとFloorDataスクリプトを作成しFloor1プレハブに取り付けます。

床のゲームオブジェクトにスクリプトを設定

FloorScriptスクリプトの作成

FloorScriptスクリプトはその床が登場してからずっと残っていると邪魔だったり処理速度が遅くなってしまうので、一定時間が経過したら削除するものです。

登場してから5秒が経過したら自身のゲームオブジェクトを削除しています。

FloorDataスクリプト

FloorDataスクリプトは床をキャラクターからどの程度相対的な位置に登場させるかのデータを保持しておくものです。

床のプレハブを選択しインスペクタでfowardDistance(前方距離)、upDistance(上方距離)を指定します。

これで床のプレハブに取り付けるスクリプトの作成が終了しました。

Floor1~Floor4まで同じようにRigidbodyの取り付けとスクリプトの取り付けをし、床の大きさに応じてインスペクタのFloorDataのfowardDistanceとupDistanceの値を設定します。

キャラクター用スクリプトの作成

次にキャラクターの移動と床を生成をするスクリプトを作成します。

Floor1~Floor4までに対応するキーの文字列をfloorKeyとして配列で持っておきます。

今回は1、2、3、pのキーを押した時にそれぞれ対応する床のゲームオブジェクトを生成することにします。

floorPrefabにはインスペクタで床のプレハブを指定します。

何らかのキーを押したらfloorKey配列に保持しているキーが押されたかどうか判定し、押されていたらCreateFloorメソッドに対応する番号を渡して呼び出します。

CreateFloorメソッドでは受け取った床番号に対応するプレハブが設定されていたらその床のプレハブに取り付けてあるFloorDataスクリプトを取得します。

取得したデータから床を登場させる位置を計算します。

床をインスタンス化する時の位置は先ほど計算した位置で床の回転はtransform.rotation(この場合キャラクターの角度)に床の角度をかけたものを指定します。

こうすることでキャラクターの位置を基点に床の角度分回転させるので、キャラクターの向いている向きにかかわらず床の向きが一定になります。

これで機能が完成しました!

終わりに

今回作成した機能は床のゲームオブジェクトを使って通れない位置を通る時に使いますが、単純に色々なブロック生成を出来るようにして遊ぶだけのゲーム(おもちゃ?)とかも作れそうですね。

ただ単に普段は通れないけどキーアイテムを取得したら通れるような床を作りたい場合は

Unityのアクションゲームで使う事が出来る一定時間毎に透明になる床を作成したり、通れない壁を作っていきます。

↑の記事で作った透明な床の機能を使った方がいいです。

今回の機能は自由に床を生成したい時等に使えると思います。

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます

コメント

  1. 匿名 より:

    FloorScriptでDestroyの第2引数に時間指定すれば同じように消してくれますよ!