質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

【Unity】Photonの処理でif文の条件があっているはずなのに、実行されずに困っています

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,084

score 39

前提・実現したいこと

これはPhotonでマルチプレイヤーゲームを作るためのコードです。
カメラをプレイヤーオブジェクトに追従させるための処理で問題が発生しています。

下記コードのforeach文内のif文が実行されません。
Debug.Logで確認しましたが、if文の条件になっている2つの変数はどちらも同じ数字でした。
変数が同じ数字なのにも関わらず、if文が実行されずに困っています。

if文が実行されない原因は、このスクリプトにありますか?
それとも、この質問に載せたコードを見る限りでは特に問題はなく、他のスクリプトなどに原因がある可能性が高いですか?

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

こちらが、いま問題が起きているコードです。

        void Awake()
        {
            if (!photonView.IsMine) return;
            Debug.Log("UnkomanCameraControl:Awake");
            StartCoroutine(GetTarget(0.5f));
        }

        //一定時間立ってからtargetを取得
        private IEnumerator GetTarget(float i_time)
        {                        
            yield return new WaitForSeconds(i_time);

            foreach (GameObject Unkoman in GameObject.FindGameObjectsWithTag("Player"))
            {
                object CameraActorNumber = photonView.InstantiationData[0];
                object UnkomanActorNumber = Unkoman.GetComponent<UnkomanControl>().unkomanActorNumber;

                Debug.Log(CameraActorNumber);
                Debug.Log(UnkomanActorNumber);

                if (CameraActorNumber == UnkomanActorNumber)
                {
                    Debug.Log("めい怖くないもん!!");
                    target = Unkoman;
                }
            }
            Debug.Log(target);
        }


こちらが、いま問題になっているコードを含めた、スクリプトの全文です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;

namespace CSharpScript
{
    // [ExecuteInEditMode, DisallowMultipleComponent]
    public class UnkomanCameraControl : MonoBehaviourPunCallbacks
    {
        private GameObject target;        
        public Vector3 offset;

        [SerializeField] private float distance = 4.0f;
        [SerializeField] private float polarAngle = 87.0f;
        [SerializeField] private float azimuthalAngle = 270f;

        [SerializeField] private float minPolarAngle = 2.0f;
        [SerializeField] private float maxPolarAngle = 130.0f;
        [SerializeField] private float mouseXSensitivity = 5.0f;
        [SerializeField] private float mouseYSensitivity = 5.0f;

        void Awake()
        {
            if (!photonView.IsMine) return;
            Debug.Log("UnkomanCameraControl:Awake");
            StartCoroutine(GetTarget(0.5f));
        }

        //一定時間立ってからtargetを取得
        private IEnumerator GetTarget(float i_time)
        {                        
            yield return new WaitForSeconds(i_time);

            foreach (GameObject Unkoman in GameObject.FindGameObjectsWithTag("Player"))
            {
                object CameraActorNumber = photonView.InstantiationData[0];
                object UnkomanActorNumber = Unkoman.GetComponent<UnkomanControl>().unkomanActorNumber;

                Debug.Log(CameraActorNumber);
                Debug.Log(UnkomanActorNumber);

                if (CameraActorNumber == UnkomanActorNumber)
                {
                    Debug.Log("めい怖くないもん!!");
                    target = Unkoman;
                }
            }
            Debug.Log(target);
        }

        void LateUpdate()
        {
            if (!photonView.IsMine || target == null) return;

            if (photonView.IsMine) Debug.Log(target);
            updateAngle(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
            var lookAtPos = target.transform.position + offset;
            updatePosition(lookAtPos);
            transform.LookAt(lookAtPos);

            /*
            //カーソル表示・非表示&ロック・アンロック
            if (Input.GetKeyUp(KeyCode.Escape))
            {
                Cursor.visible = true;
                Cursor.lockState = CursorLockMode.None;
            }
            if(Input.GetMouseButtonDown(0))
            {
                Cursor.visible = false;
                Cursor.lockState = CursorLockMode.Locked;
            }
            */
        }

        void updateAngle(float x, float y)
        {
            if (!photonView.IsMine || target == null) return;
            x = azimuthalAngle - x * mouseXSensitivity;
            azimuthalAngle = Mathf.Repeat(x, 360);

            y = polarAngle + y * mouseYSensitivity;
            polarAngle = Mathf.Clamp(y, minPolarAngle, maxPolarAngle);
        }


        void updatePosition(Vector3 lookAtPos)
        {
            if (!photonView.IsMine || target == null) return;
            var da = azimuthalAngle * Mathf.Deg2Rad;
            var dp = polarAngle * Mathf.Deg2Rad;
            transform.position = new Vector3
                (
                 lookAtPos.x + distance * Mathf.Sin(dp) * Mathf.Cos(da),
                 lookAtPos.y + distance * Mathf.Cos(dp),
                 lookAtPos.z + distance * Mathf.Sin(dp) * Mathf.Sin(da)
                );

        }
    }
}

試したこと

ブレークポイントで止めて変数の中身を確認しましたが、どちらの変数も同じ数字でした。
イメージ説明

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • YAmaGNZ

    2020/08/20 10:09

    どちらもobjectで宣言していますが、実際に双方は同じ型で==で比較できるものなのでしょうか?

    キャンセル

  • kosho206

    2020/08/20 10:35

    その点が僕も全然わかっていなくて、ActorNumberを取得するのに、「photonView.InstantiationData」を使ってObject型で取得するのか、「PhotonNetwork.LocalPlayer.ActorNumber」と書いてint型で取得するのかでごちゃごちゃになっててよくわからない状態です。
    一応どちらも試したのですがうまくいきませんでした。

    キャンセル

  • キャンセル

回答 1

checkベストアンサー

0

私はUnity、Photonに関してはほぼ分からないのでコメントにありました

「photonView.InstantiationData」を使ってObject型で取得するのか、「PhotonNetwork.LocalPlayer.ActorNumber」と書いてint型で取得するのか

といった、どこから情報を取得してくるのが正しいのかに関しての回答ではなくC#の観点からの回答となります。

object型の==演算子での比較ですと参照型の比較となり、インスタンスが同じものかどうかの比較となります。
なので、提示されている

object CameraActorNumber = photonView.InstantiationData[0];
object UnkomanActorNumber = Unkoman.GetComponent<UnkomanControl>().unkomanActorNumber;


こちらですと、値が同じだったとしてもインスタンスが異なりますので==演算子では異なるものとなります。

等価比較 (C# プログラミング ガイド)
2つの値が等しいか調べる、等値演算子(==)とEqualsメソッドの違い
など参照型の比較について調査されるとよろしいかと思います。
要は、比較する物が値型なのか参照型なのか、インスタンスを比較したいのか、値を比較したいのか明確にして適切な比較方法を選択してくださいということです。

今回比較されるものが結局のところint等の値型なのであれば、object型に格納するのではなく、キャストしてint等の正しい型にすべきだと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/20 16:39

    キャストを使うと問題なくif文内のコードが実行されるようになりました。
    今までキャストについて何も知りませんでした
    ありがとうございます!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • C#に関する質問
  • 【Unity】Photonの処理でif文の条件があっているはずなのに、実行されずに困っています