i-school - プレイヤーの移動を壁の内側に制限する

設計


 Playerと左右の壁には衝突判定がありません。そのため、左右移動しているとPlayerが壁を突き抜けて移動が出来てしまっています。

 ここではPlayerの移動範囲を制限することで壁を突き抜けて移動しないように変更を行います。

https://gyazo.com/1a9d113fd788f866495891061aabe058

 手法としてはいくつかありまして、PlayerにRigidbodyコンポーネントをアタッチして物理演算を用いて衝突判定をしてもよいのですが、
Playerの移動速度によっては壁を突き抜けてしまう恐れがあります。
それよりはスクリプトで移動範囲を制限する方法がありますので、そちらで実装していきましょう。

 Playerの移動とはすなわち、transform.positionの値を書き換えることと同義です。
そのため、このpositionの値を制限することが出来れば、Playerの移動も制限されることになります。

 よってここでは、値を制限する処理である、Mathf.Clampメソッドを利用してpositionの値を制限することで移動範囲を制限していきます。

実装手順 


 以下の手順で実装します。

1.Contolloerスクリプトを修正します。



 新しく学習できる技術をまとめます。

・Mathf.Clampメソッド


1.Contolloerスクリプトを修正する


 キー入力によってPlayerが移動(transform.positionが変更)していますので、移動した地点が制限した値の範囲内であるかを確認し、
範囲外の場合には制限値内に収まるように制御します。

Controller.cs


 修正が終わったら、ゲームを実行して確認をしましょう。Playerの移動範囲が制限されていれば成功です。


2.<Mathf.Clampメソッド 指定値を最小値、最大値内に制限する>


 Mathf 構造体は、Unity が用意している、数学関数の変数やメソッドをまとめてある構造体です。
通常の Math クラスと異なり、戻り値は float 型で用意されています。


参考サイト
Unity 公式スクリプト・リファレンス
Mathf



 Clamp メソッドは、「制御したい指定値を、指定した範囲内の最小値、最大値に収めてくれる(置き換えてくれる)」処理になります。

<メソッドの記法>
  制御したい指定値 = Mathf.Clamp(制御したい指定値, 最小値, 最大値);

 このメソッドを利用して、計算処理後のプレイヤーのゲームオブジェクトの X 軸の値を制限することが出来ます。
上記のメソッドの書式に、制御したい値を当てはめて処理を組み立ててみましょう。


 float z = Mathf.Clamp(transform.position.z, -limitPos, limitPos);

 という形で利用していますので、transform.position.zの値を対象とし、
最小値が -limitPos 以下になった場合には -limitPosの値に、
最大値が limitPos 以上になった場合には limitPosの値制限をしてくれます。

 数値をいれて書くならば

 float z = Mathf.Clamp(transform.position.z, -4.25f, 4.25f);

 となります。

 その後、その制限された値を現在の座標として適用しています。

 // 制限確認後、位置情報を更新
 transform.position = new Vector3(transform.position.x, transform.position.y, z);

 この処理により、常にプレイヤーのゲームオブジェクトをゲーム画面内に収まるように移動の制限を行っています。



 なおMathf.Clampメソッドには引数のオーバーロードがあり、引数の型は、float型とint型でそれぞれ利用が出来るようになっています。

参考サイト
Unity 公式スクリプトリファレンス
Mathf.Clamp