Programming/Unity C#

[Unity2D] 체스 개발 일지 - 0

LittleDev0617 2021. 2. 17. 01:42

형이 요즘 체스에 맛들렸는데 형보고 전공 공부도 할겸 유니티로 체스를 만들어보라 했다.

근데 형을 도우면서 나도 같이 구상을 하게 됐는데, 그냥 나도 심심하던 참이었기에 체스를 만들어보게 됐다.

 

그동안은 게임을 만드느라 스프라이트를 구하는데 애썼는데, 체스는 기물 스프라이트들만 있으면 됐기에 걱정될 부분이 없다.

 

오늘은 체스 판을 초기화하고 기초 공사(?) 느낌의 기능들을 구현했다.

 

오늘 결과

보시다시피 화면의 오른쪽 여백은 각종 UI를 배치하면 될 것 같다.

체스 판과 기물들은 Canvas 에서 UI로 만든다.

체스판의 왼쪽 위에서부터 가로로 한줄씩 아래로 8줄, 즉 2차원 배열형태로 체스판을 구현했다.

Cell Prefab 상태. 자식으로 기물 이미지를 담고있다.

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

public class BoardManager : MonoBehaviour
{
    public GameObject Cell;
    private Sprite[] Sprites;
    enum Pieces
    {
        Queen_W,King_W,Bishop_W,Knight_W,Rook_W,Pawn_W,
        Queen_B, King_B, Bishop_B, Knight_B, Rook_B, Pawn_B,
        None
    }

    Pieces[,] wBoard;
    void DrawBoard()
    {
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                int index = (int)wBoard[i, j];
                int alpha;

                Transform target = GameObject.Find($"{i},{j}").transform.GetChild(0);

                if (index != (int)Pieces.None)
                {
                    target.GetComponent<Image>().sprite = Sprites[index];
                    alpha = 255;
                }
                else
                    alpha = 0;
                target.GetComponent<Image>().color = new Color(255, 255, 255, alpha);
                target.GetComponent<Image>().preserveAspect = true;
            }
        }
    }

    void InitBoard()
    {
        wBoard = new Pieces[,] {
            { Pieces.Rook_W, Pieces.Knight_W, Pieces.Bishop_W, Pieces.King_W, Pieces.Queen_W, Pieces.Bishop_W, Pieces.Knight_W, Pieces.Rook_W },
            { Pieces.Pawn_W, Pieces.Pawn_W, Pieces.Pawn_W, Pieces.Pawn_W, Pieces.Pawn_W, Pieces.Pawn_W, Pieces.Pawn_W, Pieces.Pawn_W },
            { Pieces.None, Pieces.None, Pieces.None, Pieces.None, Pieces.None, Pieces.None, Pieces.None, Pieces.None },
            { Pieces.None, Pieces.None, Pieces.None, Pieces.None, Pieces.None, Pieces.None, Pieces.None, Pieces.None },
            { Pieces.None, Pieces.None, Pieces.None, Pieces.None, Pieces.None, Pieces.None, Pieces.None, Pieces.None },
            { Pieces.None, Pieces.None, Pieces.None, Pieces.None, Pieces.None, Pieces.None, Pieces.None, Pieces.None },
            { Pieces.Pawn_B, Pieces.Pawn_B, Pieces.Pawn_B, Pieces.Pawn_B, Pieces.Pawn_B, Pieces.Pawn_B, Pieces.Pawn_B, Pieces.Pawn_B },
            { Pieces.Rook_B, Pieces.Knight_B, Pieces.Bishop_B, Pieces.King_B, Pieces.Queen_B, Pieces.Bishop_B, Pieces.Knight_B, Pieces.Rook_B }
        };

        bool c = false;
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                GameObject tmp = Instantiate(Cell, GameObject.Find("Board").transform);
                tmp.name = $"{i},{j}";
                tmp.GetComponent<RectTransform>().anchoredPosition = new Vector2(j * 100, i * -100);
                tmp.GetComponent<Image>().color = c ? new Color(210 / 255f, 138 / 255f, 71 / 255f) : new Color(255 / 255f, 206 / 255f, 162 / 255f);
                c = !c;                
            }
            c = !c;
        }

        DrawBoard();
    }
    void Start()
    {
        Sprites = Resources.LoadAll<Sprite>("Sprites/PieceSheet");
        InitBoard();
    }
}

BoardManager(Empty Object)에 있는 Script

 코드상에서 2차원 배열 보드를 만들어두고, 기물들의 움직임 등을 이 보드 배열에서 처리한 후,

DrawBoard 함수를 호출함으로서 현 보드 배열 상태를 토대로 인게임의 보드를 그리는 형식이다.

 

뭐 나중에 가서 바꾸거나 더 나은 방법이 있다면 수정하면 될 일이니, 일단 이렇게 해보았다.

 

이제 짜야할 건 룩, 퀸, 비숍 등등 마다의 움직임인데, 살짝 고난이 예상된다.

'Programming > Unity C#' 카테고리의 다른 글

[Unity2D] 체스 개발 일지 - 0.5  (0) 2021.02.17