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

自機が画面外に出ないようにする
if文を使ってスクリプトを修正する
考え方として、動かしたときに自機の位置が画面の外に出たら、位置を画面内に戻してやればいいことになります。前回も出てきたif文を使ってみます。
void Update()
{
//左矢印が入力されたら、自機を左に動かす
if (Input.GetKey(KeyCode.LeftArrow)) transform.Translate(-0.05f, 0, 0);
//右矢印が入力されたら、自機を右に動かす
if (Input.GetKey(KeyCode.RightArrow)) transform.Translate(0.05f, 0, 0);
//画面外に移動しないように制限をかける
if (transform.position.x > 8f) transform.position.x = 8f;
}
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に数値を代入することはできないということです。
これは、おそらく多くの人が同じところではまってしまうと思いますが、別の形なら代入することができるのです。
Vector2型はxとyの2つの要素をもっています。Vector3型はxとyとzの3つの要素をもっています。2DのゲームにはVector2型で十分です。Vector2型の変数は次のようにして作ります。
new Vector2(xの値, yの値)
変更したいのは、xの値だけです。yの値は変えたくありませんので、tranform.position.yで現在のy座標を取得します。コードは次のようになりました。
if (transform.position.x > 8f) transform.position = new Vector2(8f, transform.position.y);
同じようにして、x座標が-8を下回った場合でもx座標を-8に修正するコードを追加しました。
if (transform.position.x < -8f) transform.position = new Vector2(-8f, transform.position.y);
Update関数の中はこうなりました。
void Update()
{
//左矢印が入力されたら、自機を左に動かす
if (Input.GetKey(KeyCode.LeftArrow)) transform.Translate(-0.05f, 0, 0);
//右矢印が入力されたら、自機を右に動かす
if (Input.GetKey(KeyCode.RightArrow)) transform.Translate(0.05f, 0, 0);
//画面外に移動しないように制限をかける
if (transform.position.x > 8f) transform.position = new Vector2(8f, transform.position.y);
if (transform.position.x < -8f) transform.position = new Vector2(-8f, transform.position.y);
}
実行してみましょう。

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

-9.71という値が画面の左端のようです。右端は9.71でしょう。これらの値をもとにコードを書き換えてみます。
void Update()
{
//左矢印が入力されたら、自機を左に動かす
if (Input.GetKey(KeyCode.LeftArrow)) transform.Translate(-0.05f, 0, 0);
//右矢印が入力されたら、自機を右に動かす
if (Input.GetKey(KeyCode.RightArrow)) transform.Translate(0.05f, 0, 0);
//画面外に移動しないように制限をかける
if (transform.position.x > 9.71f) transform.position = new Vector2(9.71f, transform.position.y);
if (transform.position.x < -9.71f) transform.position = new Vector2(-9.71f, transform.position.y);
}
}
早速実行してみましょう。

うまくいきました。
Math.Clampを使ってスクリプトを修正する
実は、Math.Clamp(制限したい変数, 最小値, 最大値)を使うと、今回のような制限をかける場合に、簡潔に表現することができます。
Mathf.Clamp(transform.position.x, -9.71f, 9.71f)
とすることで、x座標を-9.71から9.71の範囲から外れないようにできます。Math.Clampを使ってコードを書き直してみます。
void Update()
{
//左矢印が入力されたら、自機を左に動かす
if (Input.GetKey(KeyCode.LeftArrow)) transform.Translate(-0.05f, 0, 0);
//右矢印が入力されたら、自機を右に動かす
if (Input.GetKey(KeyCode.RightArrow)) transform.Translate(0.05f, 0, 0);
//画面外に移動しないように制限をかける
transform.position = new Vector2(Mathf.Clamp(transform.position.x, -8f, 8f), transform.position.y);
}
2行の処理が1行にまとまりました。意味が分かるとこちらのほうが楽ですね。
今回はここまでです。お疲れ様でした。
コメント