Представлять GameObject как букву в Unity - PullRequest
0 голосов
/ 10 февраля 2019

Я хотел бы представить GameObjects в моей игре как буквы;

Например, blackPawn будет 'p', а blackKing будет 'k'

Я пытался использовать оператор switch caseбезуспешно, ниже будет код для него

Есть ли другие более простые методы для достижения этой цели?

GameObject blackPawn = GameObject.FindGameObjectWithTag ("p");

приватные пустые буквы () {

    char letter;

    switch(letter)
    {
        case 'p':
            (fill with anything) = blackPawn;
            break;
    }

}

1 Ответ

0 голосов
/ 11 февраля 2019

Есть много способов достичь этого.Я бы не стал полагаться на имена GameObject, потому что, если вам нужно внести изменения позже, вам придется сделать много переименований.Создайте скрипт компонента и прикрепите его к игровым объектам.

Я не очень знаком со строкой FEN в шахматах, но из того, что я могу сказать, письмо исходит от типа шахматной фигуры и ее цвета.,Для черного / белого цвета я бы добавил поле, которое вы можете редактировать в Инспекторе, например this .Что касается буквы, так как она никогда не должна изменяться, вы можете иметь ее в качестве константы непосредственно в скрипте.

Самый простой способ - это иметь абстрактный класс Piece и все шахматные фигуры наследуют от него.Класс для определения всего, что должно быть у фигур.

using UnityEngine;

/// <summary> The base class for all the chess pieces to inherit from. </summary>
public abstract class Piece : MonoBehaviour
{    
    [SerializeField] protected bool black; // set in the inspector for each piece
    public abstract char Letter { get; }

    /// <summary> Returns the chess FEN notation character representing the piece. </summary>
    public char GetFEN() => (black) ? char.ToLowerInvariant(Letter) : char.ToUpperInvariant(Letter);   
} 

Вы можете добавить дополнительные переменные в базовый класс, например, [SerializeField] protected Vector2Int coodinates;, чтобы удерживать его позицию на игровой доске.

А затем создайте соответствующие классы для конкретных частей.

public class Rook : Piece
{    
    public override char Letter { get; } = 'R';        
}

Тогда вам решать, как именно вы хотите получить фрагменты для их обработки.Самый простой способ - вызвать FindObjectsOfType<Piece>() откуда-то, а затем обработать их.Хотя я бы, вероятно, создал компонент Board и добавил бы все части в качестве его дочерних элементов .

public class Board : MonoBehaviour
{
    List<Piece> pieces = new List<Piece>();

    void Start()
    {
        // Initialize the collection of pieces 
        transform.GetComponentsInChildren(pieces);               
    }

    public string GetFEN() 
    {
        foreach (Piece piece in pieces)
        {
            char fen = piece.GetFEN();

            // TODO: Do what you need with the character
        }
    }
}

Как только у вас будет коллекция, вы можете, например, получить все грачи, как это:

using System.Linq;

var rooks = pieces.Where(piece => piece.Letter == 'R');

Я не знаю, обязательно ли этот подход проще , но в конечном итоге он должен сделать ваш код более управляемым.

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