Сделайте сетку 8 на 8 с правильным обозначением FEN. Как шахматная доска - PullRequest
0 голосов
/ 02 января 2019

Я сделал сетку 8 на 8 в Unity, просто используя DrawLine и для циклов.Мой следующий шаг - сделать так, чтобы каждая ячейка имела свою официальную комбинацию, например, нижний левый должен быть 1a, а верхний левый должен быть 8a ... Мой план был снова сделать для циклов внутри существующих циклов, но он просто дает ошибки.Может ли кто-нибудь дать мне несколько советов о том, как этого можно достичь

private void DrawChessboard()
{
    //8 units of 1 meter to the right
    Vector3 widthLine = Vector3.right * 8;
    //8 units of 1 meter up
    Vector3 heightLine = Vector3.forward * 8;

    //makes the 8 by 8
    for(int i = 0; i <= 8; i++)
    {
        Vector3 start = Vector3.forward * i;
        Debug.DrawLine(start, start + widthLine);
        for (int j = 0; j <= 8; j++)
        {
            start = Vector3.right * j;
            Debug.DrawLine(start, start + heightLine);
        }
    }

    //This draws the selection
    if (selectionX >= 0 && selectionY >= 0)
    {
        Debug.DrawLine(
            //Bottom left to top right
            Vector3.forward * selectionY + Vector3.right * selectionX,
            //this is the end point. +1 to make it diagonal
            Vector3.forward * (selectionY + 1) + Vector3.right * (selectionX + 1));

        Debug.DrawLine(
            //Bottom left to top right
            Vector3.forward * (selectionY +1) + Vector3.right * selectionX,
            //this is the end point. +1 to make it diagonal
            Vector3.forward * selectionY  + Vector3.right * (selectionX + 1));

    }
}

1 Ответ

0 голосов
/ 03 января 2019

Я до сих пор не уверен, где именно вызывается ваш метод, но так как вы используете Debug.DrawLine Я предполагаю, что это какой-то метод или сценарий редактора. Поэтому я приведу свой пример в OnDrawGizmos

Как уже говорилось, вы можете использовать Handles.Label(position, "Text"), чтобы нарисовать текст в качестве отладочной метки в SceneView.

Чтобы получить правильные символы, я просто использую

nextChar = (char)(currentChar + 1);

(чтобы завершить, я просто добавил черные и белые поля)

так что это может выглядеть как

using UnityEditor;
using UnityEngine;

public class ChessFieldDebug : MonoBehaviour
{
    private void OnDrawGizmos()
    {
        //8 units of 1 meter to the right
        var widthLine = Vector3.right * 8;
        //8 units of 1 meter up
        var heightLine = Vector3.forward * 8;

        const char firstLetter = 'a';

        // Only for you I also added black and white fields
        var isBlackField = false;
        var black = new Color(0, 0, 0, 0.25f);
        var white = new Color(1, 1, 1, 0.25f);

        //makes the 8 by 8

        //rows
        for (var i = 0; i <= 8; i++)
        {
            var start = Vector3.forward * i;
            Debug.DrawLine(start, start + widthLine);

            //colums
            for (var j = 0; j <= 8; j++)
            {
                var currentLatter = (char)(firstLetter + j);
                start = Vector3.right * j;
                Debug.DrawLine(start, start + heightLine);

                // this flag alternates between black and white
                isBlackField = !isBlackField;

                // Since you draw the last line but don't want a field added skip if over 8
                if (i >= 8 || j >= 8) continue;

                var centerOfField = Vector3.forward * (i + 0.5f) + Vector3.right * (j + 0.5f);

                // Draw text label on fields with colum char + row index
                Handles.Label(centerOfField, currentLatter.ToString() + (i + 1));

                Gizmos.color = isBlackField ? black : white;
                Gizmos.DrawCube(Vector3.forward * (i + 0.5f) + Vector3.right * (j + 0.5f), new Vector3(1, 0.01f, 1));
            }
        }
    }
}

Результат

enter image description here


Обязательно поместите его в папку Editor или используйте теги препроцессора, например

#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;

public class ChessFieldDebug : MonoBehaviour
{
    #if UNITY_EDITOR
    private void OnDrawGizmos()
    {
        // ...
    }
    #endif
}

чтобы избежать исключения при создании проекта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...