Есть много способов достичь этого.Я бы не стал полагаться на имена 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');
Я не знаю, обязательно ли этот подход проще , но в конечном итоге он должен сделать ваш код более управляемым.