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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2973閲覧

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

kosho206

総合スコア41

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/08/08 08:07

編集2020/08/20 01:11

前提・実現したいこと

これは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/ツールのバージョンなど)

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2020/08/20 01:09

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

2020/08/20 01:35

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

回答1

0

ベストアンサー

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

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

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

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

C#

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

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

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

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

投稿2020/08/20 02:20

YAmaGNZ

総合スコア10489

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kosho206

2020/08/20 07:39

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問