小中高生向けプログラミングスクールTechChance!

【第二弾】Unityでキャラクターを歩かせよう!【2025年版実装方法解説】

WRITER
 
この記事を書いている人 - WRITER -
プログラミング教室TechChance!の運営担当。 広島県広島市出身。広島大学総合科学部数理情報科学コース卒業。 大学2年生の時にプログラミングの魅力に引き込まれ、アプリ開発やゲーム開発、Webサイト制作など幅広い分野でのプログラミングの知識と技術をベースに、立ち上げ当時からテックチャンスの運営に携わる。 大学受験進学塾「広大研」の数学科講師としてのスキルも生かし、教材作成力と指導力を駆使して、小中高生のプログラミンングへの好奇心とモチベーションを刺激するべく日々奮闘している。

こんにちは!

テックチャンスブログ編集部の國貞です!

前回の記事【第一弾】Unityでキャラクターを歩かせよう!【2025年版実装方法解説】で、キャラクターを歩かせるためのアニメーション設定について解説しました!

今回は、キャラクターを自分で操作できるように、プログラミングの部分について解説していきます!

そこまで難しくないので、手元にUnityを動かせる環境があれば、ぜひ一緒にやってみてくださいね!

 

前回のプロジェクトを開こう!

 

前回の続きから解説するよ!

まだ前回の内容を見てない人は、以下のリンクからアクセスして見てみよう!

【第一弾】Unityでキャラクターを歩かせよう!【2025年版実装方法解説】

 

キャラクターの設定をしよう!

 

前回作ったキャラクターが勝手に倒れてしまわないように少し設定するよ!

「SD_unitychan_humanoid」を選択して、「Inspector」の「Rigidbody」から、「Constraints」を見つけよう!

その中の「Freeze Rotation」で「X」と「Z」にチェックを入れておくよ!

これによって、x軸回転とz軸回転(縦と横の回転)を制限して倒れないようになるんだ!

 

 

キャラクターを制御するプログラムを作成する

 

次に、キャラクターの操作を制御するためのプログラムを作成するよ!

「Project」の「+」から、「MonoBehaviour Script」をクリックしよう!

 

プログラムの名前を「PlayerController」とするよ!

 

ダブルクリックして開くと、次のようなエディタが表示されるね!

 

 

プログラムからコンポーネントを読み込もう!

 

それではプログラミングしていきましょう!

まずはコンポーネントの読み込みからプログラムします。

using UnityEngine;


public class PlayerController : MonoBehaviour {

    private Rigidbody rb;
    private Transform tf;
    private Animator anim;

    void Start() {
        rb = GetComponent<Rigidbody>();
        tf = GetComponent<Transform>();
        anim = GetComponent<Animator>();
    }

    void Update() {


    }
}
今回はキャラクターの「Rigidbody」「Transform」「Animator」をプログラムから読み込んで制御していきます。
制御したコンポーネントはあらかじめ読み込んでおきましょう。

 

プログラムが書けたら、キャラクターにプログラムをアタッチしておきます!

SD_unitychan_humanoidを選択して、「Inspector」に「Player Controller(Script)」があれば正くアタッチされています!

ゲームを実行してみましょう!

Console画面に赤いエラーメッセージが出ていなければ問題ないです!

エラーが出ている場合は、プログラムをミスしている可能性がある(スペルミスなど)ので、もう一度チェックして実行してみましょう!

このとき、次のようなエラーが出る場合があります。

Invalid Layer Index '1'
UnityEngine.Animator:SetLayerWeight (int,single)
UnityChan.FaceUpdate:Update () (at Assets/UnityChan/Scripts/FaceUpdate.cs:48)

黄色いマークのエラーのため、ゲームの実行には問題ないですが、気になる人はキャラクターのキャラクターの「Face Update」のチェックをオフにしておきましょう!

 

 

キー入力で操作できるようにプログラムしよう!

 

キャラクターをキー入力で操作できるようにプログラムしていきましょう!

今回は矢印キーでキャラクターを前後左右に進ませるようにしていきます!

プログラムを次のように編集しましょう!

using UnityEngine;

public class PlayerController : MonoBehaviour {

    private Rigidbody rb;
    private Transform tf;
    private Animator anim;

    // 追加
    private float horizontal= 0;
    private float vertical = 0;

    void Start() {
        rb = GetComponent<Rigidbody>();
        tf = GetComponent<Transform>();
        anim = GetComponent<Animator>();
    }

    void FixedUpdate() { // FixedUpdateに修正
        horizontal = Input.GetAxis("Horizontal");
        vertical = Input.GetAxis("Vertical");
    }
}

プログラムでの矢印キーの入力は、左右のキーを「Input.GetAxis(“Horizontal”)」、上下のキーを「Input.GetAxis(“Vertical”)」で受け取ります!

左右のキー入力を受け取る「Input.GetAxis(“Horizontal”)」では、左矢印が「-1」、右矢印が「1」の値となります。

上下のキー入力を受け取る「Input.GetAxis(“Vertical”)」では、下矢印が「-1」、上矢印が「1」の値となります。

この値を使って、キャラクターの進む方向を制御してきます!

受け取ったこれらの値は、それぞれ変数「horizontal」「vertical」に代入して使います!
それではこれらの値を使ってキャラクターが進むようにしましょう!
プログラムの内容を次のように編集します!
using UnityEngine;

public class PlayerController : MonoBehaviour {

    private Rigidbody rb;
    private Transform tf;
    private Animator anim;
    private float horizontal= 0;
    private float vertical = 0;

    //追加
    private Vector3 velocity;
    private float speed = 1f;

    void Start() {
        rb = GetComponent<Rigidbody>();
        tf = GetComponent<Transform>();
        anim = GetComponent<Animator>();
    }

    void FixedUpdate() {
        horizontal = Input.GetAxis("Horizontal");
        vertical = Input.GetAxis("Vertical");

        // 追加
        velocity = new Vector3(horizontal, 0, vertical).normalized;
        rb.velocity = velocity * speed;
    }
}

 

このように書けたらゲームを実行してみましょう!

矢印キーを押すとキャラクターがその方向に滑って移動するようになりましたね!

 

 

 

ここまでできたらプログラムを次のように編集してみましょう!

using UnityEngine;

public class PlayerController : MonoBehaviour {

    private Rigidbody rb;
    private Transform tf;
    private Animator anim;
    private float horizontal= 0;
    private float vertical = 0;
    private Vector3 velocity;
    private float speed = 1f;

    void Start() {
        rb = GetComponent<Rigidbody>();
        tf = GetComponent<Transform>();
        anim = GetComponent<Animator>();
    }

    void FixedUpdate() {
        horizontal = Input.GetAxis("Horizontal");
        vertical = Input.GetAxis("Vertical");
        
        // 一部修正(rb.velocity -> rb.linearVelocity(Unity6の仕様です。Unity6以前ならrb.velocityのままでいいと思います。))
        velocity = new Vector3(horizontal, 0, vertical).normalized;
        rb.linearVelocity = velocity * speed;
        
        // 追記
        if (velocity.magnitude > 0.1f) {
            anim.SetBool("walking", true);
        } else {
            anim.SetBool("walking", false);
        }
    }
}

 

以上の通り編集できたら保存してゲームを実行してみましょう!

移動とともに、歩くモーションが追加されていますね!

 

ここまでのプログラムを簡単に解説すると

まず初めに、キャラクターを動かすために使う「変数(情報を入れておく箱)」を準備しています。

キャラクターの状態やキーボードから入力された情報、実際に移動する際にプログラムで計算に使う値などがこの変数に保存されます。

    private Rigidbody rb;
    private Transform tf;
    private Animator anim;
    private float horizontal= 0;
    private float vertical = 0;
    private Vector3 velocity;
    private float speed = 1f;

 

以下は、ゲームが始まった直後に実行されるプログラム部分です。

プログラムをアタッチしたキャラクターの「Rigidbody」「Transform」「Animator」の情報を直接読み込んでいます。

void Start() {
    rb = GetComponent<Rigidbody>();
    tf = GetComponent<Transform>();
    anim = GetComponent<Animator>();
}

 

以下はゲームプレイ中にずっと動くプログラム部分です。

キーボードから入力された情報を値に変換して変数に代入し、向きや進む速さを計算してキャラクターの動きに反映させています。

void FixedUpdate() {
    horizontal = Input.GetAxis("Horizontal");
    vertical = Input.GetAxis("Vertical");
        
    velocity = new Vector3(horizontal, 0, vertical).normalized;
    rb.linearVelocity = velocity * speed;
        
    if (velocity.magnitude > 0.1f) {
        anim.SetBool("walking", true);
    } else {
        anim.SetBool("walking", false);
    }
}

 

この状態でゲームをプレイすると、矢印キーで操作した方向にキャラクターが歩きながら移動することが分かりますね!

 

 

 

キャラクターの向きを制御しよう!

 

今のままだと、ずっと正面を向いたまま動くことになるので、進む方向よって向きを変えるように、「PlayerController」を開いてプログラムを次のように編集してみよう!

 

using UnityEngine;

public class PlayerController : MonoBehaviour {

    private Rigidbody rb;
    private Transform tf;
    private Animator anim;
    private float horizontal= 0;
    private float vertical = 0;
    private Vector3 velocity;
    private float speed = 1f;

    void Start() {
        rb = GetComponent<Rigidbody>();
        tf = GetComponent<Transform>();
        anim = GetComponent<Animator>();
    }


    void FixedUpdate() {
        horizontal = Input.GetAxis("Horizontal");
        vertical = Input.GetAxis("Vertical");


        velocity = new Vector3(horizontal, 0, vertical).normalized;
        rb.linearVelocity = velocity * speed;


    if (velocity.magnitude > 0.1f) {
        anim.SetBool("walking", true);
    } else {
       anim.SetBool("walking", false);
    }


    // 追記
    if (velocity != Vector3.zero) {
        tf.rotation = Quaternion.LookRotation(velocity);
    }
}
編集できたらゲームをプレイして動かしてみよう!

これで矢印キーを押した方向に向きを変えながら進むようになったね!

 

 

 

まとめ

 

今回はプログラミングによってキャラクターを動かすところまでを解説してみました!

今後もゲーム開発に役立つ内容を発信していきますのでお楽しみに!

 

お気軽にテックチャンスの無料体験にお越しください!

 

プログラミング教室テックチャンスでは、毎週土曜日と日曜日に無料のプログラミング体験会しています!

小学校低学年からでも楽しみながら学ぶことができるビジュアル型プログラミングを用いたScratchコースや、マインクラフトの中でプログラミングをして「タートル」というロボット動かすマインクラフトプログラミングコース実際にアプリやゲームを本格的に作れるUnityアプリ・ゲーム開発コースなど、初心者から上級者まで幅広くプログラミングを学べるよう多数のコースを揃えています!

コンピュータを全然触ったことがない方でも大丈夫!お気軽に無料体験にお越しください!

実際、TechChance! で初めてプログラミングを学び、一年半でプログラミングコンテストで受賞した生徒も居ます。

詳細はこちら学習歴たった1年半の広島県の高校生が、プログラミングコンテストで入賞出来た理由

機会を与えてあげられるのは、周りの大人だけ。

お待ちしています!

詳細はこちら80%超の参加者が入塾を決めるTechChance!の無料体験授業とは?

 

この記事を書いている人 - WRITER -
プログラミング教室TechChance!の運営担当。 広島県広島市出身。広島大学総合科学部数理情報科学コース卒業。 大学2年生の時にプログラミングの魅力に引き込まれ、アプリ開発やゲーム開発、Webサイト制作など幅広い分野でのプログラミングの知識と技術をベースに、立ち上げ当時からテックチャンスの運営に携わる。 大学受験進学塾「広大研」の数学科講師としてのスキルも生かし、教材作成力と指導力を駆使して、小中高生のプログラミンングへの好奇心とモチベーションを刺激するべく日々奮闘している。

Copyright© TechChance! 公式ブログ , 2022 All Rights Reserved.