
犬猫将棋の駒の動きをガイドするロジックを、一番ベーシックな金将から考えていきたいと思います。まずは、駒台から盤面に置く場合は、自分の陣地にしか置けないので、マスの番号が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;
}
}
}
上段にいる場合の左端、右端の例外処理、中段にいる場合の、左端右端の例外処理、下段にいる場合の同様の処理。それぞれマニュアルで書き分けて、金の動きをガイドすることができました。もっと簡単に書けるのだと思いますが、私のスペックではこれくらいが限界です。
次回は飛車の動きを考えていきたいと思います。










