#4 自機の移動範囲を制限する

2Dシューティング
このブログは、趣味でプログラミングを勉強中の筆者が、実験を繰り返しながら、WordPressの使い方の練習も兼ねて、備忘録のように記事を残していくものです。Unityのバージョンは6000.0.32f1です。

前回は、ついに自機を動かすことに成功しました。しかし、調子に乗って動かすうちに自機は画面の外に消えていってしまいました・・・。これはまずいです。

今回のゴール

自機が画面外に出ないようにする

if文を使ってスクリプトを修正する

考え方として、動かしたときに自機の位置が画面の外に出たら、位置を画面内に戻してやればいいことになります。前回も出てきたif文を使ってみます。

以下のリストはUpdate関数だけ載せています。その他の部分は変更ありません。

transform.position.xというのは、自機のx座標を表しますので、これが8を超えたら8に戻す処理でいいと思ったのですが・・・。

Assets\Scripts\PlayerControl.cs(20,40): error CS1612: Cannot modify the return value of ‘Transform.position’ because it is not a variable
Transform.position’は変数ではないため、戻り値を変更できない。

というエラーが出てしまいました。transform.position.xに数値を代入することはできないということです。

じゃあ、どうすればいいのよ。

これは、おそらく多くの人が同じところではまってしまうと思いますが、別の形なら代入することができるのです。

transform.positionには、Vector2型、あるいはVector3型の変数しか代入することができません。

Vector2型はxとyの2つの要素をもっています。Vector3型はxとyとzの3つの要素をもっています。2DのゲームにはVector2型で十分です。Vector2型の変数は次のようにして作ります。

変更したいのは、xの値だけです。yの値は変えたくありませんので、tranform.position.yで現在のy座標を取得します。コードは次のようになりました。

同じようにして、x座標が-8を下回った場合でもx座標を-8に修正するコードを追加しました。

Update関数の中はこうなりました。

実行してみましょう。

画面の端まで来ていないのに、これ以上進めませんね。インスペクタを見ると、自機のx座標は-8となっています。コードで-8以下にならないようにしているのだから、これは当然です。

では、-8ではなく何にすれば自機が端までいくのでしょうか。シーンビューで自機を動かしながらインスペクタでx座標を確認していきます。

-9.71という値が画面の左端のようです。右端は9.71でしょう。これらの値をもとにコードを書き換えてみます。

早速実行してみましょう。

うまくいきました。

Math.Clampを使ってスクリプトを修正する

実は、Math.Clamp(制限したい変数, 最小値, 最大値)を使うと、今回のような制限をかける場合に、簡潔に表現することができます。

とすることで、x座標を-9.71から9.71の範囲から外れないようにできます。Math.Clampを使ってコードを書き直してみます。

2行の処理が1行にまとまりました。意味が分かるとこちらのほうが楽ですね。

今回はここまでです。お疲れ様でした。

コメント

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