Unity中基于网格的/平铺运动+碰撞?

时间:2018-04-28 16:59:07

标签: c# unity3d

在确定如何进行基于网格的移动或基于图块的移动方面存在巨大的问题。与Nitrome的Redungeon有些相似:无法真正发布图片:所以这里是一个gif。 http://www.eneminds.com/redungeon/img/gifs/gif_1.gif

我想我应该创建一个网格系统。我认为这很容易就像旧游戏(口袋妖怪等)不确定如何做到这一点。但我也希望运动能够快速发展。

2 个答案:

答案 0 :(得分:2)

Unity有自己的tilemaps实现,它可以让你构建背景a.k.a你走的地方: https://docs.unity3d.com/Manual/Tilemap.html

此外,Unity提供了更多的2D内容来帮助您在此处构建内容: https://github.com/Unity-Technologies/2d-extras

在这里找到的众多教程中概述了碰撞: https://unity3d.com/learn/tutorials/s/2d-game-creation

制作类似动画GIF中的游戏,不容易。如果您是游戏开发人员的新手,尤其如此,所以不要期待简单的解决方案。

您可能想要查看Unity资源商店以获得基于磁贴的移动的快速方式,但这一直都会带来价格,并且无法帮助您学习。 https://assetstore.unity.com/

关于移动速度,这总是游戏中的一个变量,可根据您的喜好进行调整。在基于区块的游戏的情况下,它将对应于角色在视觉上从一个区块移动到另一个区块所花费的时间。尝试阅读作为Unity引擎一部分的Lerping。 https://docs.unity3d.com/ScriptReference/Vector3.Lerp.html

答案 1 :(得分:0)

我能够把它拉下来。 我刚刚从Unity学习部分的RogueLike教程中修改了输入内容。

所以这是负责运动的代码

    void Move(string direction_string)
    {
        ChangeDirection(direction_string);

        Vector2 start = transform.position;
        Vector2 end = start + direction;

        boxCollider.enabled = false;
        hit = Physics2D.Linecast(start, end, blockingLayer);
        boxCollider.enabled = true;

        if (hit.transform == null) {
            StartCoroutine(Movement(end));
            animator.SetTrigger(direction_string);
            return;
        } else {
            moveSequence.RemoveAt(0);
            animator.SetTrigger(direction_string);
            return;
        }
    }

    void ChangeDirection(string direction_string)
    {
        switch (direction_string) {
            case "up":
                direction = dir_Up;
                break;
            case "down":
                direction = dir_Down;
                break;
            case "left":
                direction = dir_Left;
                break;
            case "right":
                direction = dir_Right;
                break;
        }
    }

    IEnumerator Movement(Vector3 end)
    {
        moving = true;
        float sqrRemainingDistance = (transform.position - end).sqrMagnitude;

        while (sqrRemainingDistance > float.Epsilon) {
            Vector3 newPosition = Vector3.MoveTowards(rb2D.position, end, moveSpeed * Time.deltaTime);
            rb2D.MovePosition(newPosition);
            sqrRemainingDistance = (transform.position - end).sqrMagnitude;
            yield return null;
        }

        currentPos = end;
        moveSequence.RemoveAt(0);
        moving = false;
    }
}

这是负责输入的内容


    void FixedUpdate ()
    {
        if (moveSequence.Count > 0 && !moving) {
            Move(moveSequence[0]);
        }
    }

然后将其连接到一个Update()函数,该函数侦听按钮的按下并将一个列表项添加到moveSequence List中,如

moveSequence.Add("up");