Unityに関連する記事です

 ベルトスクロールアクションでは、移動の要素が特徴的です。

 ・奥行方向への移動時にはキャラの向きが変わらない
 ・エリア内での移動範囲に制限がある(ベルトスクロール)

 ここでは向きを変えずに奥行移動をする際に向きを変えずに移動する処理と、移動範囲の制限処理を実装します。



設計


 3D空間での移動になるため、X軸で左右移動を、Z軸で奥行移動を行うようにします。

 このとき移動に合わせて全方位にキャラの向きを変えてしまうと奥行移動をした際に、キャラが正面を向いてしまったり、背中を見せてしまったりします。
このままでも問題はありませんが、ベルトスクロールアクションというゲーム性に合わせて、キャラの向きは左右方向のみ固定をしたい所です。

 キャラの移動時に向きに関する制御を行うことでこの問題を解消することが出来ます。


 キャラの移動範囲ですが、ベルトスクロールアクションにはその名の通り、エリア単位での移動範囲に制限があります。
そしてそのエリアの敵を全滅させることで次のエリアへの移動が可能になります。

 この部分もキャラの移動の部分に制御を行うことでロジックを考えます。

 移動範囲は固定値にせず、各エリアごとに移動できる範囲の情報を持たせることができれば制御が可能です。

 まずは制限ができるかどうかから検証していって、その後、実際にエリアの移動範囲を反映していく手順で実装していきます。


実装動画 上下移動では向きを変えない
https://gyazo.com/d2f497e5fb3b6ef5b6629c0fb146f1f5

実装動画 画面の左右には移動制限がある
https://gyazo.com/5053e9bfca1585283e2035df5885cf91


実装の手順


 1.移動制限用のクラスを作成する
 2.キャラを管理するPlayerControllerクラスを作成する


新しく学習する内容


 1.MonoBehaviourクラスを継承しないクラスの作成、入れ子クラスの作成
 2.Mathf.Clampメソッド
 3.const修飾子


1.移動制限用のクラスを作成する


 今度の設計をふまえて、移動制限用のクラスを作成しておきます。


MoveLimit.cs



<MonoBehaviourクラスを継承しないクラスの作成、入れ子クラスの作成>


 MonoBehaviourの継承がありませんので、ゲームオブジェクトにアタッチすることはできませんが
いずれのスクリプトからでもインスタンスして利用することが出来ます。

 またクラスの中にクラスがあります。このような作りのクラスを入れ子(ネスト)クラスと言います。
1つのファイルとして用意する必要のない、使用範囲の限られているクラスなどは、このように入れ子クラスにして使うことが出来ます。

 今回はHorizontalLimitクラスとDepthLimitクラスを入れ子クラスとして作成しています。
これはMoveLimitクラス内に用意して、まとめて使うことを想定した設計になっています。

 
 また各クラスには[Serializable]属性が付与されています。この属性を付与すると、このクラスをインスペクターで確認出来るようになります。


2.キャラを管理するPlayerControllerクラスを作成する


 PlayerControllerクラスを作成し、キャラクターにアタッチします。

PlayerController.cs



<Mathf.Clampメソッド>


 Mathf.Clampメソッドでは、引数で指定した値を制限した範囲内に収める処理を行います。

 Mathf.Clamp(第1引数 = 制限をかけたい値, 第2引数 = 第1引数の最小値, 第3引数 = 第1引数の最大値);

 そのため、下記の処理は、transform.position.xの値を、moveLimit.horizontalLimit.left 〜 moveLimit.horizontalLimit.rightの間に制限するという処理になります。
もしも最小値と最大値を超えた場合には、自動的にその範囲内に収まるように調整してくれます。

 float posX = Mathf.Clamp(transform.position.x, moveLimit.horizontalLimit.left, moveLimit.horizontalLimit.right);


<const修飾子>


 変数の宣言と一緒につけることができる修飾子です。この修飾子を持つ変数は固定値となり、変更することが出来なくなります。
そのため、ゲーム中で常に固定値として利用したい値を用意する場合に利用すると便利です。

 今回はString型の値を用意し、何回か書く文字列の打ち間違えを未然に防ぐようにしています。

 private const string HORIZONTAL = "Horizontal";


ゲームを実行して動作を確認する


 PlayerControllerクラスをプレイヤーキャラクター役のゲームオブジェクトにアタッチするとインスペクターにアサイン情報が表示されます。

 移動速度と回転速度は適宜な値を設定してください。




 [Serializable]属性を持つクラスであるため、MoveLimit変数を宣言すると、インスペクターに表示することが出来ます。
ここでキャラの移動範囲を仮に設定してみてください。




 その後、ゲームを実行してみましょう。
先ほど指定した移動範囲内しかキャラが移動が出来なくなっていれば成功です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます