UnityとPhotonで対戦型ボードゲーム「犬猫将棋」を作成したい(9):駒を取る仕組み、所有権の移譲

犬猫将棋ソースコード、素材、遊べるリンクはこちら

駒を取る場合、駒からマウスを離した瞬間に同じマスにいる駒をDestroyしてあげて、同時に駒台の上に同じ駒をInstantiateしてあげるのが良さそうです。

 

ただし、Destroyするのは相手の駒なので所有権(Ownership)の移譲を行って自分の駒にしてからしかDestroyコマンドを使えません。

   

Photonにおいて、所有権の移譲については、色々調べたのですが、最終的には下記のウェブサイトとフォーラムを参考に書きました。

   

オーナーシップの移行デモ

Photon Networking: how to take over ownership?

まずは、同じマスにいる他の駒を判別して、それにアクセスする必要があります。

 

これにはtagを使用して他の駒を全部配列として取得した上で、for文を使用して、自分がクリックしている駒の座標とそれぞれ比べ、絶対値が一定値より少ない場合、その駒のIndexを取得し、所有権を移譲した上でDestroyするスクリプトを考えました。

   

 
        koma = GameObject.FindGameObjectsWithTag("koma");
            

        int i;
        for (i = 0; i < koma.Length; i++)
            {
            if (Mathf.Abs(koma[i].transform.position.x - xzahyou) <= 0.2f && Mathf.Abs(koma[i].transform.position.y - yzahyou) <= 0.2f && Mathf.Abs(koma[i].transform.position.x - xzahyou) != 0)
            {
                    //Debug.Log(koma[i].transform.position.x - xzahyou);
                    //Debug.Log(koma[i].transform.position.y - yzahyou);

                    koma[i].GetComponent<PhotonView>().TransferOwnership(PhotonNetwork.player.ID);
                    KomaModel komaModel = koma[i].GetComponent<KomaModel>();
                    int j = komaModel.cardIndex;

                int index = PhotonNetwork.player.ID - 1;
                PhotonNetwork.Destroy(koma[i]);
//続く

ここまでで所有権の移譲、駒種のcardIndexの取得、PhotonDestroyができました。

 

次に、犬陣営は犬が、猫陣営は猫が増えるように場合分けをしながら、スクリプトを書きました。それから、駒を取った時は犬側は「ワン」猫側は「ニャー」と鳴くようにします。

   

AudioSourceをインスペクター上でコンポーネントに追加して、audioClipをドラッグ&ドロップしてあげています。

   

//上の続き

if (PhotonNetwork.player.ID == 1)
                {
                    dog = GetComponent<AudioSource>();
                    dog.Play(0);//ワンと鳴く

                    Vector3 temp = new Vector3(4.3f, -1.5f, -1.0f);//(-3.1f, 1.5f, -1.0f)//犬陣営の駒台の位置
                    GameObject cardCopy = (GameObject)PhotonNetwork.Instantiate("uchikoma", temp, spawnPoints[index].rotation, 0);

                    KomaModel cardModel = cardCopy.GetComponent<KomaModel>();
                    cardModel.cardIndex = j;
                    cardModel.ToggleFace(1);
                }
                else
                {
                    cat= GetComponent<AudioSource>();
                    cat.Play(0);//ニャーと鳴く

                    Vector3 temp = new Vector3(-3.1f, 1.5f, -1.0f);//猫陣営の駒台の位置
                    GameObject cardCopy = (GameObject)PhotonNetwork.Instantiate("uchineko", temp, spawnPoints[index].rotation, 0);

                    KomaModel cardModel = cardCopy.GetComponent<KomaModel>();
                    cardModel.cardIndex = j;
                    cardModel.ToggleFace(1);
                }                                                                                         
            }
        }

ここでInstantiateする駒にはKomaModel.csにKomaNariField という整数値を与えて初手の駒とは区別します。

 

これによって打つ時に初手の駒は自陣のみ、取得した駒はどこでも打てるように場合分けを行います。

   

これで、駒を取得して打つことができるようになりました。

 

次はプレイヤー2にも対応させる必要があります。いよいよ大詰めですね。

   

 

もしよろしければ、Photonについて私が知りえる限りの情報を徹底的にまとめてみたので、下記の記事も読んで下さいね!

スポンサーリンク
おすすめの記事