Skip to main content

卵の操作

これからスクリプトを作成し、卵の動きと衝突を処理しましょう。卵の動き処理を実装しましょう。

シーン設定

迷路の左上に Prefabs の中にある Egg を入れてください:

image.png

キーボードによる卵の動き

スマホで遊ぶ前に、まずUnityで動作を確認したいので、キーボードを使い、重力の向きを変えて、卵が転がるようにしましょう。

image.png

重力を変えるには2つの方法がある:

プロジェクト設定で重力を変える

1回だけ重力を変え、後がずっと変わらないなら、プロジェクト設定で重力ベクトルを変えることができる。「Edit ⇒ Project Settings」を開き「Physics⇒Settings」(物理設定)を選ぶと

image.png

「Gravity」(重力)という設定がある。デフォルト値としては、地球の重力になっている(真下のベクトルで、加速度は9.81)。今回は実行中に重力を変えるので、次の方法で変えましょう:

スクリプトで重力を変える

スクリプトでは、「Physics.gravity」の値を代入すれば、重力をいつでも帰ることができる。例えば:

// 地球の重力
Physics.gravity = new Vector3(0, -9.81f, 0);

// 月のの重力
Physics.gravity = new Vector3(0, -1.625f, 0);

// 木星の重力
Physics.gravity = new Vector3(0, -24.5f, 0);

スクリプト

キーボードの WASD で重力ベクトルの向きを変えましょう W と S で Z軸の前後にし、A と D でX軸の左右にしましょう。

// 実行中に重力を変える
public class GravityController : MonoBehaviour
{
	// 重力の加速度(地球)
	const float Gravity = 9.81f;

	// 重力に与える倍率(強さの調整)
	[SerializeField] 
	private float gravityScale = 1.0f;

	private void Update()
	{
		// 重力のベクトル(Yはいつも下:-1)
		Vector3 vector = new Vector3(0, -1, 0);
		
		// WASDの入力( -1 ~ 1 )
		vector.x = Input.GetAxis("Horizontal"); // 左右(x軸)
		vector.z = Input.GetAxis("Vertical"); // 前後 (z軸)
	
		// 単位ベクトルにする
		vector.Normalize();
		
		// 最後に、重力の向きを変える
		Physics.gravity = vector * (Gravity * gravityScale);
	}
}

スクリプトを空のゲームオブジェクトに追加し、操作を確認してください:

image.png

加速度センサーによる卵の動き

加速度センサー(Accelerometer)はスマホの加速と減速を測定し、3Dベクトル(向きと強さ)として返す装置です。重力は地球の方向へ引っ張る力であり、真下の加速ベクトルととして現れる。

つまり、加速度センサーを使うことにより、重力ベクトルを測定できます。なお、スマホの加速度センサーの座標系は以下の通りです:

image.png

ただし、今回のゲームでは、カメラで見た座標系は:

image.png

なので、加速度センサーの ZとY軸を交換しないといけない。

加速度センサーを有効化

加速度センサーを使うために、まず有効化しないといけない。Unityは次の命令がある:

// 加速度センサーを使えるか?
if (Accelerometer.current != null)
{
    // 有効化する
    InputSystem.EnableDevice(Accelerometer.current);
}

加速度センサーの値を読み込む

そして、実行中に、以下のように加速度センサーのベクトルを読む:

// 加速度センサーを使えるか?
if (Accelerometer.current != null)
{
	// 加速度センサーの向きを取得
	Vector3 acc = Accelerometer.current.acceleration.ReadValue();
}

スクリプト

GravityController を更新し、スマホの加速度センサーを使える場合は、実際の重力データを利用しましょう:

// 実行中に重力を変える
public class GravityController : MonoBehaviour
{
	// 重力の加速度(地球)
	const float Gravity = 9.81f;

	// 重力に与える倍率(強さの調整)
	[SerializeField] 
	private float gravityScale = 1.0f;

	private void Start()
	{
		// 加速度センサーを使えるか? → 有効化
		if (Accelerometer.current != null)
			InputSystem.EnableDevice(Accelerometer.current);
	}
	
	private void Update()
	{
		// 重力のベクトル(Yはいつも下:-1)
		Vector3 vector = new Vector3(0, -1, 0);
		
		// 加速度センサーを使えるか?
		if (Accelerometer.current != null)
		{
			// 加速度センサーの向きを取得
			Vector3 acc = Accelerometer.current.acceleration.ReadValue();

			// センサーの軸をゲームの軸へ変換
			vector.x = acc.x;  // X はそのまま
			vector.z = acc.y;  // ゲームの Z は、加速度センサーの Y である
 		}
		else
		{
			// WASDの入力
			vector.x = Input.GetAxis("Horizontal"); // 左右(x軸)
			vector.z = Input.GetAxis("Vertical"); // 前後 (z軸)
		}
	
		// 単位ベクトルにする
		vector.Normalize();
		
		// 最後に、重力の向きを変える
		Physics.gravity = vector * (Gravity * gravityScale);
	}
}

実機で確認

スマホとPCをUSBケーブルで接続し、Build Profiles を開いてください。「Run Device」で端末を選び、「Build And Run」でビルドし、実行を確認してください。

image.png