我想在游戏中将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;
}
}
答案 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');
我不知道这种方法是否一定更容易,但是从长远来看,它应该使您的代码更易于管理。