Unityエディタ上ではエラーが出ないのにビルドするとエラーが出る
解決したいこと
Unityエディタ上では問題なくチャットウィンドウに文字を打ち込み、【sendボタン】または【Allボタン】をクリックでウィンドウとアバター頭上にテキストチャットが表示されていたのですが、ビルド後にAppを起動させてテストすると、チャットの送信自体ができません。
発生している問題・エラー
NullReferenceException: Object reference not set to an instance of an object
at InRoomChat222.SendChat (System.Boolean isAll) [0x00001] in /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:167
at InRoomChat222.ChatUIWindow (System.Int32 windowID) [0x0014d] in /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:123
at UnityEngine.GUILayout+LayoutedWindow.DoWindow (System.Int32 windowID) [0x00070] in /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUILayout.cs:444
確認したこと
①Script Debugにチェックを入れビルドし確認した所、上記のメッセージが確認できました。(※「PUNでクマちゃんを動かしてみた」はプロジェクト名です。。。。)
②UIウィンドウに設置してる【sendボタン】また【Allボタン】はどちもクリック自体はできています。
③起動したAppはチャット送信はできませんが、ゲームとしてはフリーズすること無く動いています。
該当するソースコード①(InRoomChat222.cs)
using System.Collections.Generic;
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(PhotonView))]
//↑RequireComponentは「自動的にPhotonViewをアタッチしてね」の指示。
public class InRoomChat222 : Photon.MonoBehaviour
{
#region 変数宣言
//↓範囲チャット実装のためのオブジェクト、変数定義
GameObject []players;
//ゲームオブジェクト型の配列「players」を定義。([]は配列の指示)。
//つまりこの文は全てのプレイヤーキャラ取得用
GameObject sender;//送信キャラ取得用
GameObject myPlayer;//自分のキャラ取得用
PlayerManager myPM;//自分のキャラのPlayerManager取得用
GUIStyle ChatStyle = new GUIStyle(); //範囲チャットStyle
GUIStyleState ChatStyleState = new GUIStyleState();
GUIStyle AllChatStyle = new GUIStyle(); //全体チャットStyle
GUIStyleState AllChatStyleState = new GUIStyleState();
public Rect GuiRect = new Rect(0,0,300,200); //チャットUIの大きさ設定用
public bool IsVisible = true;//チャットUI表示非表示フラグ
public bool AlignBottom = true;//Alginは「整列」の意味
public List<string> messages = new List<string>(); //チャットログ格納用List
public List<bool> chatKind = new List<bool>();
//チャットログの種類格納用(範囲チャor全チャ)
public string inputLine = "";//入力文章格納用String
private Vector2 scrollPos = Vector2.zero;//スクロールバー位置
#endregion
#region Start関数 Updata関数
public void Start()
{
GetmyPlayer();
//myPlayerオブジェクト取得(範囲チャット発言時にpositionとmyPM使う)
//範囲チャットの場合は白文字にし、文字がUIからあふれた場合は折り返す設定
ChatStyleState.textColor = Color.white;
ChatStyle.normal = ChatStyleState;
ChatStyle.wordWrap = true;
//全体チャットの場合は赤文字にし、文字がUIからあふれた場合は折り返す設定
AllChatStyleState.textColor = Color.red;
AllChatStyle.normal = AllChatStyleState;
AllChatStyle.wordWrap = true;
}
public void Update()
{
//ChatUIの位置を調整
this.GuiRect.y = Screen.height - this.GuiRect.height;
//ChatUIの大きさ調整
GuiRect.width = Screen.width / 3;
GuiRect.height = Screen.height / 3;
}
#endregion
#region OnGUI関数
public void OnGUI()
{
if (!this.IsVisible || !PhotonNetwork.inRoom)
//表示フラグがOFFまたはphotonにつながっていないときは。。。
{
//UI非表示
return;
}
//ChatUIの作成開始
//チャットUI生成 Begin&EndAreaでチャットUIの位置と大きさを設定
GUILayout.Window(0, GuiRect, ChatUIWindow, "");
//チャットUIウインドウを作成
//Enterを押すと。。。
if (Event.current.type == EventType.KeyDown && (Event.current.keyCode == KeyCode.KeypadEnter || Event.current.keyCode == KeyCode.Return))
{
//チャット入力待ち状態にする
GUI.FocusControl("ChatInput");
}
}
#endregion
#region チャットUI生成
void ChatUIWindow(int windowID)
{
//FocusがチャットUIに乗ってるときにEnterを押すとチャット発言が実行される
if (Event.current.type == EventType.KeyDown && (Event.current.keyCode == KeyCode.KeypadEnter || Event.current.keyCode == KeyCode.Return))
{
if (!string.IsNullOrEmpty(this.inputLine))
//チャット入力欄がNullやEmptyでない場合は。。。
{
//範囲チャット送信関数実行
SendChat(false);
return;
}
}
//垂直のコントロールグループ開始
GUILayout.BeginVertical();
//スクロールビュー開始位置
scrollPos = GUILayout.BeginScrollView(scrollPos);
//チャットログ表示用フレキシブルスペース生成
GUILayout.FlexibleSpace();
//フレキシブルスペースにチャットログを表示
for (int i = 0; i <= messages.Count - 1; i++)
{
if (chatKind[i] != true)//範囲チャットであれば
{
GUILayout.Label(messages[i], ChatStyle);
}
else//全チャットであれば
{
GUILayout.Label(messages[i], AllChatStyle);
}
}
//スクロールビュー終了
GUILayout.EndScrollView();
//水平のコントロールグループ開始
GUILayout.BeginHorizontal();
//入力テキストフィールド生成、Focusが乗った状態をChatInputと命名
GUI.SetNextControlName("ChatInput");
inputLine = GUILayout.TextField(inputLine, 200);
//「Send」ボタンを生成かつ押したときには範囲チャット送信
if (GUILayout.Button("Send", GUILayout.ExpandWidth(false)))
{
//範囲チャット送信関数実行
SendChat(false);
}
//Allボタンを生成かつ押したときには全体チャット送信
if (GUILayout.Button("All", GUILayout.ExpandWidth(false)))
{
SendChat(true);//全体チャット送信関数実行
}
GUILayout.EndHorizontal(); //水平のコントロールグループ終了
GUILayout.EndVertical();//垂直のコントロールグループ終了
}
#endregion
#region GetmyPlayer 自キャラのオブジェクトをmyPlayerに登録
void GetmyPlayer()
{
int myPlayerID = PhotonNetwork.player.ID;//自キャラのID取得
players = GameObject.FindGameObjectsWithTag("Player");
//↑13行で宣言している配列。Playerのタグがついているオブジェクトを全て探してきて。
//つまり全てのプレイヤーオブジェクトを取得。
//全てのプレイヤーオブジェクトから自キャラをIDで検索し、取り出す
foreach (GameObject player in players)
{
int playerLoopId = player.GetComponent<PhotonView>().owner.ID;
if (playerLoopId == myPlayerID)
{
myPlayer = player; //自プレイヤーオブジェクトを取得
myPM = myPlayer.GetComponent<PlayerManager>();
//自キャラの頭上にチャット表示するためにPlayerManager取得
}
}
return;
}
#endregion
#region チャット送信関数
void SendChat(bool isAll)
{
//chatRPC
this.photonView.RPC( "Chat", PhotonTargets.All, myPlayer.transform.position, this.inputLine, isAll);
//頭上にチャット表示するためにstring送信
myPM.setChat(this.inputLine);
//送信後、入力欄を空にし、スクロール最下位置に移動
this.inputLine = "";
scrollPos.y = Mathf.Infinity;
}
#endregion
#region ChatRPC RPC呼出側:送信者 RPC受信側:受信者
[PunRPC]
public void Chat(Vector3 senderposition, string newLine, bool isAll, PhotonMessageInfo mi)
{
if (messages.Count >= 100)
//チャットログが多くなって来たらログを削除してから受信
{
messages.Clear();//全てのチャットログを削除
chatKind.Clear();//全てのチャットの種類情報削除
}
if (!isAll) //範囲チャとして受信
{
//myPlayerとsenderの距離から受信するか判断
if (Vector3.Distance(myPlayer.transform.position, senderposition) < 30)
{
//chat受信
ReceiveChat(newLine, isAll, mi);
}
}
else if (isAll) //全チャとして受信
{
//chat受信
ReceiveChat(newLine, isAll, mi);
}
//受信したときはスクロール最下位置
scrollPos.y = Mathf.Infinity;
}
#endregion
#region チャット受信関数
void ReceiveChat(string _newLine, bool isAll, PhotonMessageInfo _mi)
{
//送信者の名前用変数
string senderName = "anonymous";
if (_mi.sender != null)
{
//送信者の名前があれば
if (!string.IsNullOrEmpty(_mi.sender.NickName))
{
senderName = _mi.sender.NickName;
}
else
{
senderName = "player " + _mi.sender.ID;
}
}
//受信したチャットをログに追加
this.messages.Add(senderName + ": " + _newLine);
this.chatKind.Add(isAll);
return;
}
#endregion
}
該当するソースコード②(GameManagerScript.cs)アバターランダムインスタンス用
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using Random = UnityEngine.Random;
public class GameManagerScript : Photon.PunBehaviour
{
//誰かがログインする度に生成するプレイヤーPrefab
//public GameObject playerPrefab;
void Start()
{
PhotonNetwork.ConnectUsingSettings("0.1");
if (!PhotonNetwork.connected) //Phootnに接続されていなければ
{
SceneManager.LoadScene("Launcher"); //ログイン画面に戻る
return;
}
//Photonに接続していれば自プレイヤーを生成
string playerName = "";
int _ranNum = Random.Range(1, 4);
playerName = "Player" + _ranNum;
var position = new Vector3(Random.Range(-10f, 10f), Random.Range(10f, 0f), Random.Range(-10f, 10f));
GameObject avatar = PhotonNetwork.Instantiate(playerName, position, Quaternion.identity,0);
}
// Update is called once per frame
void Update()
{
}
}
説明不足などございましたらご指摘頂ければと思います。
なれない質問ですが宜しくお願い致します。