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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Photon Server

Photon Serverは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つで、サーバにインストールして使うサーバアプリケーションです。全てカスタマイズが可能で権限管理もできます。

C#

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

Unity3D

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

PunRPCでVector3の値が送信されない

M4SH1R000
M4SH1R000

総合スコア5

Photon Server

Photon Serverは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つで、サーバにインストールして使うサーバアプリケーションです。全てカスタマイズが可能で権限管理もできます。

C#

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

Unity3D

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

1回答

0評価

0クリップ

440閲覧

投稿2021/02/18 03:57

編集2021/02/19 10:24

前提・実現したいこと

Pun2の[PunRPC]で、
ローカル→オンライン上の相手
に Vector3 の値を送信したい

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

以下に記述するスクリプトでのみ、送信したVector3のみ値が(0,0,0)となってしまう。

該当のソースコード

  • 以下のソースコードの中の、forceVという値について、ローカル上で別のプレイヤーに与えたときは値が反映された状態で作用するのですが、オンライン上の相手プレイヤーには作用しません((0,0,0)になる)。
  • ↓スクリプト内の該当部分

C#

//相手を吹っ飛ばす hit.setForce (forward, up, forceV);
  • 下記がソースコードの該当部分を抜粋したものです。
  • この中で、forceV以外の引数(float値)は正しく送信されます。

↓該当の値↓
//相手を吹っ飛ばす
hit.setForce (forward, up, forceV);
//相手にダメージ
hit.setDamage (damage, impactDamage, standDamage, knockBackTime, isAttackCollider);

C#

//RPC実行 void start_doGrabEnd () { if (Mathf.Abs (Loc.h) + Mathf.Abs (Loc.v) > 0 && start_doGrabEndFlag == true) { start_doGrabEndFlag = false; photonView.RPC (nameof (doGrabEnd), RpcTarget.AllViaServer); photonView.RPC (nameof (start_doSwing), RpcTarget.AllViaServer); } } //投げる処理 [PunRPC] void start_doSwing () { StartCoroutine ("start_doGrabEndCor"); } //吹っ飛ばし用のベクトル public Vector3 forceV; IEnumerator start_doGrabEndCor () { Loc.canRotate = true; Loc.directionForward (); forceV = directionForward (); float grabEndCorTime = 0.1f; while (grabEndCorTime > 0) { grabbing = true; Loc.directionForward (); grabEndCorTime -= Time.deltaTime; forceV = directionForward (); yield return null; } grabbing = false; /*以下のforceVが送信されない*/ //相手を吹っ飛ばす hit.setForce (forward, up, forceV); //相手にダメージ hit.setDamage (damage, impactDamage, standDamage, knockBackTime, isAttackCollider); playAnim.grabBoolCheck (); for (int i = 0; i < 10; i++) { yield return null; } //誰を掴んだかを初期化(真空投げ対策) NPC = null; freezeReset (5); } private Vector3 directionForward () { float h = Loc.h; float v = Loc.v; Vector3 cameraForward = Vector3.Scale (Camera.main.transform.forward, new Vector3 (1, 0, 1)).normalized; Vector3 moveForward = cameraForward * v + Camera.main.transform.right * h; return moveForward; }
  • 上記のソースコードが、相手プレイヤー側で以下のスクリプトによって処理されます。

C#

//吹っ飛び率 public void setForce (float forwardP, float upP, Vector3 forceV) { forward = forwardP;//反映される up = upP;//反映される force = new Vector3 (forceV.x, 0, forceV.z);//オンライン上の相手プレイヤーにのみ反映されない }

試したこと

  • 上記とほぼ同じ処理の別スクリプトにおいては、forceVの値が相手プレイヤーに正しく送信されます。

C#

//値を送信するメソッド(ローカル側) void OnTriggerEnter (Collider col) { if (col.gameObject.tag == "HitColision") { var forceV = (col.transform.root.gameObject.transform.position - PC.transform.position).normalized; //col → hitColision → 吹っ飛び関数 に行く hitCol = col.transform.gameObject.GetComponent<hitColisionManager> (); NPC = col.transform.root.gameObject;        /*↓このスクリプトの場合は、forceVが正しく送信される*/ hitCol.setForce (forward, up, forceV); hitCol.setDamage (damage, impactDamage, standDamage, knockBackTime, isAttackCollider); } else if (col.gameObject.tag == "Shield") { var forceV = (col.transform.root.gameObject.transform.position - PC.transform.position).normalized; col.transform.root.gameObject.transform.Find ("HitColision").GetComponent<hitColisionManager> ().setForce (forward / 3, up / 3, forceV); C_guard = col.transform.gameObject.GetComponent<guard> (); C_guard.guardTough -= guardDamage; C_guard.guardDamageTime = 1f; } }

C#

  //吹っ飛ばされる側(オンライン上の相手側で以下を処理する) //吹っ飛び率 public void setForce (float forwardP, float upP, Vector3 forceV) { forward = forwardP;//反映される up = upP;//反映される force = new Vector3 (forceV.x, 0, forceV.z);//反映される }
  • forceV の値を、上記の正しく処理されるもの

var forceV = (col.transform.root.gameObject.transform.position - PC.transform.position).normalized;
にしても結果は同じでした。

  • スクリプト外から Vector3 を定義するのではなく、スクリプト内から

var forceV = directionForward();
としても結果は同じでした。
(ローカル上ではどちらも反映されます)

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

Unity … Unity2019.4.12f
API … .NET 4.x

ご質問等にはできる限り回答しようと思います。
よろしくお願いいたします。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Photon Server

Photon Serverは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つで、サーバにインストールして使うサーバアプリケーションです。全てカスタマイズが可能で権限管理もできます。

C#

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

Unity3D

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。