犬猫将棋の駒の動きをガイドするロジックを、一番ベーシックな金将から考えていきたいと思います。まずは、駒台から盤面に置く場合は、自分の陣地にしか置けないので、マスの番号が16~25の間にしか打てないようにします。
DirectionDeterminatorというオブジェクトを作り、DirectionDeterminator.csをアタッチします。そして、特定のboxcollider2dとMeshRendererをオフにするように記載します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class DirectionDeterminator : MonoBehaviour { MasuHandler masuHandler; MeshRenderer meshRenderer; public GameObject[] Masu; public int[] movableMasu; // Start is called before the first frame update void Start() { masuHandler = GameObject.Find("MasuHandler").GetComponent<MasuHandler>(); } public void DirectionDetermine(bool Naru, int Shu) { if (Naru == false && Shu == 0)//金の場合 { if (masuHandler.masuNum == 26 || masuHandler.masuNum == 0)//盤面外から駒を置く場合 { int i; for (i = 16; i < 26; i++) { Masu[i].GetComponent<BoxCollider2D>().enabled = false; Masu[i].GetComponent<MeshRenderer>().enabled = false; } }
マスを配列のGameObjectとして扱い、マスをインスペクター上にドラッグアンドドロップします。この時、マスの名前と番号が一致するように0番にダミーを入れています。このほうが後々わかりやすいと思いました。
さて、ここで金将の動きですが、金は自分のいるマス か
ら、 -4、-5、-6,-1、+1、+5の範囲に動くことができます。例外としては盤面の縁に来た場合がありますが、それ以外は一定です。
盤面の縁に来た場合は動けなくなる方向が制限されるので、それを場合分けでif文を使用して書き分けました。
if (Naru == false && Shu == 0)//金の場合 { if (masuHandler.masuNum == 26 || masuHandler.masuNum == 0) { int i; for (i = 16; i < 26; i++) { Masu[i].GetComponent<BoxCollider2D>().enabled = false; Masu[i].GetComponent<MeshRenderer>().enabled = false; } } else if (masuHandler.masuNum < 6)//上段の場合 { if (masuHandler.masuNum % 5 == 2 || masuHandler.masuNum % 5 == 3 || masuHandler.masuNum % 5 == 4)//真ん中にいるとき { Masu[masuHandler.masuNum + 1].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum + 1].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum - 1].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 1].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum + 5].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum + 5].GetComponent<MeshRenderer>().enabled = false; } else if (masuHandler.masuNum % 5 == 1) //左端にいるとき { Masu[masuHandler.masuNum + 1].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum + 1].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum + 5].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum + 5].GetComponent<MeshRenderer>().enabled = false; } else if (masuHandler.masuNum % 5 == 0 && masuHandler.masuNum != 0) //右端にいるとき { Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum - 1].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 1].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum + 5].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum + 5].GetComponent<MeshRenderer>().enabled = false; } } else if (masuHandler.masuNum > 20)//下段の場合 { if (masuHandler.masuNum % 5 == 2 || masuHandler.masuNum % 5 == 3 || masuHandler.masuNum % 5 == 4)//真ん中にいるとき { Masu[masuHandler.masuNum - 4].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 4].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum - 5].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 5].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum - 6].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 6].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum + 1].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum + 1].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum - 1].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 1].GetComponent<MeshRenderer>().enabled = false; } else if (masuHandler.masuNum % 5 == 1) //左端にいるとき { Masu[masuHandler.masuNum - 4].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 4].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum - 5].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 5].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum + 1].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum + 1].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false; } else if (masuHandler.masuNum % 5 == 0 && masuHandler.masuNum != 0) //右端にいるとき { Masu[masuHandler.masuNum - 5].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 5].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum - 6].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 6].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum - 1].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 1].GetComponent<MeshRenderer>().enabled = false; } } else//中段の場合 { if (masuHandler.masuNum % 5 == 2 || masuHandler.masuNum % 5 == 3 || masuHandler.masuNum % 5 == 4)//真ん中にいるとき { Masu[masuHandler.masuNum - 4].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 4].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum - 5].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 5].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum - 6].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 6].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum + 1].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum + 1].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum - 1].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 1].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum + 5].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum + 5].GetComponent<MeshRenderer>().enabled = false; } else if (masuHandler.masuNum % 5 == 1)//左端にいるとき { Masu[masuHandler.masuNum - 5].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 5].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum - 4].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 4].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum + 1].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum + 1].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum + 5].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum + 5].GetComponent<MeshRenderer>().enabled = false; } else if (masuHandler.masuNum % 5 == 0 && masuHandler.masuNum != 0)//右端にいるとき { Masu[masuHandler.masuNum - 6].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 6].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum - 5].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 5].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum - 1].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum - 1].GetComponent<MeshRenderer>().enabled = false; Masu[masuHandler.masuNum + 5].GetComponent<BoxCollider2D>().enabled = false; Masu[masuHandler.masuNum + 5].GetComponent<MeshRenderer>().enabled = false; } } }
上段にいる場合の左端、右端の例外処理、中段にいる場合の、左端右端の例外処理、下段にいる場合の同様の処理。それぞれマニュアルで書き分けて、金の動きをガイドすることができました。もっと簡単に書けるのだと思いますが、私のスペックではこれくらいが限界です。
次回は飛車の動きを考えていきたいと思います。