Unityでキャラクターを動かしてみよう!

プログラミング学習

今回は、ゲームエンジン「Unity」を使ってキャラクターを動かしてみましょう!

初心者でも完成させられるよう丁寧に解説しているので、ぜひトライしてみてくださいね!

 

プロジェクトを作成する

テンプレートを「3D」、プロジェクト名を「Unity_Run」とします。

キャラクターを用意する

UnityChan公式ホームページ(https://unity-chan.com/contents/guideline/)から、キャラクターをダウンロードします。

ライセンス確認にチェックを入れて進みます。

次の画面から「SDユニティちゃん 3Dモデルデータ」を探し、「Download」ボタンをクリックします。

ダウンロードしたファイルを開き、「Import」をクリックして、Unityに取り込みます。

Unityで確認してみると、「UnityChan」フォルダが追加されているのが分かります。

中にキャラクターに関するたくさんのデータが入っています。

 

キャラクターを表示させる

「UnityChan → SD_unitychan → Prefabs → SD_unitychan_humanoid」の順に展開し、「SD_unitychan_humanoid」をHierarchyにドラッグ&ドロップします。

Scene画面にキャラクターが表示されていればOKです。

Hierarchyの「SD_unitychan_humanoid」の名前をダブルクリックすると、キャラクターの近くまで視点が拡大します。

 

キャラクターの初期調整をする

今回使うキャラクターのユニティちゃんは、いきなりゲームなどで使えるよう既にほとんどの調整がされています。

そのため、今回のゲームに必要ない機能やバグについては最初に調整を行なっておきます。

バグの修正

ユニティちゃんは1つエラーの原因になるバグを含んでいます。

簡単に直せるので修正しておきましょう。

コンソール画面を開き、一番最初に表示されているこのエラーをダブルクリックします。

すると、エラーの原因になっているスクリプトファイルが開きますので、この中の8行目あたりにある

 

using System.Security.Policy;

の一文を「削除」します。

これでOKです。再度Unityを開きコンソールを確認すると、エラーが消えていることが分かります。

ゲーム画面の余計な表示を消す

今の状態でゲームを開始すると、ゲーム画面上に様々な機能を表示したGUIがデフォルトで表示されます。

今回はこれらの機能も表示も不要なので、ユニティちゃんのInspectorから機能と表示をオフにします。

SD_unitychan_humanoidを選択して、`Inspector`の`Idle Changer(Script)`のチェックと`Is GUI`のチェックをすべて外します。

ゲームを`Play`すると表示が消えていることが分かりますね。

 

地面を用意する(一応)

Hierarchyの「+」ボタンから、「3D Object → Plane」を選択し、表示させます。

InspectorからPositionのx,y, zをすべて0に、Scaleのxとzをそれぞれ10に設定します。

 

キャラクターのプログラムを作ろう

キャラクターを操作するためのプログラムを作成します。

今回は

  • 「Wキー」で前へ進む
  • 「Sキー」で後ろへ下がる
  • 「左右の矢印キー」で視点を回転する

のようにプログラムを作成します。

Projectの「+」ボタンから、「C# Script」を選択し、スクリプトの名前を「CharacterController」としておきます。

作成したら開きましょう。

※ class名がファイル名(CharacterController)と一致していることを確認してください。

 

コンポーネントを準備する

キャラクター操作のために必要なコンポーネントを用意しましょう。

ユニティちゃんを選択し、Inspectorの一番下の「Add Component」をクリックし

  • Rigidbody
  • Capsule Collider

を追加します。

「Rigidbbody」は、「Constraints → Freeze Rotation」の「XとZ」にチェックを入れる。

「Capsule Collider」は、「CenterのYを0.5」、「Radiusを0.2」に変更します。

 

前へ進む・後ろへ下がるプログラム

まずは、前への移動、後ろへの移動をプログラムしていきましよう

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class CharacterController : MonoBehaviour {

  private Rigidbody _rigidbody;

  private Transform _transform;

  private float _forwardSpeed = 3.0f;

  private float _backSpeed = 2.0f;

  private Vector3 _velocity;

  void Start() {

    _rigidbody = GetComponent<Rigidbody>();

    _transform = GetComponent<Transform>();

  }

  private void FixedUpdate() {

    float _horizontal = Input.GetAxis("Horizontal");

    float _vertical = Input.GetAxis("Vertical");

    _rigidbody.useGravity = true;

    _velocity = new Vector3(0, 0, _vertical);

    _velocity = _transform.TransformDirection(_velocity);

    if (_vertical > 0.1) {

      _velocity *= _forwardSpeed;

    }

    else if (_vertical < -0.1) {

      _velocity *= _backSpeed;

    }

      

    _transform.localPosition += _velocity * Time.deltaTime;

  }

}

 

ここまで書けたら保存して、Unityで「CharacterController」をユニティちゃんにアタッチします。

ゲームをプレイてみると、「Wキー」「Sキー」でユニティちゃんが進んだり下がったりするようになりました。

 

回転するようにプログラムする

今回回転については「左右の矢印キー」で行うようにプログラムしていきます。

プログラムを次のように修正しましょう。

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class CharacterController : MonoBehaviour {

  private Rigidbody _rigidbody;

  private Transform _transform;

  private float _forwardSpeed = 3.0f;

  private float _backSpeed = 2.0f;

  private float _rotateSpeed = 2.0f; // 追記する

  private Vector3 _velocity;

  void Start() {

    _rigidbody = GetComponent<Rigidbody>();

    _transform = GetComponent<Transform>();

  }

  private void FixedUpdate() {

    float _horizontal = Input.GetAxis("Horizontal");

    float _vertical = Input.GetAxis("Vertical");

    _rigidbody.useGravity = true;

    _velocity = new Vector3(0, 0, _vertical);

    _velocity = _transform.TransformDirection(_velocity);

    if (_vertical > 0.1) {

      _velocity *= _forwardSpeed;

    }

    else if (_vertical < -0.1) {

      _velocity *= _backSpeed;

    }

    _transform.Rotate(0, _horizontal * _rotateSpeed, 0); // 追記する

    _transform.localPosition += _velocity * Time.deltaTime;

  }

}

 

カメラを調整する

カメラはキャラクターの後ろを追従するように設定します。

まず、Sceneの画面でユニティちゃんの真後ろからのアングルにします。

Hierarchyの「SD_unitychan_humanoid」をダブルクリックします。

Scene内の右上のxyz軸を表したアイコンで、z(青色)の反対側の三角コーンをクリックします。

 

 

キャラクターの後ろからの視点になったと思います。

この状態で、Hierarchyの「Main Camera」を選択します。

上の項目のGameObjectから「Align With View」をクリックすると、Game画面がScene画面と同じ視点になります。

 

ゲームの視点を調整するときは、Scene画面で大体調整してから、カメラの視点に反映すると、楽になると思います。

この時のカメラTransformの値を参考に微調整します。

HierarchyでMain Cameraを選択し、InspectorからTransformを次のように調整します。

  • Position → x:0, y:2, z:3
  • Rotation → x:20, y:0, z:0

 

最後に、Hierarchyの「Main Camera」を「SD_unitychan_humanoid」に小オブジェクトとなるようにアタッチします。

 

このようになっていればOKです。

 

移動に動きを合わせる

移動に合わせて動くように設定します。

Projectの「+」ボタンから「Animator Controller」を選択し、名前を「CharacterAnimator」としておきます。

 

Hierarchyにて「SD_unitychan_humanoid」をクリックし、先ほど作成したCharacterAnimatorをユニティちゃんの「Animator → Controller」にアタッチします。

ChacracterAnimatorをダブルクリックし、Animator画面を開いたら、右上の鍵マークをロックしておきます。

 

止まっている状態

Animatorの画面を右クリックして「Create State → Empty」をクリックします。

 

ステートの名前を 「Idle」に変更し、その下のMotionには「standing@loop」を選択します。(2種類あるので、正常に動作する方を選択しましよう)

移動している状態

Animatorの画面を右クリックして「Create State → Empty」をクリックします。

ステートの名前を 「Locomotion」に変更し、その下のMotionには「Running@loop」を選択します。(2種類あるので、正常に動作する方を選択しましよう)

Animator画面の「Parameters」をクリックし、「Bool」を選択します。

作成したパラメータの名前は「Locomotion」としておきます。

Idleのステートを右クリックし、「Make New Transition」を選択、矢印を引っ張ったまま、Locomotionのステートをクリックします。

矢印で繋がればOKです。

今引いた矢印を選択し、Inspectorを次のように編集します。

– Has Exit TimeのチェックをOFF

– Conditionsの「+」ボタンをクリックし、「Locimotion|true」に変更

次のようになればOKです。

同様に、今度はLocomotionのステートを右クリックし、「Make New Transition」を選択、矢印を引っ張ったまま、Idleのステートをクリックします。

矢印で繋がればOKです。

今引いた矢印を選択し、Inspectorを次のように編集します。

– Has Exit TimeのチェックをOFF

– Conditionsの「+」ボタンをクリックし、「Locimotion|false」に変更

次のようになればOKです。

次に、これを動きに反映させるためプログラムを修正します。

CharacterControllerを開いて、次のようにプログラムを修正しましょう。

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class CharacterController : MonoBehaviour {

  private Rigidbody _rigidbody;

  private Transform _transform;

  private Animator _animator; // 追記する

  private float _forwardSpeed = 3.0f;

  private float _backSpeed = 2.0f;

  private float _rotateSpeed = 2.0f;

  private Vector3 _velocity;

  void Start() {

    _rigidbody = GetComponent<Rigidbody>();

    _transform = GetComponent<Transform>();

    _animator = GetComponent<Animator>(); // 追記する

  }

  private void FixedUpdate() {

    float _horizontal = Input.GetAxis("Horizontal");

    float _vertical = Input.GetAxis("Vertical");

    _rigidbody.useGravity = true;

    _velocity = new Vector3(0, 0, _vertical);

    _velocity = _transform.TransformDirection(_velocity);

    // 以下のif文を書き加える

    if (_vertical != 0) {

      _animator.SetBool("Locomotion", true);

    } else {

      _animator.SetBool("Locomotion", false);

    }

    if (_vertical > 0.1) {

      _velocity *= _forwardSpeed;

    }

    else if (_vertical < -0.1) {

      _velocity *= _backSpeed;

    }

    _transform.Rotate(0, _horizontal * _rotateSpeed, 0);

    _transform.localPosition += _velocity * Time.deltaTime;

  }

}

ここまでできたらプログラムを保存し、Unityを再生してみましょう。

移動にあわせてキャラクターが走るモーションをしているのが確認できますね。

 

まとめ

 

いかがだったでしょうか?

Unityでキャラクターが動かせるようになると開発できるゲームの幅も広がりますね!

 

もしプログラミング学習にお困りなら、TechPro(テックプロ)にお任せください!

あなたの現状と目標に合わせて、最適な学習コースのご提案学習計画のプランニングをお手伝いします。

お問い合わせは以下のボタンからお気軽にお申し込みください!

TechPro

ご連絡お待ちしています!