グーグルアドセンス

広告

UnityとPhoton Pun2で作るオンラインアクションゲーム制作その4 プレイヤーキャラクターの設定

2020年3月28日

ユニティちゃんのインストール

正常にダウンロードとインポートが終わると、以下のようにAssetsフォルダ内にUnityChanフォルダが作成されます。

キャラクター設定

まずはインターネット上で動くキャラを作成する前に、オフライン上で動くキャラを作成します。手順は以下のようになります

  1. “Asset”フォルダ→”UnityChan”フォルダ→”Prefabs”フォルダ→unitychan.prefabというファイルがあるのでそれをHierarchyビューにドラッグ&ドロップ
  2. unitychanのプレハブについている”Idle Changer”スクリプトと”FaceUpdate”スクリプトと”AutoBlink”スクリプトを削除
  3. CharacterControlScriptを作成(↓にソースあり)
  4. CharacterControllerコンポーネントとCCharacterControlScriptを追加
  5. AnimatorのControllerを”UnityChanLocomotions”に変更
  6. CharacterControlScriptに必要な情報を入力

それでは以上の手順を行ったときの最終的なユニティちゃんのinspectorビューを見てみましょう。

今回キャラクターを動かすことに必要な新しい要素は以下の3つです

  • InputManager
  • CharacterControllerコンポーネント
  • CharacterControlScript

InputManager

ゲームでのプレイヤーの入力を管理するためにUnityが標準装備しているツールがInputManagerです。簡単に言えば、キーコンフィグの設定ツールです。

Photonを使ったオンラインゲームではキーコンフィグの設定もクライアント側に任せることもできます。詳しくは別の記事で解説します

CharacterControllerコンポーネント

今回はCharacterControllerコンポーネントを用いて、プレイヤーキャラクターを操作します。

キャラクターコントローラーには以下の大きく2つの役割があります。

  • キャラクターを動かす
  • キャラクターのコライダー(Collider)となる

具体的に述べると「CCharacterControlScript内でユーザの入力を受け付けて計算を行い。CharacterControllerコンポーネントに動かす方向を渡して、ユニティちゃんを動かす」という感じです。

CCharacterControlScript.csのソースコード

今回ユニティちゃんを動かすには、長いスクリプトかもしれませんが、覚える必要はありません。どこの数値を変えると、どう変化するか色々試してみましょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CCharacterControlScript : MonoBehaviour
{
	//移動処理に必要なコンポーネントを設定
	public Animator animator;                 //モーションをコントロールするためAnimatorを取得
	public CharacterController controller;    //キャラクター移動を管理するためCharacterControllerを取得
	//移動速度等のパラメータ用変数(inspectorビューで設定)
	public float speed;         //キャラクターの移動速度
	public float jumpSpeed;     //キャラクターのジャンプ力
	public float rotateSpeed;   //キャラクターの方向転換速度
	public float gravity;       //キャラにかかる重力の大きさ
	Vector3 targetDirection;        //移動する方向のベクトル
	Vector3 moveDirection = Vector3.zero;
	// Start関数は変数を初期化するための関数
	void Start () 
	{
	}
	// Update関数は1フレームに1回実行される
	void Update () 
	{
		moveControl();  //移動用関数
		RotationControl(); //旋回用関数
		//最終的な移動処理
		//(これが無いとCharacterControllerに情報が送られないため、動けない)
		controller.Move(moveDirection * Time.deltaTime);
	}
	void moveControl()
	{
		//★進行方向計算
		//キーボード入力を取得
		float v = Input.GetAxisRaw("Vertical");         //InputManagerの↑↓の入力       
		float h = Input.GetAxisRaw("Horizontal");       //InputManagerの←→の入力 
		//カメラの正面方向ベクトルからY成分を除き、正規化してキャラが走る方向を取得
		Vector3 forward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized;   
		Vector3 right = Camera.main.transform.right; //カメラの右方向を取得
		//カメラの方向を考慮したキャラの進行方向を計算
		targetDirection = h * right + v * forward;
		//★地上にいる場合の処理
		if (controller.isGrounded)      
		{
			//移動のベクトルを計算
			moveDirection = targetDirection*speed;
			//Jumpボタンでジャンプ処理
			if (Input.GetButton("Jump"))    
			{
				moveDirection.y = jumpSpeed;
			}
		}
		else        //空中操作の処理(重力加速度等)
		{
			float tempy = moveDirection.y;
			//(↓の2文の処理があると空中でも入力方向に動けるようになる)
			//moveDirection = Vector3.Scale(targetDirection, new Vector3(1, 0, 1)).normalized;
			//moveDirection *= speed;
			moveDirection.y = tempy - gravity * Time.deltaTime;
		}
		//★走行アニメーション管理
		if (v > .1 || v < -.1 || h > .1 || h < -.1) //(移動入力があると)
		{
			animator.SetFloat("Speed", 1f); //キャラ走行のアニメーションON
		}
		else    //(移動入力が無いと)
		{
			animator.SetFloat("Speed", 0f); //キャラ走行のアニメーションOFF
		}
	}
		
	void RotationControl()  //キャラクターが移動方向を変えるときの処理
	{
		Vector3 rotateDirection = moveDirection;
		rotateDirection.y = 0;
		//それなりに移動方向が変化する場合のみ移動方向を変える
		if (rotateDirection.sqrMagnitude > 0.01)
		{
			//緩やかに移動方向を変える
			float step = rotateSpeed * Time.deltaTime;
			Vector3 newDir = Vector3.Slerp(transform.forward, rotateDirection, step);
			transform.rotation = Quaternion.LookRotation(newDir);
		}
	}
}

スクリプトが完成したら、unitychanのinspectorビューに行き、以下の画像のようにAnimatorコンポーネントとCharacterControllerコンポーネントをCharacterControlScriptのAnimatorとControllerにそれぞれドラッグ&ドロップします。

以上でCharacterControlScriptの設定は終わりです。
この時に必ずAnimatorのControllerがUnityChanLocomotionsになってるか確認しましょう。違うのが入っているとアニメーションが動きません

実行結果

操作方法

キーボードの矢印キーでも動きますが[W][A][S][D]キーでも動きます。スペースでジャンプします。

C#, Unity

Posted by ジェイ