単独テストと、既存プログラムによる"不具合"の修正
目次
概要
単独で動作テストをする
挙動が「元々のデモ」と違う理由を探る
エラーの原因を特定し、修正を加える
ここまでのThirdPersonCameraの内容
起動時のカメラの位置も変更する
再度、単独で動作テストをする
単独クライアントとして正常に動作するか確認する
ネットワークに関わる一連の処理を組み込み終わりました。
早速、単独のクライアントとして動作するかどうか確認してみましょう。
単独で動作テストをする▲
プレイヤーキャラクタがきちんと動作するかどうかを確認する
ここまで組み込んだところで、プレイヤーキャラクタがきちんと動作するか確認をしてみましょう。
Unityエディタ上の実行ボタンを押してください。
実行して少し待つとGUIが現れるのですが、白色の背景に溶け込んで、「Room Name : 」の文字が見えないようです。
[Create Room] ボタンの左隣にあるのは、「ルーム名入力用のテキストボックス」ですので、
まずはそこにルーム名を入力し、[Create Room] ボタンを押しましょう。
ボタンを押すとプレイヤーが登場しますが、カメラが後ろに回り込みません。
一応、カーソルキーで移動したりスライディングしたりするのは確認できるようですが、
明らかに サンプルゲームをインポートした時の挙動 とは大きく異なります。
挙動が「元々のデモ」と違う理由を探る▲
コンソール側でエラー表示されているのを確認する
Unityエディタの左下に目を向けると、エラー(NullReferenceException)が発生していることがわかります。
エラーの内容を把握するために、Unityエディタのコンソールログを見ましょう。
Unity のメニューから Window > Console を選んで開いてください。
(またはProject タブの隣の Console タブをクリックしてください。)
以下のようにコンソールにエラーが表示されているのが分かります。
エラーが表示されているのが確認出来たところで、一旦エディタ上の実行を停止しておきましょう。
エラーの原因を特定する
コンソールウィンドウが表示されたら、その中にある
「NullReferenceException : Object reference not set an instance of an object」
と記述されている箇所をダブルクリックして、原因となるスクリプトファイルを開きます。
※ 環境によっては、
「NpShape::setFlag(s):triangle mesh and heightfield triggers are not supported!」
というエラーが表示される場合もありますが、こちらはどうしようもないので無視します。
※ NullReferenceException のエラーが表示されている項目が複数ある場合、
エラー表示の2行目に「ThirdPersonCamera ~」と表示されているものを選んでください。
ダブルクリックし、UnityEditor のコンソールログと比較して、
ThirdPersonCamera.cs の 18 行目、および 24 行目を目視で確認してみましょう。
エラーの原因を特定し、修正を加える▲
エラーの原因を特定する
コード内容、および NullReferenceException の例外から推察することは容易です。
このエラーがなぜ発生しているかについて簡単に解説すると、以下の通りです。
オンライン化の際にプレイヤーキャラクタをプレハブ化した結果、
ThirdPersonCamera.Start() メソッドの実行時(ゲームスタート時)にプレイヤーキャラクタが存在せず、
GameObject.FindWithTag("Player") の結果、および follow が示す値が null になってしまうから。
このエラーを回避するために、既存プログラムを修正しなければなりません。
ThirdPersonCamera.Start() 内のエラーを修正する
まず、
ThirdPersonCamera.Start() メソッドが実行される段階、つまり「このゲームをスタートし、サーバにまだ接続していない段階」で
プレイヤーキャラクタのオブジェクトを「他のクライアントと同時出現させる」ことはできない。
ため、ThirdPersonCamera.cs の 18 行目 の follow への情報追加は不可能です。
よって、18 行目のコードはコメントアウトします。
//follow = GameObject.FindWithTag ("Player").transform;
ThirdPersonCamera.LateUpdate() 内のエラーを修正する
Start() メソッド内で follow の情報を取得しない代わりに、
ThirdPersonCamera.LateUpdate() メソッドの冒頭で情報を取得し、LateUpdate() 内のエラーも回避しましょう。
ThirdPersonCamera.cs の LateUpdate() メソッドの冒頭に、以下の内容を書き加え、
follow に情報が取得できた場合のみ、本来の LateUpdate() 処理を実行するように制御します。
if (follow == null)
{
GameObject go = GameObject.FindWithTag("Player");
if (go == null) return;
follow = go.transform;
}
ここまでのThirdPersonCameraの内容▲
改めて触れますが、ここまでの ThirdPersonCamera.cs の内容は以下の通りです。
using UnityEngine;
using System.Collections;
/// <summary>
/// Third person camera.
/// </summary>
public class ThirdPersonCamera : MonoBehaviour
{
public float distanceAway;
public float distanceUp;
public float smooth; // how smooth the camera movement is
private Vector3 m_TargetPosition; // the position the camera is trying to be in)
Transform follow;
void Start(){
//follow = GameObject.FindWithTag ("Player").transform;
}
void LateUpdate ()
{
if (follow == null)
{
GameObject go = GameObject.FindWithTag("Player");
if (go == null) return;
follow = go.transform;
}
// setting the target position to be the correct offset from the
m_TargetPosition = follow.position + Vector3.up * distanceUp - follow.forward * distanceAway;
// making a smooth transition between it's current position and the position it wants to be in
transform.position = Vector3.Lerp(transform.position, m_TargetPosition, Time.deltaTime * smooth);
// make sure the camera is looking the right way!
transform.LookAt(follow);
}
}
起動時のカメラの位置も変更する▲
Projectビュー内の「Camera」の位置・姿勢を変更する
ついでに、起動時のカメラビューのままでは、こちらが用意したGUIが良く見えないので、カメラ位置を調整してしまいましょう。
Hierarchy にある「Camera」を選択してください。
シーンビュー内に Camera Preview が表示されますので、本来であれば、それを見ながら調整します。
今回は面倒ですので、Inspector に、以下の値を直接入力してください。
再度、単独で動作テストをする▲
改めて、プレイヤーキャラクタがきちんと動作するかどうかを確認する
改めて、プレイヤーキャラクタがきちんと動作するか確認をしてみましょう。
Unityエディタ上の実行ボタンを押してください。
実行して少し待つとGUIが現れます。さきほどよりも、少しは見やすくなりました。
"RoomName : " の右隣にあるテキストボックスにルーム名を入力し、[Create Room] ボタンを押しましょう。
ボタンを押すとプレイヤーが登場し、カメラが即座に後ろに回り込みます。
カーソルキーで移動したりスライディングしたりしている間も、カメラが追随してくれます。
NullReferenceException のエラー表示も消えています。