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

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

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

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

Unity

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

Q&A

1回答

4567閲覧

PhotonNetwork.Instatiateで生成したオブジェクトを相手画面で消したい。

MasakiMarugame

総合スコア6

C#

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

Unity

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

0グッド

0クリップ

投稿2017/11/01 07:28

編集2022/01/12 10:55

###前提・実現したいこと

 UnityとPhotonを用いて通信対戦型のテトリスを作成しています。
ブロックの移動・回転を同期することはできましたが、一列揃った時自分の画面ではブロックが一列消えても相手画面では消えない状態です。
どのようにして相手画面のブロックを消せばよいでしょうか。 イメージ説明

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

なし

###該当のソースコード

C#

1public class Grid1: Photon.PunBehaviour 2{ 3 4 public static int w = 10; 5 public static int h = 20; 6 public static Transform[,] grid = new Transform[w, h]; 7 8 9 public static Vector2 roundVec2(Vector2 v) 10 { 11 return new Vector2(Mathf.Round(v.x), Mathf.Round(v.y)); 12 } 13 14 public static bool insideBorder(Vector2 pos) 15 { 16 return ((int)pos.x >= 0 && 17 (int)pos.x < w && 18 (int)pos.y >= 0); 19 } 20 21 public static void deletRow(int y) 22 { 23 for (int x = 0; x < w; ++x) 24 { 25 PhotonNetwork.Destroy(grid[x, y].gameObject); 26 27 grid[x, y] = null; 28 } 29 } 30 31 public static void decreaseRow(int y) 32 { 33 for (int x = 0; x < w; ++x) 34 { 35 if (grid[x, y] != null) 36 { 37 grid[x, y - 1] = grid[x, y]; 38 grid[x, y] = null; 39 40 grid[x, y - 1].position += new Vector3(0, -1, 0); 41 } 42 } 43 } 44 45 public static void decreaseRowAbove(int y) 46 { 47 for (int i = y; i < h; ++i) 48 decreaseRow(i); 49 } 50 51 public static bool isRowFull(int y) 52 { 53 for (int x = 0; x < w; ++x) 54 if (grid[x, y] == null) 55 return false; 56 return true; 57 } 58 59 public static void deleteFullRoes() 60 { 61 for (int y = 0; y < h; ++y) 62 { 63 if (isRowFull(y)) 64 { 65 deletRow(y); 66 decreaseRowAbove(y + 1); 67 --y; 68 } 69 } 70 }

###試したこと

DeleteRow()内でオブジェクトを削除する処理の前にPhotonNetworkを付けてみましたが、相手側の画面でオブジェクトが削除されません。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答1

0

Photonには詳しくないため、それに依存する部分については分かりませんが…

C#

1// Use this for initialization 2void Start() 3{ 4 if (!isValidGridPos()) 5 { 6 Debug.Log("Game Over"); 7 PhotonNetwork.Destroy(gameObject); 8 AudioSource.Stop (); 9 } 10}

上記のソースコードではDebug.Log("Game Over");で「Game Over」と表示した直後に、PhotonNetwork.Destroy(gameObject);で消すという流れになっておりますが、これは意図的なものでしょうか?

また、今回の場合、おそらくブロックがそろったときにPhotonNetwork.Destroy()することになると思いますが、それを処理するような箇所についてのソースが記載されていないです。
自分の方だけ消えるということは、Object.Destroy()が使われていると思いますので、その箇所を見つけて変更すればよいと思います。


また、ソースコードを記載する際には、「```」×2の中に記載すると、読みやすくなります。

投稿2017/11/02 01:16

fiveHundred

総合スコア9739

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

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

MasakiMarugame

2017/11/02 03:13

ご回答ありがとうございました。 おっしゃる通りゲームオーバー時のコードを記載してしまっていたので、一行削除するコードの方に変更致しました。 現在、こちらでも相手側で削除されていません。
fiveHundred

2017/11/02 04:33

コード拝見いたしました。 編集前のソースコードも含めて考えると、「PhotonNetwork.Instantiate()」ではグループのゲームオブジェクトを生成しているのに対し、「PhotonNetwork.Destroy()」ではブロックのゲームオブジェクトを消去しようとしてるのでうまくいかないのではないかと思います。 私の思いつきですが、以下のようにすれば上手くいくかもしれません。 (もっといい方法があるかもしれません) 1. グループのゲームオブジェクトを生成 2. グループが配置されたら、グループのゲームオブジェクトを削除し、該当する箇所にブロックのゲームオブジェクトを生成する 3. ブロックが揃っているかチェックし、もし揃っていたらブロックのゲームオブジェクトを削除する
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問