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

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

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

 

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

   

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

   

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

(現在リンク先サイトが閉鎖中です。お困りの方はグーグルのキャッシュにサイトが残っているのでそちらを参照ください。”オーナーシップの移行デモ Photon Engine”で検索してみてください。)

 

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について私が知りえる限りの情報を徹底的にまとめてみたので、下記の記事も読んで下さいね!

おすすめの記事