はじめに
こんにちは!今日は、Unityでオブジェクトの動きを制限する方法について解説します。例えば、キャラクターやアイテムが特定の範囲から出ないようにしたい場合に便利です。とても簡単なので、一緒にやってみましょう!
Unityを触ったことがないという方はコチラの記事から見てみてください!
1.シーンにオブジェクトを配置する
まずは、シーンにオブジェクトを追加します。ここでは、Cube(キューブ)を使って説明します。
- Hierarchy(ヒエラルキー)ウィンドウで右クリックします。
- 「3D Object」を選び、「Cube」をクリックします。
これでシーンにキューブが追加されました。
2. スクリプトを作成する
次に、キューブの動かすスクリプトを作成します。
- Project(プロジェクト)ウィンドウで右クリックします。
- 「Create」を選び、「C# Script」をクリックします。
- スクリプトに「MovementController」という名前を付けます。
全体の説明
このスクリプトは「MovementController」という名前のクラスを定義しています。このクラスはUnityのMonoBehaviour
クラスを継承しており、オブジェクトがユーザーの入力に応じて動くようにするためのものです。具体的には、キーボードの矢印キーやWASDキーでオブジェクトを動かすことができます。
各部分の説明
クラスと変数の宣言
- MovementController: クラスの名前です。MonoBehaviourを継承しているので、Unityのゲームオブジェクトにアタッチできます。
- public float speed: オブジェクトの移動速度を設定するための公開変数です。初期値は5.0fです。
Updateメソッド
- void Update(): Unityの特別なメソッドで、毎フレーム(1秒間に数十回)呼ばれます。この中に書かれた処理は常に実行されます。
- Input.GetAxis(“Horizontal”): キーボードの左右の矢印キーやA、Dキーの入力を取得します。戻り値は-1から1の間の値です。
- Input.GetAxis(“Vertical”): キーボードの上下の矢印キーやW、Sキーの入力を取得します。こちらも戻り値は-1から1の間の値です。
- moveHorizontalとmoveVertical: 入力された値に移動速度(speed)を掛けたものです。
移動の計算と適用
- Vector3 movement: X軸(左右)とZ軸(前後)の移動を表すベクトルです。Y軸(上下)は0に固定しています。
- transform.Translate: オブジェクトの位置を変更するメソッドです。
- movement * Time.deltaTime: フレームごとの移動量を一定にするため、
Time.deltaTime
(前フレームからの経過時間)を掛けます。 - Space.World: ワールド座標系で移動することを指定します。
- movement * Time.deltaTime: フレームごとの移動量を一定にするため、
全体の動き
- 毎フレーム、キーボードの入力をチェックします。
- 入力に基づいて、オブジェクトの新しい移動方向を計算します。
- その方向に向かってオブジェクトを動かします。
using UnityEngine;
public class MovementController : MonoBehaviour
{
public float speed = 5.0f;
void Update()
{
float moveHorizontal = Input.GetAxis("Horizontal") * speed;
float moveVertical = Input.GetAxis("Vertical") * speed;
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
transform.Translate(movement * Time.deltaTime, Space.World);
}
}
スクリプトをオブジェクトにアタッチする
スクリプトをキューブに適用しましょう。
- Hierarchy(ヒエラルキー)ウィンドウでキューブをクリックします。
- Project(プロジェクト)ウィンドウで「MovementController」スクリプトを見つけます。
- 「MovementLimiter」スクリプトをドラッグして、キューブにドロップします。
動きに制限を加える
動きに制限を加えるには、オブジェクトの位置をチェックし、特定の条件下でのみ動かすようにします。例えば、オブジェクトが特定の範囲外に出た場合、それ以上移動できないように制限します。
全体の説明
このスクリプトは、ユーザーの入力に基づいてオブジェクトを動かし、さらにその位置を特定の範囲内に制限するものです。オブジェクトはキーボードの矢印キーやWASDキーで動かせますが、画面外に出ないように範囲が設定されています。
各部分の説明
- void Update(): Unityの特別なメソッドで、毎フレーム(1秒間に数十回)呼ばれます。この中に書かれた処理は常に実行されます。
- Input.GetAxis(“Horizontal”): キーボードの左右の矢印キーやA、Dキーの入力を取得します。戻り値は-1から1の間の値です。
- Input.GetAxis(“Vertical”): キーボードの上下の矢印キーやW、Sキーの入力を取得します。こちらも戻り値は-1から1の間の値です。
- moveHorizontalとmoveVertical: 入力された値に移動速度(speed)を掛けたものです。
移動の計算と制限
- Vector3 movement: X軸(左右)とZ軸(前後)の移動を表すベクトルです。Y軸(上下)は0に固定しています。
- newPosition: 現在の位置に移動分を足した新しい位置です。
Time.deltaTime
を掛けて、フレームごとの移動量を一定にします。 - Mathf.Clamp(newPosition.x, -10.0f, 10.0f): X軸の位置を-10.0と10.0の間に制限します。
- Mathf.Clamp(newPosition.z, -10.0f, 10.0f): Z軸の位置を-10.0と10.0の間に制限します。
- transform.position = newPosition: 計算された新しい位置をオブジェクトに適用します。
全体の動き
- 毎フレーム、キーボードの入力をチェックします。
- 入力に基づいて、オブジェクトの新しい移動方向を計算します。
- 新しい位置を計算し、その位置が指定された範囲内に収まるように制限します。
- 制限された位置をオブジェクトに適用します。
void Update()
{
float moveHorizontal = Input.GetAxis("Horizontal") * speed;
float moveVertical = Input.GetAxis("Vertical") * speed;
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
Vector3 newPosition = transform.position + movement * Time.deltaTime;
newPosition.x = Mathf.Clamp(newPosition.x, -10.0f, 10.0f);
newPosition.z = Mathf.Clamp(newPosition.z, -10.0f, 10.0f);
transform.position = newPosition;
}
このコードでは、Mathf.Clamp
関数を使用して、オブジェクトのx座標とz座標が-10から10の範囲内に収まるようにしています。これにより、オブジェクトは指定された範囲内でのみ移動できます。
上下の動きに制限を加える
上下の動きに制限を加える場合も、同様のアプローチを使用します。ただし、y座標に対する制限を加えることになります。
newPosition.y = Mathf.Clamp(newPosition.y, 0.0f, 5.0f);
この行をUpdate
メソッドに追加することで、オブジェクトの上下の動きも制御できるようになります。この場合、オブジェクトはy座標が0から5の範囲内でのみ移動できます。
プレイモードで動かしてみて、キューブが設定した範囲から出ないことを確認してください。これで、Unityでオブジェクトの動きを簡単に制限できるようになりましたね。お疲れ様でした!
おすすめのアセット
「Snake Warz.io スリザーワーム 完全ゲームテンプレート」は、Unityで簡単にスリザースタイルのゲームを作成できるテンプレートです。このアセットは、初心者にも優しい設計で、プログラミングの知識がなくても使用できます。
主な特徴:
- 簡単なカスタマイズ: ゲームの外観やルールを自由に変更可能。
- マルチプレイヤー対応: リアルタイムで他のプレイヤーと対戦できます。
- 高品質グラフィック: スムーズで魅力的なビジュアル。
- モバイル対応: iOSとAndroidでもプレイ可能。