Week01_PlayerMovement - M-634/unity-game-dev-tutorial GitHub Wiki
🎯 今回のゴール
- Visual StudioとUnityの連携方法を理解する
- MonoBehaviour、Start()、Update()、FixedUpdate()の役割を知る
- プレイヤーの2D移動処理を実装する
🧭 準備・導入
.unitypackage の導入
.unitypackage
を 配布するのでUnity に読み込み(Assets > Import Package > Custom Package)- 全選択して Importする。
🧰 Visual StudioとUnityの連携設定
- Unityメニューから
Edit > Preferences > External Tools
を開く - External Script Editor を Visual Studio 2022 に設定
Assets/_Workspace/Test.cs
ファイルをダブルクリックして Visual Studio が起動すればOK
🛠 プレイヤーの移動を作成する
① Player プレハブの作成
1.Assets/UnityTechnologies/Playground/Images/Spaceships から好きな画像を選択してScene上に配置する。 2.Assets/_Workspace/Prefabs/ に Player プレハブを作成。
② スクリプト作成
Assets/_Workspace/Scripts/Player/ に PlayerMovement.cs を作成する。 そして以下のコードを記述してみる。
[RequireComponent(typeof(Rigidbody2D))]
public class PlayerMovement : MonoBehaviour
{
[SerializeField]
private Rigidbody2D _rigidbody2D;
[SerializeField]
private float _moveSpeed;
private void Start()
{
if (_rigidbody2D == null)
{
_rigidbody2D = GetComponent<Rigidbody2D>();
}
}
private void FixedUpdate()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector2 velocity = new Vector2(h, v).normalized;
_rigidbody2D.velocity = velocity * _moveSpeed;
}
}
③ スクリプトをアタッチする。
①で作成したPlayer.prefabにPlayerMovement.csをインスペクター上からAddComponentする。 (インスペクター上にドラッグ&ドロップでも大丈夫です。)
④ インスペクター上でコンポーネントを編集
- RigidBody2dコンポーネントのGravity Scale を「0」にする。
- PlayerMovement.csのmoveSpeed を「10」にする。
✅ 動作確認
ゲームを再生して、WASDキー or 矢印キーでプレイヤーが移動するかを確認する。
🧠 MonoBehaviourとスクリプトの基礎
📌 MonoBehaviour とは?
- Unityでゲームオブジェクトに動作を与えるための基本クラス
🔄 Start / Update / FixedUpdate の違い
関数名 | 呼び出しタイミング | 主な用途 |
---|---|---|
Start() |
ゲーム開始時に1度だけ呼ばれる | 初期化処理 |
Update() |
毎フレーム呼ばれる(フレーム依存) | 入力の取得・演出 |
FixedUpdate() |
一定時間ごとに呼ばれる(物理演算用) | 物理的な移動処理など |
Debug.LogでConsole上にログを出して挙動を確認してみよう。
void Start() {
Debug.Log("ゲーム開始!");
}
void Update() {
Debug.Log("毎フレーム実行");
}
void FixedUpdate() {
Debug.Log("物理更新");
}
🎓 補足:Rigidbody2DとTransform.Translateの違い
Unityでは、オブジェクトの移動方法に主に以下の2つがあります。
方法 | 特徴 | 用途 |
---|---|---|
Transform.Translate() | 位置を直接変更する。物理演算を無視する。 | UIの動きやエフェクト、小物の動きなどに最適 |
Rigidbody2D.velocity | 物理演算を使って移動。衝突や摩擦などが自然に働く。 | プレイヤー、敵、弾などのゲームロジック |
📌 具体例
// Transform を使った移動(物理演算は無視)
void Update() {
float moveX = Input.GetAxisRaw("Horizontal");
float moveY = Input.GetAxisRaw("Vertical");
transform.Translate(new Vector2(moveX, moveY) * moveSpeed * Time.deltaTime);
}
// Rigidbody2D を使った移動(衝突が有効)
void FixedUpdate() {
rb.velocity = moveDirection * moveSpeed;
}
🚫 なぜ Transform だけだとダメなの?
Rigidbody を使っている他のオブジェクト(例:壁や敵)と正しく衝突しない
物理演算の破綻が起きる可能性(他のオブジェクトがすり抜けたり跳ね飛んだり)
📝課題
カメラ外からプレイヤーがでないようにする。
壁となる GameObject を設置し、プレイヤーがカメラ外へ行かないように BoxCollider2Dコンポーネント で処理してみよう