ichika_Uniuni
@ichika_Uniuni (ichika uniuni)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

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()
    {

    }
}

説明不足などございましたらご指摘頂ければと思います。

なれない質問ですが宜しくお願い致します。

0

8Answer

お願い

エラーの示すメソッド「InRoomChat222.SendChat」と、行数「InRoomChat222.cs の 167行」が、コードと一致しないように見えます。
エラーを控えた後でコードを編集したとか、エラーログとコードが別の時のものという可能性はないでしょうか?
もし、思い当たることがおありなら、再度、同じ時点のコードとエラーログをセットで拝見できないでしょうか。

エラー
  at InRoomChat222.SendChat (System.Boolean isAll) [0x00001] in /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:167
コード
167    }
168    #endregion
169
170    #region チャット送信関数
171    void SendChat(bool isAll)
172    {

ご提案

SendChat内でDebug.Logや画面に出力して、myPlayermyPMnullでないかチェックできないでしょうか。

追記

まだ行番号がズレるようですが、幸い、新たなデバッグ出力結果を添えていただいたので、追跡可能です。

出力1
(Filename: /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs Line: 37)
myPlayer(確認1)
UnityEngine.StackTraceUtility:ExtractStackTrace () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs:37)
UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
UnityEngine.Logger:Log (UnityEngine.LogType,object)
UnityEngine.Debug:Log (object)
InRoomChat222:SendChat (bool) (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:183)
以下略
出力2
(Filename: /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs Line: 37)
myPM(確認1)
UnityEngine.StackTraceUtility:ExtractStackTrace () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs:37)
UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
UnityEngine.Logger:Log (UnityEngine.LogType,object)
UnityEngine.Debug:Log (object)
InRoomChat222:SendChat (bool) (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:184)
以下略

出力1が183行、出力2が184行なので、SendChatは、以下のような行番号であることが解ります。

コード
180    #region チャット送信関数
181    void SendChat(bool isAll)
182    {
183        Debug.Log(myPlayer + "myPlayer(確認1)"); // ⇒ 出力1
184        Debug.Log(myPM + "myPM(確認1)"); // ⇒ 出力2
185
186        //chatRPC
187        this.photonView.RPC( "Chat", PhotonTargets.All, myPlayer.transform.position, this.inputLine, isAll);
188        //頭上にチャット表示するためにstring送信
189        myPM.setChat(this.inputLine);
190
191        Debug.Log(myPlayer + "myPlayer(確認2)");
192        Debug.Log(myPM + "myPM(確認2)");
193
194        //送信後、入力欄を空にし、スクロール最下位置に移動
195        this.inputLine = "";
196        scrollPos.y = Mathf.Infinity;
197
198        Debug.Log(myPlayer + "myPlayer(確認3)");
199        Debug.Log(myPM + "myPM(確認3)");
200
201    }
202    #endregion

「null参照例外」のエラーは187行ですね。

エラー
NullReferenceException: Object reference not set to an instance of an object
at InRoomChat222.SendChat (System.Boolean isAll) [0x0002d] in /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:187
以下略

つまり、以下の行で「null参照」があったわけです。

エラー行
187        this.photonView.RPC( "Chat", PhotonTargets.All, myPlayer.transform.position, this.inputLine, isAll);

ということは、myPlayernullの可能性があります。
実際、出力1で「myPlayer(確認1)」の前にあるべき値が書かれていないようです。

さて、myPlayerをセットしているのは、以下の辺りです。

コード
    #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

myPlayerは明示的に初期化していないので初期値はnullです。
従って、ここで条件(playerLoopId == myPlayerID)が成立しないとnullのままになります。

試みに、このif文中で、myPlayerへ代入したらログを出力するようにして、SendChatへ来る(出力1が出る)までに代入できたかどうかを確認するのはいかがでしょうか。

0Like

Comments

  1. @ichika_Uniuni

    Questioner

    ありがとうございます!
    ご指摘のとうりエラー内容とコードに相違があった様でしたので、上記質問内の「該当するソースコード①(InRoomChat222.cs)」を修正致しました!

    そしてエラー内容は
    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
    at UnityEngine.GUI.CallWindowDelegate (UnityEngine.GUI+WindowFunction func, System.Int32 id, System.Int32 instanceID, UnityEngine.GUISkin _skin, System.Int32 forceRect, System.Single width, System.Single height, UnityEngine.GUIStyle style) [0x00078] in /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUI.cs:1694

    (Filename: /Volumes/保存倉庫/unity/PUN2てクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs Line: 167)

    となり、最初に指摘されている箇所は
    【167行目】の if (playerLoopId == myPlayerID) と記載されている行となります。
    これは void GetmyPlayer での行程になります。

    初めてですので、Qiitaの使いかたもわからず、ずらずらと書いてしまいましたがいかがでしょうか??
    宜しくお願い致します。
  2. @ichika_Uniuni

    Questioner

    すいません!上記質問者コメントにて「これは void GetmyPlayer での行程になります。」と記載していますが、エラー内容的には【SendChat内】となっています。。。どういう事かちょっと理解が追いついていません。。引き続き調べていきます。
    迂闊に削除すると逆にややこしいかとおもいますので、あえてコメント残しておきます。。。
  3. 情報ありがとうございます。
    上の回答本文に追記いたしました。
  4. 追加情報ありがとうございます。

    `foreach ( GameObject player in players)`
    のループを一度も通らなかったとすると、
    `players = GameObject.FindGameObjectsWithTag("Player");`
    で、何も見つからなかったのかもしれません。
    `Player`というタグの付いた`GameObject`がシーン上に見つからなかった可能性が考えられますね。
  5. @ichika_Uniuni

    Questioner

    大変ありがとうございます!!
    PlayerのTagですが、確認しましたが問題なく設定されておりました。。。
    プレイヤーが4つの中からランダムで選ばれる仕様ですので、4つとも確認しましたが、やはり全て問題なくタグ設定されています。
    また、念のためPlayerというタグ名を別の物に変え、同じくスクリプとの当該箇所も変更して検証してみましたが、改善は見られませんでした。。。
    何度もありがとうございます!
  6. `ConnectUsingSettings() failed. Can only connect while in state 'Disconnected'. Current state: Connected`というエラーが、`GameManagerScript.cs`の`Start ()`内、16行目で生じていますね。
    「`ConnectUsingSettings ()`は、"切断"状態でしか使えないのに、今は"接続済み"だったから失敗した」みたいな意味です。

    PUNを使うに際してのロジックは大丈夫なのでしょうか?
  7. @ichika_Uniuni

    Questioner

    ありがとうございます!
    ご指摘頂いた`GameManagerScript.cs`の`Start ()`内、16行目の【PhotonNetwork.ConnectUsingSettings("0.1");】 ですが、1度コメントアウトしてみました。
    結果として下記が得られました
    ①"ConnectUsingSettings() failed〜"のエラーは表示されなくなました
    ②プロジェクトは問題無く動作しています
    ③しかしながら本来の問題は解決できませんでした。。。

    また前回お伝えしたVisualcode内に表示されていた『フィールド"InRoomChat222.player”は割り当てられません。常に既定値nullを使用します』ですが、こちらの記事( https://oshiete.goo.ne.jp/qa/4408011.html )を参考にして修正した所warinigの表示は消えました。しかしこちらも本来の問題の解決には至りませんでした。。。。
  8. Build SettingsとHierarchyの様子を拝見させていただいてもよろしいでしょうか?
  9. @ichika_Uniuni

    Questioner

    解決できました!!!!!!ほんっっっとうにありがとうございました!!!!
  10. 解決できたようで良かったです。
    あまりお役に立てなくてごめんなさい。

確認してきました!

確認したこと

当該のスクリプト「InRoomChat222」に以下を加筆しました。

InRoomChat222内void SendChat部分
  #region チャット送信関数
    void SendChat(bool isAll)
    {
        Debug.Log(myPlayer + "myPlayer(確認1)");
        Debug.Log(myPM + "myPM(確認1)");

        //chatRPC
        this.photonView.RPC( "Chat", PhotonTargets.All, myPlayer.transform.position, this.inputLine, isAll);
        //頭上にチャット表示するためにstring送信
        myPM.setChat(this.inputLine);

        Debug.Log(myPlayer + "myPlayer(確認2)");
        Debug.Log(myPM + "myPM(確認2)");

        //送信後、入力欄を空にし、スクロール最下位置に移動
        this.inputLine = "";
        scrollPos.y = Mathf.Infinity;

        Debug.Log(myPlayer + "myPlayer(確認3)");
        Debug.Log(myPM + "myPM(確認3)");

    }
    #endregion

①,void SendChat内にDebug.Logとして「myPlayer」と「myPM」をそれぞれ加筆しました。

②,どこで止まっているかを確認するため、Debug.Log「myPlayer」と「myPM」は(確認1〜3)とそれぞれ3箇所に加筆しました。

③,念のためvoid GetmyPlayer内にもDebug.Log("myPlayerID="+ myPlayerID) を加筆しました。
    下記画像内の2つめのログ myPlayerID=1 が結果となります。

④,この状態で1度エディタで動作確認をし、画像の様な結果が得られました。
スクリーンショット 2021-10-19 21-10-19 22.54.09.jpg

⑤,同じくこの状態でビルドし、sendボタンを押した際に出るエラーが以下の様になりました。

エラー内容
(Filename: /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs Line: 37)

myPlayer(確認1)
UnityEngine.StackTraceUtility:ExtractStackTrace () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs:37)
UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
UnityEngine.Logger:Log (UnityEngine.LogType,object)
UnityEngine.Debug:Log (object)
InRoomChat222:SendChat (bool) (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:183)
InRoomChat222:ChatUIWindow (int) (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:139)
UnityEngine.GUILayout/LayoutedWindow:DoWindow (int) (at /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUILayout.cs:444)
UnityEngine.GUI:CallWindowDelegate (UnityEngine.GUI/WindowFunction,int,int,UnityEngine.GUISkin,int,single,single,UnityEngine.GUIStyle) (at /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUI.cs:1694)

(Filename: /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs Line: 37)

myPM(確認1)
UnityEngine.StackTraceUtility:ExtractStackTrace () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs:37)
UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
UnityEngine.Logger:Log (UnityEngine.LogType,object)
UnityEngine.Debug:Log (object)
InRoomChat222:SendChat (bool) (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:184)
InRoomChat222:ChatUIWindow (int) (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:139)
UnityEngine.GUILayout/LayoutedWindow:DoWindow (int) (at /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUILayout.cs:444)
UnityEngine.GUI:CallWindowDelegate (UnityEngine.GUI/WindowFunction,int,int,UnityEngine.GUISkin,int,single,single,UnityEngine.GUIStyle) (at /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUI.cs:1694)

(Filename: /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs Line: 37)

NullReferenceException: Object reference not set to an instance of an object
at InRoomChat222.SendChat (System.Boolean isAll) [0x0002d] in /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:187
at InRoomChat222.ChatUIWindow (System.Int32 windowID) [0x0014d] in /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:139
at UnityEngine.GUILayout+LayoutedWindow.DoWindow (System.Int32 windowID) [0x00070] in /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUILayout.cs:444
at UnityEngine.GUI.CallWindowDelegate (UnityEngine.GUI+WindowFunction func, System.Int32 id, System.Int32 instanceID, UnityEngine.GUISkin _skin, System.Int32 forceRect, System.Single width, System.Single height, UnityEngine.GUIStyle style) [0x00078] in /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUI.cs:1694

(Filename: /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs Line: 187)

となり、エラー指摘は187行目の this.photonView.RPC( "Chat", PhotonTargets.All, myPlayer.transform.position, this.inputLine, isAll); の箇所となります。

また確認用のDebug.Logは184行目の(myPM + "myPM(確認1)までしか出力されておらず、191行目の確認2は出力されていません。

以上大変稚拙ですが、ここまで確認致しました。
ご指導宜しくお願い致します。

0Like

大変ありがとうございます!!
Qiitaが初めてなもので、やりとりをどちらに書くべきかをまだ把握しかねておりますが、こちらに記載させて頂きます。

###修正した事
①InRoomChat222内の以下のタイミングでDebug.Logを追記しました。
1,Startメソッド内「GetmyPlayer」実行前に【player】のどのように検出されるかのチェック用

2,GetmyPlayer内の最初に【そもそもGetmyPlayer】は実行されているかどうかの確認用

3,foreach構文内冒頭にplayer、playerLoopId、myPlayerIDの3種のそれぞれの状態確認用。

4,foreach構文内if文冒頭にmyPlayerIDの状態確認用。

5,foreach構文内if文内【myPlayer = player;】後のmyPlayerの状態確認用。

だいぶごちゃごちゃしてしまいましたが、上記の様に追加してみました。
また上記をUnity上で動かした際に得られた結果が下記画像になります。
スクリーンショット 2021-10-20 21-10-20 14.32.14.jpg
Unity上ではすべてログが検出されており、プロジェクトが問題なく動いていると思われます。

また修正したコードを記載させて頂きます。

修正したInRoomChat222
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;//自分のキャラ取得用
    GameObject player;

    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()
    {
        Debug.Log("GetmyPlayer実行前のPlayer→→→" + player);

        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, 20);

        //「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()
    {
        Debug.Log("GetmyPlayerメソッドが実行されているか確認→OK!!");

        int myPlayerID = PhotonNetwork.player.ID;//自キャラのID取得
        players = GameObject.FindGameObjectsWithTag("Player");

        foreach ( GameObject player in players)
        {
            int playerLoopId = player.GetComponent<PhotonView>().owner.ID;
            Debug.Log("player.GetComponent<PhotonView>後のPlayer→→→" + player);
            Debug.Log("player.GetComponent<PhotonView>後のplayerLoopId→→→" + playerLoopId);
            Debug.Log("player.GetComponent<PhotonView>後のmyPlayerID→→→" + myPlayerID);

            if (playerLoopId == myPlayerID)
            {
                Debug.Log("playerLoopId == myPlayerID後のmyPlayerID=" + myPlayerID) ;

                myPlayer = player; //自プレイヤーオブジェクトを取得
                Debug.Log("playerLoopId == myPlayerID後のmyPlayer→→→" + myPlayer);
               
                myPM = myPlayer.GetComponent<PlayerManager>();
                //自キャラの頭上にチャット表示するためにPlayerManager取得
            }
        }
        return;
    }
    #endregion

    #region チャット送信関数
    void SendChat(bool isAll)
    {
        Debug.Log(myPlayer + "myPlayer(確認1)");
        
        //chatRPC
        this.photonView.RPC( "Chat", PhotonTargets.All, myPlayer.transform.position, this.inputLine, isAll);
        //頭上にチャット表示するためにstring送信
        myPM.setChat(this.inputLine);

        Debug.Log(myPlayer + "myPlayer(確認2)");
       
        //送信後、入力欄を空にし、スクロール最下位置に移動
        this.inputLine = "";
        scrollPos.y = Mathf.Infinity;

        Debug.Log(myPlayer + "myPlayer(確認3)");

    }
    #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
}

そしてこの状態でビルドし、Sendボタン実行時に確認したエラー表記がこちらになります。

エラー内容

ルームに入りました。
UnityEngine.StackTraceUtility:ExtractStackTrace () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs:37)
UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
UnityEngine.Logger:Log (UnityEngine.LogType,object)
UnityEngine.Debug:Log (object)
LauncherScript:OnJoinedRoom () (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/LauncherScript.cs:53)
NetworkingPeer:SendMonoMessage (PhotonNetworkingMessage,object[]) (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Buy_Asset/Photon Unity Networking/Plugins/PhotonNetwork/NetworkingPeer.cs:2887)
NetworkingPeer:OnEvent (ExitGames.Client.Photon.EventData) (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Buy_Asset/Photon Unity Networking/Plugins/PhotonNetwork/NetworkingPeer.cs:2595)
ExitGames.Client.Photon.PeerBase:DeserializeMessageAndCallback (ExitGames.Client.Photon.StreamBuffer)
ExitGames.Client.Photon.EnetPeer:DispatchIncomingCommands ()
ExitGames.Client.Photon.PhotonPeer:DispatchIncomingCommands ()
PhotonHandler:Update () (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Buy_Asset/Photon Unity Networking/Plugins/PhotonNetwork/PhotonHandler.cs:161)

(Filename: /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs Line: 37)

Unloading 6 Unused Serialized files (Serialized files now loaded: 0)
UnloadTime: 9.067607 ms
System memory in use before: 33.8 MB.
System memory in use after: 33.9 MB.

Unloading 8 unused Assets to reduce memory usage. Loaded Objects now: 811.
Total: 10.230888 ms (FindLiveObjects: 0.826530 ms CreateObjectMapping: 0.037055 ms MarkObjects: 9.299037 ms DeleteObjects: 0.067025 ms)

GetmyPlayer実行前のPlayer→→→
UnityEngine.StackTraceUtility:ExtractStackTrace () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs:37)
UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
UnityEngine.Logger:Log (UnityEngine.LogType,object)
UnityEngine.Debug:Log (object)
InRoomChat222:Start () (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:42)

(Filename: /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs Line: 37)

GetmyPlayerメソッドが実行されているか確認→OK!!
UnityEngine.StackTraceUtility:ExtractStackTrace () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs:37)
UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
UnityEngine.Logger:Log (UnityEngine.LogType,object)
UnityEngine.Debug:Log (object)
InRoomChat222:GetmyPlayer () (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:159)
InRoomChat222:Start () (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:44)

(Filename: /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs Line: 37)

ConnectUsingSettings() failed. Can only connect while in state 'Disconnected'. Current state: Connected
UnityEngine.StackTraceUtility:ExtractStackTrace () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs:37)
UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
UnityEngine.Logger:Log (UnityEngine.LogType,object)
UnityEngine.Debug:LogWarning (object)
PhotonNetwork:ConnectUsingSettings (string) (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Buy_Asset/Photon Unity Networking/Plugins/PhotonNetwork/PhotonNetwork.cs:1196)
GameManagerScript:Start () (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/GameManagerScript.cs:16)

(Filename: /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs Line: 37)

myPlayer(確認1)
UnityEngine.StackTraceUtility:ExtractStackTrace () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs:37)
UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
UnityEngine.Logger:Log (UnityEngine.LogType,object)
UnityEngine.Debug:Log (object)
InRoomChat222:SendChat (bool) (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:189)
InRoomChat222:ChatUIWindow (int) (at /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:142)
UnityEngine.GUILayout/LayoutedWindow:DoWindow (int) (at /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUILayout.cs:444)
UnityEngine.GUI:CallWindowDelegate (UnityEngine.GUI/WindowFunction,int,int,UnityEngine.GUISkin,int,single,single,UnityEngine.GUIStyle) (at /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUI.cs:1694)

(Filename: /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs Line: 37)

NullReferenceException: Object reference not set to an instance of an object
at InRoomChat222.SendChat (System.Boolean isAll) [0x00017] in /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:192
at InRoomChat222.ChatUIWindow (System.Int32 windowID) [0x0014a] in /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs:142
at UnityEngine.GUILayout+LayoutedWindow.DoWindow (System.Int32 windowID) [0x00070] in /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUILayout.cs:444
at UnityEngine.GUI.CallWindowDelegate (UnityEngine.GUI+WindowFunction func, System.Int32 id, System.Int32 instanceID, UnityEngine.GUISkin _skin, System.Int32 forceRect, System.Single width, System.Single height, UnityEngine.GUIStyle style) [0x00078] in /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUI.cs:1694

(Filename: /Volumes/保存倉庫/unity/PUNでクマちゃんを動かしてみた/Assets/Script/InRoomChat222.cs Line: 192)

ずらずらと記載させて頂き心苦しいですが。。。
エラーを確認すると【GetmyPlayerメソッド】は実行されているようですが、その後の各ログが検出されておらず、各変数が検出されないままSendChatメソッドが実行され、Debug.Logの【myPlayer(確認1)】が検出されている用です。
つまりGetmyPlayerメソッドは実際には実行されておらず、途中で止まっている状態のようにみえます。

###補足です
VisualStudioにてInRoomChat222を確認してましたらエラーではなく【warning】として以下画像の記載がありました。
スクリーンショット 2021-10-20 21-10-20 14.19.18.jpg

すこし見づらいかと思いますので、筆記させて頂くと
『フィールド"InRoomChat222.player”は割り当てられません。常に既定値nullを使用します』との記述があります。
私の知識ではこれが意味する所がイマイチわかりかねますが、少しでも情報をと思い補足として記載させて頂きます。

以上お手を煩わせてしまい申し訳ありませんが、何卒ご指導頂ければと思います。

0Like

色々とありがとうございます!
また色々と検証しましたので、こちらに記載させて頂きます。

###検証の為Debug.Logを各タイミングで追加しました。

DebugLogを追加したInRoomChat222の抜粋
void GetmyPlayer()
    {
        Debug.Log("GetmyPlayerメソッドが実行されているか確認1→OK!!");

        int myPlayerID = PhotonNetwork.player.ID;//自キャラのID取得
        Debug.Log("myPlayerIDが取得できているか確認→→→" + myPlayerID);

        players = GameObject.FindGameObjectsWithTag("Ava");
        Debug.Log("playersが取得できているか確認→→→" + players);

        foreach ( GameObject player in players)
        {
            Debug.Log("foreachに入ったか確認→→→OK!!");
            int playerLoopId = player.GetComponent<PhotonView>().owner.ID;
            Debug.Log("player.GetComponent<PhotonView>後のPlayer→→→" + player);
            Debug.Log("player.GetComponent<PhotonView>後のplayerLoopId→→→" + playerLoopId);
            Debug.Log("player.GetComponent<PhotonView>後のmyPlayerID→→→" + myPlayerID);

            if (playerLoopId == myPlayerID)
            {
                Debug.Log("playerLoopId == myPlayerID後のmyPlayerID=" + myPlayerID) ;

                myPlayer = player; //自プレイヤーオブジェクトを取得
                Debug.Log("playerLoopId == myPlayerID後のmyPlayer→→→" + myPlayer);
               
                myPM = myPlayer.GetComponent<PlayerManager>();
                //自キャラの頭上にチャット表示するためにPlayerManager取得
            }
            Debug.Log("foreachに入ろうが入るまいが確認1→→→GetmyPlayer済!!");
        }
        return;
           Debug.Log("foreachに入ろうが入るまいが確認2→→→GetmyPlayer済!!");
    }

DebugLogを追加した全文InRoomChat222
using System.Collections.Generic;
using UnityEngine;
using System.Collections;

[RequireComponent(typeof(PhotonView))]
//↑RequireComponentは「自動的にPhotonViewをアタッチしてね」の指示。

public class InRoomChat222 : Photon.MonoBehaviour
{
    #region 変数宣言

    //↓範囲チャット実装のためのオブジェクト、変数定義
    GameObject[] players = null;
    //ゲームオブジェクト型の配列「players」を定義。([]は配列の指示)。
    //つまりこの文は全てのプレイヤーキャラ取得用

    GameObject sender;//送信キャラ取得用
    GameObject myPlayer;//自分のキャラ取得用
    GameObject player;

    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()
    {
        Debug.Log("GetmyPlayer実行前のPlayer→→→" + player);

        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, 20);

        //「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()
    {
        Debug.Log("GetmyPlayerメソッドが実行されているか確認1→OK!!");

        int myPlayerID = PhotonNetwork.player.ID;//自キャラのID取得
        Debug.Log("myPlayerIDが取得できているか確認→→→" + myPlayerID);

        players = GameObject.FindGameObjectsWithTag("Ava");
        Debug.Log("playersが取得できているか確認→→→" + players);

        foreach ( GameObject player in players)
        {
            Debug.Log("foreachに入ったか確認→→→OK!!");
            int playerLoopId = player.GetComponent<PhotonView>().owner.ID;
            Debug.Log("player.GetComponent<PhotonView>後のPlayer→→→" + player);
            Debug.Log("player.GetComponent<PhotonView>後のplayerLoopId→→→" + playerLoopId);
            Debug.Log("player.GetComponent<PhotonView>後のmyPlayerID→→→" + myPlayerID);

            if (playerLoopId == myPlayerID)
            {
                Debug.Log("playerLoopId == myPlayerID後のmyPlayerID=" + myPlayerID) ;

                myPlayer = player; //自プレイヤーオブジェクトを取得
                Debug.Log("playerLoopId == myPlayerID後のmyPlayer→→→" + myPlayer);
               
                myPM = myPlayer.GetComponent<PlayerManager>();
                //自キャラの頭上にチャット表示するためにPlayerManager取得
            }
            Debug.Log("foreachに入ろうが入るまいが確認1→→→GetmyPlayer済!!");
        }
        return;
           Debug.Log("foreachに入ろうが入るまいが確認2→→→GetmyPlayer済!!");
    }
    #endregion

    #region チャット送信関数
    void SendChat(bool isAll)
    {
        Debug.Log(myPlayer + "myPlayer(確認1)");
        
        //chatRPC
        this.photonView.RPC( "Chat", PhotonTargets.All, myPlayer.transform.position, this.inputLine, isAll);
        //頭上にチャット表示するためにstring送信
        myPM.setChat(this.inputLine);

        Debug.Log(myPlayer + "myPlayer(確認2)");
       
        //送信後、入力欄を空にし、スクロール最下位置に移動
        this.inputLine = "";
        scrollPos.y = Mathf.Infinity;

        Debug.Log(myPlayer + "myPlayer(確認3)");

    }
    #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
}

結果としてUnity上では以下の画像の結果が得られました。
スクリーンショット 2021-10-21 21-10-21 13.44.37.jpg

やはりUnity上ではすべて動いています。

そしてビルド後のエラーこちらになります。(2枚の画像に分けて表示致します。)
スクリーンショット 2021-10-21 21-10-21 13.47.10.jpg
スクリーンショット 2021-10-21 21-10-21 13.47.26.jpg

やはりGetmyPlayer内のforeachに入っていません。。。。

またあまり意味がないかもしれませんが、デバッグをUnity上でも表示させました。
スクリーンショット 2021-10-21 21-10-21 13.46.31.jpg

あまり意味なかったですね。。当然ですがエラー表示と同じ内容となっております。。

エディタ上では問題なく動くのに、ビルド後にエラーとなる(参照が外れる)事例がネット上で見つからなくて困っています。。。お力をお貸し頂ければ。。

0Like

原因と関係あるか不明ですがプロジェクトパスとビルドパスにマルチバイト文字を含まないようにしてみてもらえますか

0Like

Comments

  1. @ichika_Uniuni

    Questioner

    ご指導本当にありがとうございます!!
    ご指摘の様にAppをマルチバイト文字を使わずに行ってみましたが、改善がみられません。。申し訳ございません。。
  2. @ichika_Uniuni

    Questioner

    解決しました!!ありがとうございました!

###Build SettingsとHierarchyの様子になります!
ご指導大変ありがとうございます!
※プロジェクト名をマルチバイト文字を使わない「bears」に変更しております。

◎buildSettingsの状態
スクリーンショット 2021-10-21 21-10-21 21.37.38.jpg

◎「Launcher」のヒエラルキーの状態
スクリーンショット 2021-10-21 21-10-21 21.48.34.jpg

◎「Home」のヒエラルキーの状態
スクリーンショット 2021-10-21 21-10-21 21.51.07.jpg

◎補足としてPlayer1の状態
※Playerに付けるTagは検証の為昨日「Player」から「Ava」に変更しております。スクリプトも同様に変更致しております。
スクリーンショット 2021-10-21 21-10-21 21.43.03.jpg

以上この様な状態となっております。
他にも必要な物がございましたら対応させて頂きますので宜しくお願い致します!

0Like

###まだ解決には至りませんがご報告です!

###考えた事
①これまでの挙動からTag"Player"が取得されていない
②そもそも他のTag名は取得できるのだろうか??
③他のTagが取得できるならTag"Player"はインスタンスされていいるオブジェクトなのでそこに問題があるのでは??

###試した事
① GetmyPlayer内のコード players = GameObject.FindGameObjectsWithTag("Player");を
    GameObject[] players = GameObject.FindGameObjectsWithTag("Player");に修正。
これは必要かどうかよくわかりませんが、ネット上にこの様にとの指示がありましたので。

②シーン上にTag"cube"を【3個】配置し、Tag"Player"と同じようにvoid GetmyPlayer()内にてFIndWithTagにて取得。

③Tag""cube"とTag"Player"の状態をそれぞれDebug.Logde出力

当該箇所コード
void GetmyPlayer()
    {
        int myPlayerID = PhotonNetwork.player.ID;//自キャラのID取得
        
        GameObject[] players = GameObject.FindGameObjectsWithTag("Player");

        GameObject[] cubes = GameObject.FindGameObjectsWithTag("cube");

        Debug.Log("playerの数は→→→"+players.Length);
        Debug.Log("cubeの数は→→→" + cubes.Length);
       
        foreach ( GameObject player in players)
        {
            int playerLoopId = player.GetComponent<PhotonView>().owner.ID;
            
            if (playerLoopId == myPlayerID)
            {
                myPlayer = player; //自プレイヤーオブジェクトを取得
                myPM = myPlayer.GetComponent<PlayerManager>();
                //自キャラの頭上にチャット表示するためにPlayerManager取得
            }
           
        }
        return;
※GameObject cubeはクラス内で宣言してあります。

上記の検証結果が以下画像です!
スクリーンショット 2021-10-22 21-10-22 12.59.08.jpg
Tag"cube"は問題なく検出されています。
※playerも検出されていますが元々Unityエディタ上では検出されていました。

④そしてこの状態で1度ビルドしエラーが発生することをあえて確認しました。

エラー確認

Unloading 8 unused Assets to reduce memory usage. Loaded Objects now: 812.
Total: 16.298633 ms (FindLiveObjects: 3.752840 ms CreateObjectMapping: 0.030360 ms MarkObjects: 12.443090 ms DeleteObjects: 0.070560 ms)

playerの数は→→→0
UnityEngine.StackTraceUtility:ExtractStackTrace () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs:37)
UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
UnityEngine.Logger:Log (UnityEngine.LogType,object)
UnityEngine.Debug:Log (object)
InRoomChat222:GetmyPlayer () (at /Volumes/保存倉庫/unity/bears/Assets/Script/InRoomChat222.cs:165)
InRoomChat222:Start () (at /Volumes/保存倉庫/unity/bears/Assets/Script/InRoomChat222.cs:44)

(Filename: /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs Line: 37)

cubeの数は→→→3
UnityEngine.StackTraceUtility:ExtractStackTrace () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs:37)
UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
UnityEngine.Logger:Log (UnityEngine.LogType,object)
UnityEngine.Debug:Log (object)
InRoomChat222:GetmyPlayer () (at /Volumes/保存倉庫/unity/bears/Assets/Script/InRoomChat222.cs:166)
InRoomChat222:Start () (at /Volumes/保存倉庫/unity/bears/Assets/Script/InRoomChat222.cs:44)

(Filename: /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs Line: 37)

myPlayer(確認1)
UnityEngine.StackTraceUtility:ExtractStackTrace () (at /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs:37)
UnityEngine.DebugLogHandler:LogFormat (UnityEngine.LogType,UnityEngine.Object,string,object[])
UnityEngine.Logger:Log (UnityEngine.LogType,object)
UnityEngine.Debug:Log (object)
InRoomChat222:SendChat (bool) (at /Volumes/保存倉庫/unity/bears/Assets/Script/InRoomChat222.cs:187)
InRoomChat222:ChatUIWindow (int) (at /Volumes/保存倉庫/unity/bears/Assets/Script/InRoomChat222.cs:142)
UnityEngine.GUILayout/LayoutedWindow:DoWindow (int) (at /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUILayout.cs:444)
UnityEngine.GUI:CallWindowDelegate (UnityEngine.GUI/WindowFunction,int,int,UnityEngine.GUISkin,int,single,single,UnityEngine.GUIStyle) (at /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUI.cs:1694)

(Filename: /Users/bokken/buildslave/unity/build/Runtime/Export/Scripting/StackTrace.cs Line: 37)

NullReferenceException: Object reference not set to an instance of an object
at InRoomChat222.SendChat (System.Boolean isAll) [0x00017] in /Volumes/保存倉庫/unity/bears/Assets/Script/InRoomChat222.cs:190
at InRoomChat222.ChatUIWindow (System.Int32 windowID) [0x0014a] in /Volumes/保存倉庫/unity/bears/Assets/Script/InRoomChat222.cs:142
at UnityEngine.GUILayout+LayoutedWindow.DoWindow (System.Int32 windowID) [0x00070] in /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUILayout.cs:444
at UnityEngine.GUI.CallWindowDelegate (UnityEngine.GUI+WindowFunction func, System.Int32 id, System.Int32 instanceID, UnityEngine.GUISkin _skin, System.Int32 forceRect, System.Single width, System.Single height, UnityEngine.GUIStyle style) [0x00078] in /Users/bokken/buildslave/unity/build/Modules/IMGUI/GUI.cs:1694

(Filename: /Volumes/保存倉庫/unity/bears/Assets/Script/InRoomChat222.cs Line: 190)

・想定どうりplayerは検出されず「0」、しかしcubeは検出され「3」となっています。
この事から検出されない理由は【インスタンスのタイミングでは??】との予測を立てました。
つまり playerが生成されるより先にGetmyPlayer関数が走ってしまっているのでは???

④現在Startメソッド内にある GetmyPlayer関数をUpdateにいれてみたらplayerが検出されるのでは???という検証を行いました。
その結果がこちらです!!!!
スクリーンショット 2021-10-22 21-10-22 13.19.15.jpg

エラーが出ることなく、思いどうりの挙動(チャットウィンドウとアバター頭上に同じ文字)となっています!!

###上記の検証から問題は【インスタンスのタイミング】であるかと思います。
ただGetmyPlayer関数をUpdateにいれてしまうと毎フレーム処理されてしまうので、Startよりちょっと遅くGetmyPlayerを走らせるにはどうすれば良いでしょうか?

以上ここまでお付き合い頂き大変ありがとうございます!!もうあと一歩な気がしますのでどうかお力をお貸し頂ければ!

0Like

###解決しました!!!!!!大変ありがとうございました!!!

上記投稿からインスタンス化のタイミングを調整する為にインスタンス化を担っているスクリプト"GameManagerScript"を下記の様にした所解決しました!

①インスタンスを担っている各項目をAwake内に設定
②"GameManagerScript"のStart内で【InRoomChat222スクリプト内にある「インスタンスしたplayerを取得する”GetmyPlayerメソッド”】を呼び出し実行。

この様な設定でGameManagerScriptにより、Awakeでプレイヤー生成→Startでそのプレイヤーの情報取得→その後各情報を伝達。
という流れが作れました!!

ご指導頂いた皆様大変ありがとうございました!
ご指摘頂いた内容は大変参考になり、また勉強になりました!ありがとうございます!!

0Like

Your answer might help someone💌