如何在Unity3D中创建像Snake vs Block这样的动作

时间:2018-06-23 19:50:02

标签: c# unity3d

我正在尝试重新创建流行的SnakeVSBlock手机游戏。大多数物理学都非常简单明了,但我似乎无法重新创建蛇的动作。游戏中蛇的移动的特殊之处在于,上一个节点在X和Y中都完美地遵循了下一个路径。这是我当前的代码,它可以像蛇一样运动,但不遵循下一个的确切路径节点。我想知道是否有人对此有解决方案。

public void Move()
{
    if (Input.GetMouseButton(0) && GameManager.Instance.IsGameOver() == false && Nodes.Count > 0)
    {
        Vector3 curPos = Input.mousePosition;
        curPos.z = -1;
        curPos = Camera.main.ScreenToWorldPoint(curPos);
        Nodes[0].GetComponent<Rigidbody2D>().velocity = new Vector2(curPos.x - Nodes[0].position.x, 0) * 20;

    if (Nodes[0].position.x > 2.56f)
    {
        Nodes[0].position = new Vector2(2.56f,Nodes[0].position.y);
    }
    else if (Nodes[0].position.x < -2.56f)
    {
        Nodes[0].position = new Vector2(-2.56f, Nodes[0].position.y);
    }
    for (int i = 1; i < Nodes.Count; i++)
    { 
        Vector2 newPos = new Vector2(Nodes[i-1].position.x, Nodes[i].position.y);
        if (GameManager.Instance.GetPoweredUp())
        {
            Nodes[i].position = Vector2.Lerp(Nodes[i].position, newPos, Time.deltaTime * 14);
        }
        else
        {
            Nodes[i].position = Vector2.Lerp(Nodes[i].position, newPos, Time.deltaTime * 10);
        }

    }
}

更新:我更改了游戏中蛇移动的基本逻辑。而不是让蛇向上移动,蛇停留在相同的位置,而块向下移动。但是我仍然无法像真实游戏中那样获得平稳的蛇行。还有其他建议吗?

2 个答案:

答案 0 :(得分:0)

如果我了解您想做什么,则应该以相反的顺序进行操作。 因此,如果您有节点0到n:

  • 从第n个节点开始
  • 评估该节点第n-1个节点的位置
  • 然后为每个i节点分配i-1节点的位置
  • 移动所有节点后,请根据用户输入移动节点0。

它应该像这样:

public void Move()
{
    int n = Nodes.Count;

    if (n > 0)
    {
        for (int i = n - 1; i > 0; i--)
        {
            _curNode = Nodes[i];
            _nextNode = Nodes[i - 1];

            Vector3 pos = _nextNode.transform.position;
            pos.z = Nodes[0].position.z;

            _curNode.tranform.position = pos;
        }

        float horizontalInput = Input.GetAxis("Horizontal");
        Nodes[0].Translate(Vector3.right * Time.deltaTime * horizontalInput * 10);
        Nodes[0].Translate(Vector3.up * Time.deltaTime * 4);

        if (Nodes[0].position.x > 2.90)
        {
            Nodes[0].position = new Vector2(2.90f, Nodes[0].position.y);
        }
        else if (Nodes[0].position.x < -2.90)
        {
            Nodes[0].position = new Vector2(-2.90f, Nodes[0].position.y);
        }
    }    
}

此外,除非您以某种方式增加了两个LerpTime变量,否则您会滥用Lerp函数,并且在这种情况下也不需要它。 这是有关Lerp真正含义以及如何正确使用它的非常清晰的指南: http://lunarlabs.pt/blog/post/the-art-of-lerp

答案 1 :(得分:0)

您收集小方块的旧手机游戏“蛇”具有相同的移动方式。然后的解决方案是,蛇的各个部分实际上并没有移动,只是在您向头部添加一点并从尾巴上移走了一帧。

在这种蛇对方块游戏中,这种方法适用于蛇但不能立即起作用的原因是前者是离散的,后者是连续的。

解决此问题的一种方法是,每个身体部位始终会偏向上方的部位,当到达该部位时,它会向后移动。当身体的各个部分实际上卡在适当的位置时,这会给蛇一种前进的感觉,就像古老的蛇游戏一样。

这可以在纸上进行,但我不知道它会如何执行。但是,如果您真的很绝望,则可以考虑尝试一下。