チェス作成してみた スクリプト公開

・作成動画


・スクリプト説明

int[][,] boardSurface = new int[2][,]
   {
       new int [,]
       {
           { 2, 1, 0, 0, 0, 0, 0, 0 },
           { 3, 1, 0, 0, 0, 0, 0, 0 },
           { 4, 1, 0, 0, 0, 0, 0, 0 },
           { 5, 1, 0, 0, 0, 0, 0, 0 },
           { 6, 1, 0, 0, 0, 0, 0, 0 },
           { 4, 1, 0, 0, 0, 0, 0, 0 },
           { 3, 1, 0, 0, 0, 0, 0, 0 },
           { 2, 1, 0, 0, 0, 0, 0, 0 }
       },
       new int [,]
       {
           { 0, 0, 0, 0, 0, 0, 1, 2 },
           { 0, 0, 0, 0, 0, 0, 1, 3 },
           { 0, 0, 0, 0, 0, 0, 1, 4 },
           { 0, 0, 0, 0, 0, 0, 1, 5 },
           { 0, 0, 0, 0, 0, 0, 1, 6 },
           { 0, 0, 0, 0, 0, 0, 1, 4 },
           { 0, 0, 0, 0, 0, 0, 1, 3 },
           { 0, 0, 0, 0, 0, 0, 1, 2 }
       }
   };

駒の置いている位置は二次元配列で管理していて
それをジャグ配列にすることで自分と敵の配列を管理しやすいようにしています

if(Physics.Raycast(ray, out hit, 100.0f, 1 << 6))
{
    OnClick(hit.transform);
}

レイキャストですが「1 << 6」で6番目のレイヤーから判定をとれるようにしていますが後々レイヤー名を指定するようにしたいと思います

    void PieceCheck(int originWidth, int originHeight, int widthVelo = 0, int heightVelo = 0, int moveNum = 1, bool isKing = false)
   {
       for(int i = 1; i <= moveNum; i++)
       {
           int width = originWidth + (i * widthVelo);
           int height = originHeight + (i * heightVelo);
           Debug.Log(width + ":" + height);
           GameObject piece = _turn == Turn.Player ? SearchEnemyPiece(width, height, _piecesEnemy) : SearchEnemyPiece(width, height, _piecesPlayer);
           // 配列外を参照しないように
           if (width < 0 || width > 7 || height < 0 || height > 7)
           {
               return;
           }
           
           // 自駒だった場合
           if (boardSurface[(int)_turn][width, height] != 0 && boardSurface[(int)_turn][width, height] < (int)PieceID.MoveArea)
           {
               if (isKing)
               {
                   boardSurface[(int)_turn][width, height] += (int)PieceID.MoveArea;
                   _areaBoard.Add(boards[width, height]);
               }
               
               return;
           }
           // 敵駒があった場合(ポーン以外)
           else if(piece != null && _chooseID != PieceID.Pawn)
           {
               boardSurface[(int)_turn][width, height] = (int)PieceID.MoveArea;
               _areaBoard.Add(boards[width, height]);
               _takePiece.Add(piece);
               return;
           }
           // 何も置かれてない場合
           else if(boardSurface[(int)_turn][width, height] == 0 && piece == null)
           {
               //boards[width, height].GetComponent<MeshRenderer>().material = boardMaterial[2];
               boardSurface[(int)_turn][width, height] = (int)PieceID.MoveArea;
               _areaBoard.Add(boards[width, height]);
           }
           else if(boardSurface[(int)_turn][width, height] > (int)PieceID.MoveArea)
           {
               return;
           }
           else
           {
               // 例外
               Debug.LogError(boardSurface[(int)_turn][width, height].ToString());
           }
       }
   }

基本的にこの関数で配列をfor文でまわし各駒の移動場所を検索しています

ポーンの斜め移動とナイトは上記の関数を使用せずに個別で書いてます
個人的に妥協してしまった点なのでもう少しいい方法がないか考えないといけないところですね

・まとめ

これで基本的な動きはできたのでよかったです
ですがまだまだバグがあったりオブジェクトもCubeを使用しただけなので次回以降はこのあたりをやっていけたらと思います
完成までやりきりたい!!

この記事が気に入ったらサポートをしてみませんか?