エンカウント関連の処理を管理するためのクラスを1つ作成して管理を行うようにします。
ここでは
PlayerController クラスに EncountManager クラスの情報を渡す処理と、
プレイヤーが移動した際に一定の確率でエンカウントの発生を行う処理を実装します。
また、
一度エンカウントが発生すると、その後はエンカウントを発生させない制御も実装しています。
ただしこれは、実際のゲーム内において必要な制御であり、デバッグの際にもこの制御が働いてしまうため、
繰り返しエンカウント発生のデバッグ作業を行う際には不便な状態を引き起きします。
こういったケースでは、
デバッグのための機能を一緒に実装しておきます。
今回の場合であれば、エンカウントを発生後に指定した特定のボタンを操作することで
この制御をオフにする機能を実装しています。
そうすることで再度エンカウントを発生させることが出来るようになりますので、逐一ゲームを再実行する必要がなくなります。
このように
デバッグしやすい環境を自分で用意しておくことで、一回のプレイで何回でもエンカウントを発生が正常に行われているか繰り返しの確認が行えるようになるため、
デバッグをスムースに行うことができます。他のデバッグの際にも有用な方法ですので覚えておいてください。
ポイントとしては、
どのような機能があればデバッグがやりやすくなるだろうか、という部分で処理を見ていくことにあります。
なおスクリプト完成時点では、Start メソッドで呼び出す PlayerController クラス側の処理が未実装であるため、
必ずエラーが発生します。
そのため、この部分以外のエラーがなくなったら、一旦セーブをしてから、PlayerController クラスの修正を行います。
そちらに該当するメソッドを実装することで、EncountManager クラス側のエラーも解消されます。
EncountManager.cs
<= クリックすると開きます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EncountManager : MonoBehaviour
{
[SerializeField]
private PlayerController playerController;
[SerializeField]
private int encountRate = 2; // エンカウントの発生判定値
void Start() {
// PlayerController クラスに EncountManager クラスの情報を渡す
playerController.SetUpPlayerController(this); // <= この処理にエラーが出ます。
}
/// <summary>
/// ランダムエンカウントの発生
/// </summary>
public void JudgeRandomEncount() {
if (GameData.instance.isEncouting) {
return;
}
// ランダムな値(乱数)を作成
int randomValue = Random.Range(0, GameData.instance.randomEncountRate);
// ランダムな値が判定値よりも下ならエンカウント発生とする
if (randomValue <= encountRate) {
Debug.Log("エンカウント : " + randomValue);
GameData.instance.isEncouting = true;
// TODO プレイヤーキャラの位置と方向の情報を保存
// TODO Battle シーンへ遷移
}
}
void Update() {
// デバッグ用(GameData クラスの isDebug が true (インスペクター上ではチェックがオンの状態)の場合に Left Shift キーを押すことで動作する)
if (Input.GetKeyDown(KeyCode.LeftShift) && GameData.instance.isDebug) {
Debug.Log("エンカウント終了");
GameData.instance.isEncouting = false;
}
}
}
スクリプトを作成したらセーブを行います。
GameData.instance.randomEncountRate の値が大きいほど、乱数の幅が広がります。
また encountRate の値が大きい程、エンカウント発生率が上がります。
そのため、GameData.instance.randomEncountRate の値を小さくし、かつ、encountRate の値が大きければ高確率でエンカウントが発生する仕組みです。
このエンカウント発生判定を行う JudgeRandomEncount() メソッドは、FixedUpdate メソッドから実行される予定です。
そのため、1秒間に50回判定が発生する予定ですので、現在の数値設定ですと、高確率でエンカウントが発生します。
これはデバッグ用に GameData.instance.randomEncountRate の値を低くしているためですので、確認作業が終わったら調整してください。