在Unity中将GameObject表示为字母

时间:2019-02-10 10:46:06

标签: c# unity3d

我想在游戏中将GameObjects表示为字母;

例如,blackPawn为'p',blackKing为'k'

我尝试使用switch case语句失败,下面是它的代码

还有其他更简单的方法可以实现这一目标吗?

GameObject blackPawn = GameObject.FindGameObjectWithTag(“ p”);

private void Letters() {

    char letter;

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

}

1 个答案:

答案 0 :(得分:0)

有很多方法可以实现这一目标。我不会依赖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');

我不知道这种方法是否一定更容易,但是从长远来看,它应该使您的代码更易于管理。