问题描述
所以我试图在 Unity 中构建一个类似于 Snakes and Ladders 游戏的游戏,但是当多个玩家标记落在同一个方块上时,我发现很难处理。
点击 Player1 按钮时,一个玩家标记(圆柱形游戏对象)前进到第一个方格(为了测试目的,骰子被硬编码为每次都掷 1),如下所示:
现在当 Player2 按钮被点击时,另一个玩家标记应该前进到第一个方块,但是,它与第一个玩家标记重叠,看起来现在场景中只有一个玩家标记,如下所示:
我正在尝试找到一种方法来调整两个标记的大小和位置,以便它们之间有足够的空间并且它们仍然保持在同一个方块上。
此外,一旦玩家标记离开方块并前进到另一个方块,我需要根据每个方块上是否存在其他玩家标记(当然,如果超过 2 个玩家)来调整两个方块上玩家标记的大小,或者不是
public void MovePlayerToken(GameObject currentPlayer)
{
var startingSquare = currentPlayer.GetComponent<PlayerToken>().StartingSquare;
var landingSquare = GetLandingSquare(startingSquare);
var existingPlayerTokensOnLandingSquare = GetExistingPlayerTokens(playerTokens,landingSquare);
//var existingPlayerTokensOnStartingSquare = GetExistingPlayerTokens(playerTokens,startingSquare);
if (existingPlayerTokensOnLandingSquare.Count > 0)
{
TransformPlayerTokens(existingPlayerTokensOnLandingSquare,landingSquare,SquareType.LandingSquare);
if (currentPlayer.transform.localScale == new Vector3(1,1,1))
{
currentPlayer.transform.localScale = new Vector3(currentPlayer.transform.localScale.x / 2,currentPlayer.transform.localScale.y / 2,currentPlayer.transform.localScale.z / 2);
}
switch (existingPlayerTokensOnLandingSquare.Count)
{
case 1:
existingPlayerTokensOnLandingSquare[0].transform.position = new Vector3(landingSquare.transform.localPosition.x + 0.25f,landingSquare.transform.localPosition.y,landingSquare.transform.localPosition.z + 0.25f);
currentPlayer.transform.position = new Vector3(landingSquare.transform.localPosition.x + -0.25f,landingSquare.transform.localPosition.z + -0.25f);
break;
case 2:
existingPlayerTokensOnLandingSquare[0].transform.position = new Vector3(landingSquare.transform.localPosition.x + 0.25f,landingSquare.transform.localPosition.z + 0.25f);
existingPlayerTokensOnLandingSquare[1].transform.position = new Vector3(landingSquare.transform.localPosition.x + -0.25f,landingSquare.transform.localPosition.z + -0.25f);
currentPlayer.transform.position = landingSquare.transform.position;
break;
}
}
else
{
currentPlayer.transform.position = landingSquare.transform.position;
}
currentPlayer.GetComponent<PlayerToken>().StartingSquare = landingSquare;
}
private Square GetLandingSquare(Square startingSquare)
{
Square landingSquare = startingSquare;
for (int i = 0; i < _stateManager.Dicetotal; i++)
{
if (landingSquare.NextSquares.Length > 1)
landingSquare = landingSquare.NextSquares[Random.Range(0,landingSquare.NextSquares.Length)];
else
landingSquare = landingSquare.NextSquares[0];
}
return landingSquare;
}
private List<PlayerToken> GetExistingPlayerTokens(PlayerToken[] playerTokens,Square square)
{
List<PlayerToken> existingPlayerTokens = new List<PlayerToken>();
foreach (var playerToken in playerTokens)
{
if (playerToken.transform.position == square.transform.position ||
playerToken.transform.position == new Vector3(square.transform.localPosition.x + 0.25f,square.transform.localPosition.y,square.transform.localPosition.z + 0.25f) ||
playerToken.transform.position == new Vector3(square.transform.localPosition.x + -0.25f,square.transform.localPosition.z + -0.25f))
{
existingPlayerTokens.Add(playerToken);
}
}
return existingPlayerTokens;
}
private void TransformPlayerTokens(List<PlayerToken> existingPlayerTokens,Square landingSquare,SquareType squareType)
{
foreach (var playerToken in existingPlayerTokens)
{
if(playerToken.transform.localScale == new Vector3(1,1))
{
playerToken.transform.localScale = new Vector3(
playerToken.transform.localScale.x / 2,playerToken.transform.localScale.y / 2,playerToken.transform.localScale.z / 2
);
}
}
}
这种方法的问题在于玩家令牌越多,需要的硬编码就越多......我真的不喜欢这种方法,我相信有更好的方法可以使用物理引擎或一些东西(顺便说一句,我是一个完全的新手,以前从未使用过 Unity - 这是我的第一个项目,所以请期待我对物理引擎知之甚少)
谢谢。
解决方法
您可以使用 GameObject.transform.position =(此处为新位置)重新定位。
,对于调整大小,您可以这样做
var players = existingPlayerTokensOnLandingSquare.Count + 1;
currentPlayer.transform.localScale = new Vector3(currentPlayer.transform.localScale.x / players,currentPlayer.transform.localScale.y / players,currentPlayer.transform.localScale.z / players);
不知道重新定位,或者现在无法考虑。希望其他人能回答这个问题。