この講座はロックマン風2Dアクションの作り方講座の第9回です。
前回は様々な行動パターンを持つ敵を一通り実装しました。
前回の記事:
今回はステージ上に配置する障害物(ギミック)を増やしていき、より遊びごたえのあるゲームに仕上げていきます。
開発するギミックは以下。
- 透明壁:プレイヤーが通れない場所を作る
- トゲ:プレイヤーが触れるとダメージを受ける障害物
- 即死ゾーン:空中から落下した時などに活用
- ジャンプ台:踏みつけるといつもより高くジャンプ
- 一方通行の足場:Platform Effector 2Dの使い方
- 往復リフト:空中を往復で移動する浮遊床
- 円運動リフト:空中で円形に移動する浮遊床
- 自動開閉扉:スイッチによって開く自動扉
ジャンプ台、空中で移動する床やスイッチで開閉する扉などアクションゲームでおなじみのギミックを実装していきます。
ギミック1:透明壁 プレイヤーが通れない場所を作る
透明壁はプレイヤーであるActorの行動範囲を制限するための透明な壁です。
シーン編集中は任意のスプライトを表示して分かりやすくし、ゲーム開始時には透明化する処理を行います。それでは以下のスクリプトを作成していきましょう。
Gimmic_HiddenWallクラスを作成
ScriptsフォルダにGimmicsフォルダを作成し、フォルダ内にギミック関連クラスをまとめていきます。
まずはGimmic_HiddenWallクラスを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// ステージギミック:隠し壁 /// アクターが通って欲しくない場所に設置する /// </summary> public class Gimmic_HiddenWall : MonoBehaviour { // Start void Start () { GetComponent<SpriteRenderer> ().color = Color.clear; } } |
HiddenWallオブジェクトを作成
続いてHiddenWallオブジェクトを作成します。
ヒエラルキー画面で右クリックし、2D Objects > Sprites > Squareでオブジェクトを新規作成。名称をHiddenWallに変更。Sprite Rendererに以下の画像を設定。
サンプル画像:Textures/MapAreas/HiddenWall.png
ギミックオブジェクトはArea/Gimmicsフォルダ以下に作成・配置しましょう。(Gimmicsフォルダ未作成ならAreaフォルダ直下でも大丈夫です。)
このあとのギミックも全てSpriteオブジェクトとして作成してOKです。
BoxCollider2Dと上記クラスをアタッチすればそれで必要な機能は揃います。
ギミック系のプレハブはPrefabsフォルダにGimmicsフォルダを作成してまとめることを推奨します。
透明壁は最初以外のエリアの、進入してきた方向に設置することを推奨します(下図エリアは左から侵入するので左端に設置)。
ただし、ScrollEnterオブジェクトを過ぎてからアクティブになるようにします。すなわち、AreaからArea(1)に入る際は非アクティブ。そしてArea(1)に入った後はArea(1)から左側に戻れなくするようにHiddenWallを設置するということです。
こうすることでステージの逆走防止になります。
↑ScrollEnterによりAreaからArea(1)に移行したことでArea(1)のHiddenWallが出現しプレイヤーが後ろに戻れなくなっています。
また、最初のArea内ではプレイヤーの後ろ側にもHiddenWallを設置することでステージ場外に落ちることを防ぐと良いでしょう。
HiddenWallオブジェクトを忘れずにプレハブ化してPrefabs > Gimmicsフォルダに保存しておきましょう。
ギミック2:トゲ プレイヤーが触れるとダメージを受ける障害物
触れたActorオブジェクトにダメージを与えるオブジェクトです。
Is Triggerがオンでもオフでも作動するように設計します。
Gimmic_DamageBlockクラスを作成
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 |
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// ステージギミック:ダメージ床 /// ブロックに乗ったアクター(またはトリガーに進入したアクター)にダメージを与える /// </summary> public class Gimmic_DamageBlock : MonoBehaviour { // 設定項目 [Header ("ダメージ量")] public int damage; // アクター接触時処理(Trigger) private void OnTriggerStay2D (Collider2D collision) { string tag = collision.gameObject.tag; if (tag == "Actor") { // アクターにダメージを与える collision.gameObject.GetComponent<ActorController> ().Damaged (damage); } } // アクター接触時処理(Collider) private void OnCollisionStay2D (Collision2D collision) { string tag = collision.gameObject.tag; if (tag == "Actor") { // アクターにダメージを与える collision.gameObject.GetComponent<ActorController> ().Damaged (damage); } } } |
トリガーでないColliderオブジェクトの接触時判定はOnCollisionStay2Dなどが有効です。
Spikeオブジェクトを作成
続いてSpikeオブジェクトを作成し、Collider2D系コンポーネントと先ほど作成したGimmic_DamageBlockクラスを追加します。
サンプル画像:Textures/Gimmics/Spike.png
当たり判定はBoxCollider2D以外でも可能です。
IsTriggerはオンでもオフでも大丈夫ですが、オフの場合はGroundタグを付与しておく事を推奨します。
Gimmic_DamageBlockのdamageパラメータには1回触れた時に受けるダメージを設定します。敵にはダメージを与えません。
これで触れることでダメージを受けるオブジェクトの完成です。
作ったオブジェクトはプレハブ化してPrefabs > Gimmicsフォルダに保存しておきましょう。
ギミック3:即死ゾーン 空中から落下した時などに活用
触れたらアクターを即座にHP0にさせるオブジェクトです。
Gimmic_DamageBlockクラスを使いまわせるので新規スクリプト作成は不要です。
DeathZoneオブジェクトを作成
今回は初期スプライトの非透明度を0にして最初から非表示にして作成します。
ステージの落とし穴より下に配置する事が多いと思うので、IsTriggerはオフにしておき判定漏れを防ぎます。
ダメージは適当に最大HPより高い値を入力しましょう。
これで触れただけでゲームオーバーとなるオブジェクトが出来ました。
作ったDeathZoneオブジェクトはプレハブ化してPrefabs > Gimmicsフォルダに保存しておきましょう。
ギミック4:ジャンプ台 踏みつけるといつもより高くジャンプ
乗ったActorオブジェクトを上方向に吹っ飛ばすオブジェクトです。
スーパーマリオなどでも多くの2Dアクションゲームでおなじみのギミックですね。
作成したギミックを配置する
ギミックをステージに配置する時は、Area/Gimmicsオブジェクト以下にインスタンスを生成して座標を整えます。
(Gimmicsオブジェクト未作成の場合はAreaオブジェクト直下に配置しても大丈夫です。)
ギミックは主にプレイヤーの移動を助けたり妨げたりすることで、ステージ攻略にパズルを解くような楽しさを与える効果があります。
エネミーの配置と同様、序盤はギミック単体を配置してギミックの効果がわかりやすいようにし、後半にはギミックを適切に利用しないと前に進めないように少しずつ難易度を上げていきましょう。
ラストステージではリフトで飛び乗った先の狭い足場にエネミーが待ち構えている、くらいの難しい局面を作ってみるのも面白いでしょう。
まとめ
ここまでで計8種のギミックを作成できました。ギミックはあればあるだけステージに個性を持たせることができ、プレイヤーの遊びごたえ向上につながります。
今回の講座で作成したギミックを組み合わせてステージを作成していきましょう。また、あなた独自の新しいオリジナルギミックを思いついたらぜひ開発に挑戦してみましょう。
次回はここまで構築したシステムを活かして残りのステージを作っていく作業を行っていきます。
次の記事:
コメント