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の連携設定

  1. Unityメニューから Edit > Preferences > External Tools を開く
  2. External Script EditorVisual Studio 2022 に設定
  3. 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コンポーネント で処理してみよう