微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过脚本在 Unity 中重新定位和调整游戏对象的大小?

如何解决如何通过脚本在 Unity 中重新定位和调整游戏对象的大小?

所以我试图在 Unity 中构建一个类似于 Snakes and Ladders 游戏的游戏,但是当多个玩家标记落在同一个方块上时,我发现很难处理。

我的场景中有以下游戏对象:

enter image description here

点击 Player1 按钮时,一个玩家标记(圆柱形游戏对象)前进到第一个方格(为了测试目的,骰子被硬编码为每次都掷 1),如下所示:

enter image description here

现在当 Player2 按钮被点击时,另一个玩家标记应该前进到第一个方块,但是,它与第一个玩家标记重叠,看起来现在场景中只有一个玩家标记,如下所示:

enter image description here

我正在尝试找到一种方法来调整两个标记的大小和位置,以便它们之间有足够的空间并且它们仍然保持在同一个方块上。

此外,一旦玩家标记离开方块并前进到另一个方块,我需要根据每个方块上是否存在其他玩家标记(当然,如果超过 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);

不知道重新定位,或者现在无法考虑。希望其他人能回答这个问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。