UnityUnityメモ

Unity初心者向け:CharacterControllerでキャラクター操作と発射機能を作成する方法

Unity

はじめに

こんにちは!今回は、Unityを使ってキャラクターコントローラーでキャラクターを動かし、発射の仕組みを実装してみましょう。WASDキーで移動、スペースキーでジャンプ、クリックでボールを発射する方法を解説します。

Unityを触ったことがないという方はコチラの記事から見てみてください!



キャラクターの準備

まず、Unityを開き、シーンにキャラクターを配置しましょう。以下の手順で進めます。

新しいプロジェクトを作成

  1. Unity Hubを開いて、「新しいプロジェクト」をクリックします。プロジェクト名を「CharacterController」として、3Dテンプレートを選びましょう。

床を作成

  • ヒエラルキー(Hierarchy)ウィンドウで右クリックして、「3D Object」→「Plane」を選びます。これが床になります。

キャラクターをシーンに配置

  1. ヒエラルキー(Hierarchy)ウィンドウで右クリックして、「3D Object」→「Capsule」を選びます。これがキャラクターになります。
  2. わかりやすいように「Player」と名前を変更しましょう。
  3. キャラクターコントローラーを追加
    Playerオブジェクトを選択した状態で、インスペクター(Inspector)ウィンドウの「Add Component」ボタンをクリックし、「Character Controller」と入力して追加します。



キャラクターにアタッチするスクリプト

次に、キャラクターの動きを制御するスクリプトを作成します。

  1. スクリプトの作成
    プロジェクトウィンドウで右クリックし、「Create」→「C# Script」を選びます。スクリプト名を「PlayerMove」とします。
  2. スクリプトの編集
    スクリプトをダブルクリックして、Visual Studioを開き、以下のコードを入力します。

コード全体の説明

このスクリプトは、プレイヤーの移動とジャンプの機能を実現します。キャラクターが地面にいるかどうかを確認し、地面にいるならば移動方向を決め、ジャンプボタンが押されたらジャンプさせます。また、重力を考慮してキャラクターを動かします。

各部分の説明

  1. 変数の宣言:
    • speed: キャラクターの移動速度を表します。
    • jumpSpeed: キャラクターのジャンプの速さを表します。
    • gravity: 重力の強さを表します。
    • moveDirection: キャラクターの移動方向を保持します。
    • controller: キャラクターの動きを制御するためのコンポーネントを保持します。
  2. Start関数:
    • ゲームが始まるときに呼ばれ、CharacterControllerコンポーネントを取得してcontrollerに保存します。
  3. Update関数:
    • 毎フレーム呼ばれます。
    • controller.isGroundedでキャラクターが地面にいるか確認します。
    • 地面にいる場合:
      • 入力に基づいて移動方向を決定します。
      • キャラクターの向きに合わせて移動方向を変換します。
      • 速度を適用します。
      • ジャンプボタンが押されたら、ジャンプ速度を適用します。
    • moveDirection.yに重力を適用して、キャラクターが落下するようにします。
    • 最後に、controller.Moveでキャラクターを実際に動かします。

全体の動き

このスクリプトは、毎フレームごとにキャラクターの状態をチェックし、地面にいる場合は入力に応じて移動とジャンプを処理します。また、重力を考慮して、キャラクターが空中にいるときには落下させます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class PlayerMove : MonoBehaviour
{
    public float speed = 6.0f;
    public float jumpSpeed = 8.0f;
    public float gravity = 20.0f;
 
    private Vector3 moveDirection = Vector3.zero;
    private CharacterController controller;
 
    void Start()
    {
        controller = GetComponent<CharacterController>();
    }
 
    void Update()
    {
        if (controller.isGrounded)
        {
            moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical"));
            moveDirection = transform.TransformDirection(moveDirection);
            moveDirection = moveDirection * speed;
 
            if (Input.GetButton("Jump"))
            {
                moveDirection.y = jumpSpeed;
            }
        }
 
        moveDirection.y = moveDirection.y - (gravity * Time.deltaTime);
        controller.Move(moveDirection * Time.deltaTime);
    }
}



発射の仕組みを追加

キャラクターがクリックでボールを発射できるようにしましょう。

ボールの発射位置を作成する

  1. ヒエラルキーウィンドウで右クリックし、「CreateEmpty」を作成しプレイヤーの前方に配置します。位置を決めたらプレイヤーの子オブジェクトにします。

発射するボールの準備

  1. ヒエラルキーウィンドウで右クリックし、「3D Object」→「Sphere」を選びます。これが発射するボールになります。
  2. インスペクター画面の「AddComponent」ボタンをクリックします。
  3. 「Rigidbody」を追加しましょう。
  4. 「UseGravity」のチェックは外しておきます。
  5. プロジェクトウィンドウの「Prefabs」フォルダーにドラッグしてプレハブにします。

発射スクリプトの作成

発射位置として作成した空のオブジェクトに発射機能を追加します。

  1. 「Create」→「C# Script」を選びます。
  2. スクリプト名を「BallShot」とします。
  3. スクリプトを開いて以下のように編集します。

コード全体の説明

  1. public GameObject ballPrefab; – 発射するボールの元となるプレハブを指定します。
  2. public float speed; – ボールを発射する速度を指定します。
  3. void Update () – 毎フレーム実行されるメソッドです。ここでマウスのクリックを検知してボールを発射します。
  4. public void Shot() – ボールを生成し、前方向に発射するメソッドです。

各部分の説明

変数の定義

  • ballPrefabは、発射するボールのプレハブを格納する変数です。このプレハブはUnityのエディターで指定します。
  • speedは、ボールをどれくらいの速さで発射するかを決める変数です。

Updateメソッド

  • Updateメソッドは毎フレーム呼ばれます。
  • Input.GetMouseButtonDown(0)は、マウスの左ボタンが押された瞬間を検知します。0は左ボタンを意味します。
  • マウスの左ボタンが押されたら、Shotメソッドを呼び出します。

Shotメソッド

  • Shotメソッドは、ボールを生成して発射する役割を持ちます。
  • Instantiate(ballPrefab, transform.position, Quaternion.identity)は、ballPrefabを現在の位置(transform.position)に生成します。Quaternion.identityは、回転を無視する(初期状態の)設定です。
  • ball.GetComponent<Rigidbody>()は、生成したボールのRigidbodyコンポーネントを取得します。Rigidbodyは物理挙動を制御するコンポーネントです。
  • ballRigidbody.AddForce(transform.forward * speed)は、ボールに前方向(transform.forward)に向かって速度(speed)をかける力を加えます。

全体の動き

このスクリプトは、ゲームオブジェクトにアタッチされているとき、以下のように動きます:

  1. ゲーム開始後、毎フレームUpdateメソッドが実行されます。
  2. プレイヤーがマウスの左ボタンをクリックすると、Shotメソッドが呼ばれます。
  3. Shotメソッドは、ボールのプレハブを現在の位置に生成し、前方向に発射します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallShot : MonoBehaviour
{
    public GameObject ballPrefab;
    public float speed;
 
    void Update ()
    {
         if(Input.GetMouseButtonDown(0))
        {
            Shot();
        }
    }
    
    public void Shot(){
        GameObject ball = (GameObject)Instantiate(ballPrefab, transform.position, Quaternion.identity);
        Rigidbody ballRigidbody = ball.GetComponent<Rigidbody>();
        ballRigidbody.AddForce(transform.forward * speed);
    }
}

スクリプトをアタッチ

  • ヒエラルキーで発射位置としてオブジェクトを選びます。
  • ドラッグアンドドロップでスクリプトをアタッチします。
  • インスペクターウィンドウでの「ballPrefab」欄に「Sphere」のプレファブを設定します。



テストプレイ

設定が完了したら早速プレイしてみましょう。

Unityエディターの上部にある「▶(再生ボタン)」をクリックしてプレイモードを開始します。

これで、キャラクターがWASDキーで移動し、スペースキーでジャンプし、クリックでボールを発射するようになりました。スクリプトや設定を調整しながら、自分なりのゲームを作ってみてくださいね!

おすすめのアセット

「Third Person Controller」は、Unityで3人称視点のゲームを作るためのツールキットです。簡単に使えるので、初心者でも安心してゲーム開発を始められます。

このアセットの特徴は、キャラクターの動きやカメラの制御、戦闘システムなど、基本的な機能がすべて揃っていることです。たとえば、キャラクターが歩いたり走ったり、ジャンプしたりする動作がスムーズに再現できます。また、敵との戦闘やアイテムの収集といったゲームプレイ要素も簡単に追加できます。