【第17日目】UnityとPUN2とC#で対戦相手と山札を別々に扱う

 

こんにちは、今日は対戦相手の山札と自分の山札をバラバラのデッキ構成にしたいと思います。

プレファブを2つ用意して、別々の配列を与えてあげる事にしようと思います。

それでは、まずはプレファブをコピーするところから始めたいと思います。

UnityとPUN2とC#で山札を2つ用意して別々にインスタンス化する

PhotonのResourceフォルダに格納されているLibraryプレファブを一度インスタンス化して、もう一度フォルダに戻し、名前をLibrary1、Library2とします。

これで、くっついているスクリプトは共有されていますが、プレファブ自体はバラバラなので別々の値を格納することはできそうです。

山札のインスタンス化スクリプトの書き換え

プレファブの名前を変えたので、もちろん、呼び出すときの名前も変えます。

NewCameraCollision.csとNewCameraCollision2.csの”Library”を両方とも”Library1”と”Library2”に書き換えます。

GameObject library = (GameObject)PhotonNetwork.Instantiate("Library1", libraryPosition.position, libraryPosition.rotation, 0);

NewCameraCollision.csの変更した一文です。

山札のカスタムプロパティの名前変更

ここで、山札1と山札2のデータを別々に扱いたいので、接頭にAとBと別々に付けることで場合分けしました。

オブジェクト名が"Library1(Clone)"の場合、A数字とデータが書き出され、オブジェクト名が"Library2(Clone)"の時、B数字とデータを書き出します。

 

そして、OnRoomPropertiesUpdate時に一番目の文字がAの場合はLibrary1の配列を書き換え、Bの場合はLibrary2の配列を書き換える事にします。

文字列の一部を抜き出すスクリプトはこのサイトを参考に書きました。

 

それから、for文が一回目に回る場合には、配列の初期化を行うようにしています。

以下に、CardDraw.csの変更部分を参考までに貼っておきます。

 

void SendLibraryData()
{
    if (name == "Library1(Clone)")
    {
        var hashtable = new ExitGames.Client.Photon.Hashtable();

        for (int i = 0; i < library.Length; i++)
        {
            hashtable["A" + i] = library[i];
        }

        PhotonNetwork.CurrentRoom.SetCustomProperties(hashtable);
    }
    else if(name == "Library2(Clone)")
    {
        var hashtable = new ExitGames.Client.Photon.Hashtable();

        for (int i = 0; i < library.Length; i++)
        {
            hashtable["B" + i] = library[i];
        }

        PhotonNetwork.CurrentRoom.SetCustomProperties(hashtable);
    }
    else
    {
        Debug.Log("errorLibrary");
    }
   
}

public override void OnRoomPropertiesUpdate(ExitGames.Client.Photon.Hashtable propertiesThatChanged)
{    
    if (name == "Library1(Clone)")
    {        
        int i = 0;

        foreach (var prop in propertiesThatChanged)
        {
            string key = (string)prop.Key;

            if (key.Substring(0, 1) == "A")
            {
                if (i == 0)
                {
                    library = new int[0];
                }

                List<int> list = new List<int>(library);
                list.Add((int)prop.Value);
                library = list.ToArray();

                i++;
            }
        }
    }else if(name == "Library2(Clone)")
    {
        int i = 0;

        foreach (var prop in propertiesThatChanged)
        {
            string key = (string)prop.Key;

            if (key.Substring(0, 1) == "B")
            {
                if (i == 0)
                {
                    library = new int[0];
                }

                List<int> list = new List<int>(library);
                list.Add((int)prop.Value);
                library = list.ToArray();

                i++;
            }
        }
    }
    else
    {
        Debug.Log("errorCustomProperty");
    }

        if (library.Length == 0)
    {
        Destroy(gameObject);
    }
    else
    {
        GameObject libraryMesh = GameObject.Find("card");
        libraryMesh.transform.localScale = new Vector3(1, library.Length, 1);

        libraryNum.text = System.Convert.ToString(library.Length);
    }

}

おわりに

今回は山札を2つ別々に処理を行うようにスクリプトをかき分け、プレファブも2つ用意しました。

これによってデッキの調整や、山札の同期ができるようになりました。

次回は、カードの能力を使って、山札を削るというのを行おうと思います。

それでは、また!

 

おすすめの記事