UnityとPhotonで対戦型ボードゲーム「犬猫将棋」を作成したい(11):マタタビ/ホネを加える

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

マタタビ/ホネ駒を今日は作ろうと思います。マタタビとホネを駒にしてPNGを作成し、Asset にドラッグ&ドロップ。そして、Spriteとして2つにスライスしました。

Mouse.cs,Rigidbody2D,Boxcollider2D,PhotonViewをインスペクター上でアタッチします。他の駒とほぼ同じ事をやる必要がありますね。ただし、マウスオーバーやダブルクリックは必要がないので、それ関係のスクリプトは省いてあります。

PlayerNetworkMover.csもアタッチして、PhotonViewで監視します。他の駒と全く一緒の処理です。この駒特有のスクリプトが必要なので、MatatabiModel.csというクラスを作りました。

マタタビモデルクラスには下記のように記載し、ToggleFaceによって表面と裏面、(マタタビ、ホネ)が表示されるようにしました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MatatabiModel : MonoBehaviour
{
    SpriteRenderer spriteRenderer;

    public Sprite matatabi;
    public Sprite hone;

    public void ToggleFace(bool showFace) 
    {

        if (showFace) // もし showface がtrueであれば、
        {
            spriteRenderer.sprite = matatabi;
        }
        else
        {
            spriteRenderer.sprite = hone;
        }

    }
        void Start()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();
    }
}

ここまでできたところでプレファブ化し、Resorceフォルダに格納しておきます。マタタビ・ルールによれば、まず、後手にホネが渡されるので、初手の状態でマタタビが手駒に加わるように、NetworkManager.csをいじりますが。。。

ここで気づいたのですが、CardIndexの値をMatatabiModel.csで定義していないので、null exceptional errorが出てしまうのですね。それに加え、PlayerNetworkMoverではDoubleClickの回数とCardIndexを渡したりしているので、結局コンポーネントは全部必要で、マタタビだけ別の処理にするのはかなり難易度が高いと判断しました。

よって、これまでの全部の作業を全部かなぐり捨てて、おとなしく、もうできている手駒と全く同じ構成でスプライトだけホネと入れ替えたホネ駒とマタタビに入れ替えたマタタビ駒を作成することにしました。

これで基本的には駒と全く同じ挙動をするはずなので、色々上手くいくと考えました。リソースフォルダには6種類の駒が入っているということになります。

NetworkManager.csにはホネ(hone)をInstantiateするためのスクリプトを追記します。

else
        {
            int index = 1;
            int cardCount = 0; //内部で使う値cardCountの宣言
            Vector3 temp2 = new Vector3(-6.61f, 3.18f, 0);

            
            foreach (int i in deck.GetCards())
            {

                    float co = cardOffset * cardCount; //オフセット幅の計算
                    Vector3 temp = startfirst + new Vector3(-3.1f -co, 2f,-1.0f);
                    GameObject cardCopy = (GameObject)PhotonNetwork.Instantiate("neko", temp, spawnPoints[index].rotation, 0);
                    
                    KomaModel cardModel = cardCopy.GetComponent<KomaModel>();
                    cardModel.cardIndex = i;//インデックスにiを代入
                    cardModel.ToggleFace(0);
                    
                    cardCount++; //cardCountをインクリメント

            }
//ここから追記
            Vector3 matatabi = new Vector3(-3.7f, 1f, -1.0f);
            GameObject matatabihone = (GameObject)PhotonNetwork.Instantiate("hone", matatabi, spawnPoints[index].rotation, 0);

            KomaModel matatabiModel = matatabihone.GetComponent<KomaModel>();
            matatabiModel.cardIndex = 5;
            matatabiModel.ToggleFace(0);
        } 

この時、matatabiModel.cardIndex = 5 とすることで、他の駒と区別がつくように工夫してあります。駒には6つホネのスプライトを入れてあります。あまりきれいではありませんが、この際動けばすべては良しとします。

マウスオーバーしてもダブルクリックされても大丈夫なように、すべての面にホネを入れました。ホネ面が常に出ていれば良しと割り切りました。

DirectionDeterminator.csにはマタタビ・ホネの場合にどこでも置けるという追記をしておきます。

else if ( Shu == 5)//マタタビホネの場合
        {
            int i;
            for (i = 1; i < 26; i++)
            {
                Masu[i].GetComponent().enabled = false;
                Masu[i].GetComponent().enabled = false;
            }
        }

それから、追記が必要なのは、マタタビ・ホネが取得された場合の処理ですね。Mouse.csを一部改変します。cardIndex = j としているのでjの値が5の時にマタタビもしくはホネをPlayerIDに合わせInstantiate するようにスクリプトを書きました。

void OnMouseUp()
    {
        xzahyou = transform.position.x;
        yzahyou = transform.position.y;
        KomaShu = komaModel.cardIndex;
        KomaNaru = komaModel.komaBackIndex;

        masuHandler.MasuCordinator(xzahyou, yzahyou, KomaShu, komaModel.naru, komaModel.komaNariField);

        m_ObjectCollider = GetComponent<BoxCollider2D>();
        m_ObjectCollider.isTrigger = true;

        directionDeterminator.ResetAll(masuHandler.masuNum);

        
        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;

                if(index > 1)
                {
                    index = 1;
                }

                PhotonNetwork.Destroy(koma[i]);
//ここから分岐処理を追記改変
                if (j < 5 && 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 if(j < 5 && PhotonNetwork.player.ID != 1)
                {
                    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);
                }
                else if(j == 5 && 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("matatabi", temp, spawnPoints[index].rotation, 0);

                    KomaModel cardModel = cardCopy.GetComponent<KomaModel>();
                    cardModel.cardIndex = j;
                    cardModel.ToggleFace(1);
                }
                else if (j == 5 && PhotonNetwork.player.ID != 1)
                {
                    cat = GetComponent<AudioSource>();
                    cat.Play(0);

                    Vector3 temp = new Vector3(-3.1f, 1.5f, -1.0f);
                    GameObject cardCopy = (GameObject)PhotonNetwork.Instantiate("hone", temp, spawnPoints[index].rotation, 0);

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

もちろん、マタタビの駒も作成しています。以下のようにスプライトには全部マタタビが入っています。

実際にはルール上ターンの関係でマタタビと骨の取り合いになることはなりませんが、挙動を調べるうえで取り合いをしてみました。上手く動いているのが分かります。これでマタタビとホネを実装することができました。

おすすめの記事