# 卵の操作

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

## シーン設定

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

![image.png](https://class.illogic.games/uploads/images/gallery/2026-07/scaled-1680-/PaEimage.png)

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

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

![image.png](https://class.illogic.games/uploads/images/gallery/2026-07/scaled-1680-/hNMimage.png)

重力を変えるには２つの方法がある：

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

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

![image.png](https://class.illogic.games/uploads/images/gallery/2026-07/scaled-1680-/w6yimage.png)

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

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

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

```c#
// 地球の重力
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 でＸ軸の左右にしましょう。

```c#
// 実行中に重力を変える
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](https://class.illogic.games/uploads/images/gallery/2026-07/scaled-1680-/GKiimage.png)

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

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

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

![image.png](https://class.illogic.games/uploads/images/gallery/2026-07/scaled-1680-/RL1image.png)

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

![image.png](https://class.illogic.games/uploads/images/gallery/2026-07/scaled-1680-/dB7image.png)

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

#### 加速度センサーを有効化

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

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

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

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

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

### スクリプト

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

```c#
// 実行中に重力を変える
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](https://class.illogic.games/uploads/images/gallery/2026-07/scaled-1680-/BQnimage.png)