【问题标题】:How to calculate the length of platform/object in Unity 5?如何在 Unity 5 中计算平台/对象的长度?
【发布时间】:2016-04-02 23:13:16
【问题描述】:

我是 Unity 新手,在观看和阅读了一些教程之后,我现在正在尝试制作一款简单的 2D 平台游戏。在上述游戏中,敌人和玩家都可以像旧的 SnowBros 游戏一样跳转到不同的平台并穿越它。

我面临的问题与对敌人运动的编程有关。在我的游戏中会有几种类型的敌人,但目前一般有两种类型,一种可以从平台上跳下来,一种只能走到平台的长度,等待 1 秒然后翻转并向后走;这意味着他们不会离开平台。现在这是我遇到的问题。我似乎找不到计算底层当前平台长度的方法。我想过使用 collider.bound.min.x 和 max.x 来解决这个问题,但问题是我似乎无法找到一种简单的方法来到达当前平台的对撞机而不获取脚本然后通过它.

由于会有许多不同大小的平台,并且每个平台都由其他平台的预制件组成,因此使用平台脚本然后遍历它似乎不是一个可行的解决方案。

【问题讨论】:

    标签: unity3d 2d collision collider


    【解决方案1】:

    您可以使用Physics2D.Raycast 来“感知”Ray 上的冲突。想象一下敌人向前迈出一步,感受一下是否还有坚实的地面,然后决定是否停下来。

    void Update()
    {
        Vector2 newPosition = transform.position + velocity * Time.deltaTime;
        Vector2 downwardDirection = Vector2.down;  // you may have to replace this with your downward direction if you have a different one
    
        RaycastHit2D hit = Physics2D.Raycast(newPosition, downwardDirection);
        if (hit.collider != null)
        {
            // solid ground detected
    
            transform.position = newPosition;
        }
        else
        {
            // no ground detected. Do something else...
        }
    }
    

    您可以并且应该定义您的 Raycast 应该击中的图层,以便它可以忽略敌人本身并避免自我碰撞。

    【讨论】:

    • 嘿,谢谢,这是我期待的事情。但是这个 hit.collider 的问题不会是 null 即使当前平台结束但在该平台之下还有另一个平台。我可以在两点之间投射光线而不是方向吗?说 newPosition 和 newposition.y - 1 因为那时它只会检查当前平台的碰撞,其次我是否也可以将其缩小到相应的层?
    • Raycast 方法还采用可选的length 参数。有了这个,您可以定义沿着Ray 搜索碰撞的最大距离。
    • 我不推荐使用这种方法,因为它非常“hacky”并且消耗资源。你最好使用标准的 Unity 机制,比如碰撞器和图层。还可以考虑使用 Physics2D.RaycastNonAlloc 代替 Physics2D.Raycast 来提高性能
    • 顺便说一句,如果您的主要问题是确定平台长度,我相信您可以使用 Renderer.bounds.size 属性
    • 我认为这种方法需要更少的对撞机,而更符合逻辑的。一个平台的固体区域只需要一个对撞机。不需要左右边界碰撞器,当两个平台彼此非常接近时,它们可能会出现问题。此外,如果平台必须知道会有敌人需要额外的对撞机,而不是只为自己提供一个对撞机并让敌人担心他们的要求,那么这也是糟糕的设计。
    【解决方案2】:

    好吧,我希望你有平台的预制件,并在这些预制件中将对撞机放在开始和结束处。您可以指定图层和标签,以便只有敌人可以检测到这些碰撞器,然后您可以从敌人脚本中检测碰撞标签并进行操作。

    首先通过打开编辑 -> 项目设置 -> 标签和图层来创建图层。创建两个图层

    为敌人和敌人碰撞器创建图层并转到编辑 -> 项目设置 -> Physics2D。将碰撞矩阵设置为 EnemyCollider 只会与敌人发生碰撞。

    你的预制件看起来像,

    希望对你有帮助。

    【讨论】:

    • 感谢您的回复。我已经知道这个解决方案,实际上我正在使用它来解决与平台跳转相关的另一个问题。这个解决方案是不可行的,因为首先有两个原因,最终平台的长度可以组成,比如说平台预制件 1 + 平台预制件 2+....+.,并且会有多个级别和许多不同的平台,所以我然后必须为每个平台单独编码。
    • 感谢您的回答,无论如何这非常有用。我也认为这仍然适用于多平台,因为您可以使用诸如长度或平台数组之类的参数创建预制件,并在每边的末尾添加碰撞器。
    • 可能是这样:保持启用第一个平台的左对撞机,禁用第二个,并且对于所有中间平台禁用两个对撞机并启用最后一个平台的右对撞机
    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2016-05-21
    • 2020-04-30
    相关资源
    最近更新 更多