UnityとPhotonで対戦型ボードゲーム「犬猫将棋」を作成したい(17):対戦相手のターンに自分の駒をロックする

               

前回の記事では、駒を動かすことをトリガーにターンを回すことに成功したわけですが、依然として相手のターンに無制限に駒を動かせるのであまりゲーム的にはうまくありません。

 

そこで、相手のターンには自分の駒をロックし、自分のターンには相手の駒をロックし動けなくすることが必要です。

   

これは結構単純に、マウスクリックを検知しているMouse.csを非アクティブ化してあげれば良いかなと考えていたのですが、意外とハマりました。

   

実は、OnAwake,OnCollision,OnTrigger系のイベント関数は非アクティブ状態でも呼ばれてしまうのです。よって、チェックボックスのオンオフにかかわらず、常に有効です。

 

詳しくは下のリンクを参照してください。

   

http://kimama-up.net/unity-script-non-active/

よって、GetComponent<Mouse>().enable=false;といった書き方ではOnTrigger系の機能を無効化するにあたっては意味がないということになります。

   

では、どうしたらよいか、というとDestroy(this);でコンポーネントをリムーブしてしまって、必要に応じて、AddComponent<Mouse>で戻してあげるというのが良さそうだということになります。

   

実際のスクリプトではtagで全部の駒を拾って自分がオーナーの駒だけGetComponentでMouse.csを取得してからDestroyをしてあげています。これは、自分のターンでない場合にのみ呼ばれるようにしてあります。

   

koma = GameObject.FindGameObjectsWithTag("koma");

     
            int i;
            for (i = 0; i < koma.Length; i++)
            {
                var newOwner = koma[i].GetComponent<PhotonView>().ownerId;//相手の駒のownerID

                if (PhotonNetwork.player.ID == newOwner)
                {
                    mouse = koma[i].GetComponent<Mouse>();
                    Destroy(mouse);


                    Debug.Log("mouse off");
                }
            }

   

そして、ターン終了時にMouse.csがついていない場合、再びつけてあげる必要があります。スクリプトにすると以下のようになります。

   

koma = GameObject.FindGameObjectsWithTag("koma");

int i;
        for (i = 0; i < koma.Length; i++)
        {
            var newOwner = koma[i].GetComponent<PhotonView>().ownerId;//相手の駒のownerID

            if (PhotonNetwork.player.ID == newOwner)
            {
                if(koma[i].GetComponent<Mouse>() == null)
                {
                    koma[i].AddComponent<Mouse>();
                }
              
               
                Debug.Log("mouse on");
            }
        }

   

スクリプトを付けたり外したりすると、インスペクター上にドラッグ&ドロップしていたものとかは外れてしまうので、Mouse.csに付けていたRotation判別のためのオブジェクトはスクリプトに置き換えました。

 

オブジェクトの向きの代わりに、Quaternion.Euler(180,180,0)、Quaternion.Identityを代入して、オブジェクトのドラッグ&ドロップは不要にしました。

   

それから、駒台の上で自分の駒を間違って取れてしまうというバグがあったのですが、それは自分の駒のownerIDと相手の駒のIDとが違う場合のみ発生することにして、バグを回避できました。

 

スクリプトとしては以下の部分になります。

   
koma = GameObject.FindGameObjectsWithTag("koma");

        var Owner = this.GetComponent<PhotonView>().ownerId; //自分の駒のownerID

        int i;
        for (i = 0; i < koma.Length; i++)
            {
            var newOwner = koma[i].GetComponent<PhotonView>().ownerId;//相手の駒のownerID

            if (Owner != newOwner && Mathf.Abs(koma[i].transform.position.x - xzahyou) <= 0.4f && Mathf.Abs(koma[i].transform.position.y - yzahyou) <= 0.4f && Mathf.Abs(koma[i].transform.position.x - xzahyou) != 0)
            {  //IF分の内容が続く。。。

   

最後に、現在新しい犬猫将棋のデザインを模索中です。また完成し次第素材としてアップロードしようと思います。

   

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

おすすめの記事