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

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

ただいまの
回答率

89.97%

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

受付中

回答 1

投稿 編集

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

前提・実現したいこと

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

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

なし

該当のソースコード

public class Grid1: Photon.PunBehaviour
{

    public static int w = 10;
    public static int h = 20;
    public static Transform[,] grid = new Transform[w, h];


    public static Vector2 roundVec2(Vector2 v)
    {
        return new Vector2(Mathf.Round(v.x), Mathf.Round(v.y));
    }

    public static bool insideBorder(Vector2 pos)
    {
        return ((int)pos.x >= 0 &&
            (int)pos.x < w &&
            (int)pos.y >= 0);
    }

    public static void deletRow(int y)
    {
        for (int x = 0; x < w; ++x)
        {
        PhotonNetwork.Destroy(grid[x, y].gameObject);

            grid[x, y] = null;
        }
    }

    public static void decreaseRow(int y)
    {
        for (int x = 0; x < w; ++x)
        {
            if (grid[x, y] != null)
            {
                grid[x, y - 1] = grid[x, y];
                grid[x, y] = null;

                grid[x, y - 1].position += new Vector3(0, -1, 0);
            }
        }
    }

    public static void decreaseRowAbove(int y)
    {
        for (int i = y; i < h; ++i)
            decreaseRow(i);
    }

    public static bool isRowFull(int y)
    {
        for (int x = 0; x < w; ++x)
            if (grid[x, y] == null)
                return false;
        return true;
    }

    public static void deleteFullRoes()
    {
        for (int y = 0; y < h; ++y)
        {
            if (isRowFull(y))
            {
                deletRow(y);
                decreaseRowAbove(y + 1);
                --y;
            }
        }
    }

試したこと

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

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

より詳細な情報

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

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

// Use this for initialization
void Start()
{
    if (!isValidGridPos())
    {
        Debug.Log("Game Over");
        PhotonNetwork.Destroy(gameObject);
        AudioSource.Stop ();
    }
}


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

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


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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/02 12:13

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

    キャンセル

  • 2017/11/02 13:33

    コード拝見いたしました。

    編集前のソースコードも含めて考えると、「PhotonNetwork.Instantiate()」ではグループのゲームオブジェクトを生成しているのに対し、「PhotonNetwork.Destroy()」ではブロックのゲームオブジェクトを消去しようとしてるのでうまくいかないのではないかと思います。

    私の思いつきですが、以下のようにすれば上手くいくかもしれません。
    (もっといい方法があるかもしれません)
    1. グループのゲームオブジェクトを生成
    2. グループが配置されたら、グループのゲームオブジェクトを削除し、該当する箇所にブロックのゲームオブジェクトを生成する
    3. ブロックが揃っているかチェックし、もし揃っていたらブロックのゲームオブジェクトを削除する

    キャンセル

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

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