シンプルなアクションゲームを作ってみよう16-障害物を作成する-

記事内に広告が含まれています。

シンプルなアクションゲームを作ってみようの第16回です。

今回はプレイヤーキャラクターを邪魔する障害物を作成していきます。

前回はゲームにBGMを付けました。

シンプルなアクションゲームを作ってみよう15-ゲームにBGMを付ける-
シンプルなアクションゲームにBGMを付けていきます。

シンプルなアクションゲームを作ってみようの他の記事は

シンプルなアクションゲームを作ってみよう

シンプルなアクションゲームを作るのを通してUnityの使い方を学ぶカテゴリです。

から参照出来ます。

スポンサーリンク

障害物を作成する

今回はプレイヤーキャラクターがゴールエリアに到達するまでの間に障害物を置き、それを解除する解除エリアに到達するとその障害物を消して通れるようにしていきます。

また障害物を消す時にエフェクトの表示と効果音を鳴らしたいと思います。

障害物ゲームオブジェクトの作成

障害物用のゲームオブジェクトを作成します。

Stage1シーンのEnvironmentゲームオブジェクトを選択した状態で右クリックから3D Object→Cubeを選択し、名前をObstacleとします。

Transformの値を以下のように設定します。

ObstacleのTransformの設定

シーンビューで見ると以下のような位置と大きさで設定されます。

シーンビューで見た障害物の位置と大きさ

障害物用のマテリアルの作成と取り付け

障害物には障害物用のマテリアルを作成し取り付けます。

Assets/Materialsフォルダで右クリックからCreate→Materialを選択し、名前をObstacleとします。

Obstacleマテリアルを選択し、インスペクタでAlbedoの横の白色の部分を押し、青色に変更します。

Obstacleマテリアルの設定

ObstacleマテリアルをObstacleゲームオブジェクトにドラッグ&ドロップして設定します。

ObstacleマテリアルをObstacleゲームオブジェクトに設定する

パーティクルアセットと効果音のダウンロード

障害物を消す時にエフェクトを表示し、効果音を鳴らしますが、そのエフェクトと効果音には無料のアセットをダウンロードして使用させて頂きます。

エフェクトはUnityのパーティクルシステムで作られたもので、自分でも色々な効果のパーティクルを作成出来ますが、今回は出来上がたったものを利用するだけです。

アセットストアで「cartoon fx free」で検索して出てくる無料のアセットをインポート&ダウンロードします(有料のもあるので間違えないようにしてください)。

効果音は「soundbits free sfx」で検索して出てくる無料のサウンドを利用させて頂きます。

Audio Sourceコンポーネントの取り付け

ヒエラルキーのObstacleゲームオブジェクトを選択し、Add ComponentからAudio→Audio Sourceを選択し取り付けます。

Obstacleゲームオブジェクトに取り付けたAudio Sourceの設定

AudioClipにはAssets/SoundBits_FreeSFX/Samples/Just_Whoosh_004.wavを設定します。

この効果音はスクリプトから再生をさせるので、このゲームオブジェクトが登場時には音声を鳴らしたくありません。

そこでPlay On Awakeのチェックを外します。

また効果音なので繰り返し音声を再生させないのでLoopのチェックを外します。

3D上のゲームオブジェクトが消える時にこの効果音を鳴らすので、3D音声でもいいんですが、必ず聴こえるように今回はSpatial Blendを2Dの方にドラッグします。

パーティクルの表示と音声再生スクリプトの作成

効果音を設定したAudio Sourceの設定が出来ましたので、次はスクリプトからパーティクルの表示と効果音を再生できるようにします。

particleはパーティクル機能を持ったゲームオブジェクトをインスペクタで設定します。

audioSourceはAudioSourceコンポーネントを設定します。

erasingはゲームオブジェクトを消去中かどうかのフラグです。

Startメソッドで自身に設定しているAudioSourceコンポーネントを取得しています。

Updateメソッドでは少しややこしい処理をしていますが、効果音が鳴って完全に再生が止まってから障害物を消す処理をしています。

!erasingの状態、つまりゲームオブジェクトを消している時でなければreturnでそれ以降の処理をしません。

その後!audioSource.isPlayingプロパティで音声が再生されていないか確認し、効果音が止まっていればInstantiateメソッドを使ってparticleゲームオブジェクトをインスタンス化しています。

Instantiateメソッドを使うと第1引数で指定したプレハブを第2引数の位置、第3引数の回転でインスタンス化しゲーム内に登場させることが出来ます。

パーティクルをインスタンス化した後にgameObject.SetActive(false)を使ってゲームオブジェクトを非アクティブにしています。

で消してもいいかもしれません。

AddEffectメソッドは障害物を消す前に効果音をaudioSource.Playメソッドで再生し、erasingをtrueにしています。

このメソッドは障害物消去エリアにプレイヤーキャラクターが侵入した時に呼び出すようにします。

EffectScriptの取り付けと設定

EffectScriptが出来たのでObstacleゲームオブジェクトに取り付け、設定をします。

障害物を消す時に表示するパーティクルを持ったゲームオブジェクトを設定する

EffectScriptのparticleにはAssets/JMO Assets/Cartoon FX/CFX Prefabs/Misc/CFX_MagicPoof.prefabを設定します。

障害物の上に乗った場合も接地出来るようにしておく

プレイヤーキャラクターは今のところジャンプが出来ません。

しかし、障害物の上にジャンプして乗れるようになった場合に接地と判断しなければなりません。

そこでObstacleゲームオブジェクトのLayerはGroundに設定しておきます。

ObstacleゲームオブジェクトをGroundレイヤーに設定する

障害物消去エリアの作成

障害物が出来たので次は障害物を消去するエリアを作成します。

Environmentゲームオブジェクトを選択した状態で右クリックから3D Object→Sphereを選択し、名前をEraseBlueObstacleとします。

EraseBlueObstacleゲームオブジェクトの作成

EraseBlueObstackleのTransformの値を設定し、Sphere ColliderのIs Triggerにチェックを入れて範囲として使用します。

EraseBlueObstacleゲームオブジェクトのTransformの設定

障害物消去エリアのマテリアルを作成し設定する

Assets/MaterialsフォルダにEraseBlueObstacleマテリアルを作成し、インスペクタでRendering ModeをTransparentにし、色を青色の半透明にします。

EraseBlueObstacleマテリアルの設定

EraseBlueObstacleゲームオブジェクトに取り付けます。

EraseBlueObstacleマテリアルをEraseBlueObstacleゲームオブジェクトに設定

プレイヤーキャラクター検知スクリプトの作成

EraseBlueObstacleゲームオブジェクトの範囲にプレイヤーキャラクターが侵入したら障害物であるObstacleを消去する必要があります。

Assets/Scriptsフォルダに新しくEraseObstacleスクリプトを作成し、EraseBlueObstacleゲームオブジェクトにドラッグ&ドロップして取り付けます。

EraseObstacleスクリプトをEraseBlueObstacleゲームオブジェクトに取り付ける

スクリプトに記述していきます。

objectOfEraseは範囲内にプレイヤーキャラクターが侵入したら消すゲームオブジェクトをインスペクタで設定します。

今回の場合はインスペクタにヒエラルキーのObstacleゲームオブジェクトをドラッグ&ドロップします。

OnTriggerEnterメソッドで、侵入したコライダのゲームオブジェクトに設定しているタグがPlayerだった時にobjectOfEraseゲームオブジェクトに取り付けられているEffectScriptスクリプトを取得し、AddEffectメソッドを実行しています。

これでインスペクタで設定したゲームオブジェクトのObstacleのエフェクトを発動します。

Destoryメソッドで障害物消去エリアであるEraseBlueObstacleゲームオブジェクト自体を削除します。

Erase Obstacleスクリプトの設定

スクリプトが出来たのでEraseBlueObstacleゲームオブジェクトのインスペクタのEraseObstacleのObject Of EraseにヒエラルキーのObstacleをドラッグ&ドロップします。

EraseObstacleスクリプトのObjectOfEraseにヒエラルキーのObstacleを設定する

ナビゲーションシステムと障害物

これで機能が出来た感じがしますが、少し問題が残ります。

ObstacleゲームオブジェクトはStaticにチェックを入れていないので、NavigationウインドウのBakeボタンを押して再度ベイクをしてもナビメッシュエージェントは障害物をすり抜け移動してしまいます。

ナビメッシュエージェントが障害物をすり抜けてしまう

ナビメッシュはNavigation Staticにチェックが入ったゲームオブジェクトを元に移動ルートを作成するからで、Obstacleゲームオブジェクトはチェックを入れていないので障害物の所にも移動ルートが出来ます。

障害物の所にルートが出来ている

そこで例えばObstacleゲームオブジェクトをStaticにしてBakeボタンを押せば、そのルートが遮断されます。

障害物の所のルートが消えた

ただし実行してみるとわかりますが、障害物消去エリアに入って障害物を消しても元々のルートが遮断されたものなので敵キャラクターはそこを通れません。

障害物を消してもルートが遮断されている

これでは問題があります。

ナビメッシュエージェントの障害物として認識させる

この問題を解消する為に、ObstacleゲームオブジェクトにNavMeshObstacleコンポーネントを追加します。

NavMeshObstacleを取り付けるとナビメッシュエージェントが障害物として認識するようになります。

例えば開閉を繰り返すドア等は動くものなのでStaticにすると動かなくなってしまうのでNavMeshObstacleコンポーネントを取り付けてナビメッシュエージェントに障害物と認識させます。

ヒエラルキーでObstacleゲームオブジェクトを選択し、インスペクタのAdd ComponentからNavigation→Nav Mesh Obstacleを選択し取り付けます。

障害物にNavMeshObstacleコンポーネントを取り付ける

ObstacleのStaticにはチェックを入れません。

NavMeshObstacleコンポーネントのShapeは障害物の範囲の形状を設定します。

デフォルトでObstacleのコライダと同じになっているので特に変更はしません。

Carveにチェックを入れると障害物をナビメッシュエージェントが回避する時に滑らかに回避出来るようになります。

今回の場合はチェックを入れないとナビメッシュのルートが遮断されないのでチェックを入れます。

これで設定が出来たのでNavigationウインドウのBakeタブのBakeボタンを押してナビメッシュをベイクします。

NavMeshObstacleを取り付けた後に再度ベイクする

ナビメッシュのベイクは新しくナビメッシュエージェントの移動出来る場所が出来たら再度する必要があるので気を付けてください。

ベイクするとObstacleゲームオブジェクトの所のナビメッシュが遮断されます。

Obstacleゲームオブジェクトのルートが遮断される

つまりObstacleゲームオブジェクトがある場合はそのルートを敵キャラクターは通れません。

ただし、障害物消去エリアにプレイヤーキャラクターが侵入して障害物を削除するとNavMeshObstacleコンポーネントを持つObstacleゲームオブジェクトを非アクティブにしますので、このルートを邪魔するゲームオブジェクトがなくなるので、ルートが繋がり敵キャラクターが通れるようになります。

障害物消去エリアで障害物を削除すると敵キャラクターもそのルートを通れるようになる

実行して確認してみる

機能が出来たので実行して確認してみましょう。

上のようになりました。

終わりに

今回は障害物の作成とそれを消す消去エリアの作成、パーティクルの表示と効果音の再生を行いました。

次回はプレイヤーキャラクターのHPをUIで表示したり、敵キャラクターに近づかれた場合にHPを減らす機能を作成していきます。

タイトルとURLをコピーしました