【问题标题】:Unity Health Bar over Enemy Head敌人头上的 Unity 生命条
【发布时间】:2018-05-25 06:50:05
【问题描述】:

我遇到了一些问题,所以我想我会在这里问。

我编写了一个代码来实例化一个健康条(一个简单的滑块)和一个敌人。然后,它将那个敌人(刚刚生成的)设置为该生命值条的目标,并且该生命值条会更新其位置以始终保持在敌人头顶上方。

这是健康栏的脚本 (canvasRect是画布的rect变换,myRect是健康条的rect变换):

private void Update() {
        if(target != null) {
            Vector2 targetPosition = Camera.main.WorldToViewportPoint(target.position);

            Vector2 screenPosition = new Vector2(((targetPosition.x * canvasRect.sizeDelta.x) - (canvasRect.sizeDelta.x * 0.5f)),
                ((targetPosition.y * canvasRect.sizeDelta.y) - (canvasRect.sizeDelta.y * 0.5f)));

            screenPosition += new Vector2(0f, 15f);

            myRect.anchoredPosition = screenPosition;
        }
    }

脚本运行良好,但有一个问题:如您所见,我在 y 坐标中添加了一个偏移量。这是将生命值条放置在敌人上方,而不是内部

但是,当我移动相机时,问题就来了。如果我放大,它会旋转一点(像 RTS 相机),这意味着偏移量是错误的。我放大得越远,生命值越低(因为 15f 的偏移量已经不够用了)。然后当我将相机移近敌人时,它再次将生命条推到他身上。

有没有办法让我的敌人的“边界”以屏幕尺寸显示,这样我就总能知道有什么偏移量?还是有其他解决方案?

提前致谢!

【问题讨论】:

  • 您可以尝试使用涉及缩放因子和偏移的公式。当您缩小时,偏移量会相应增加(缩小两倍、偏移量两倍等)。
  • 创建一个空的游戏对象,将其作为子对象放置在敌人的头顶上。并在空的游戏对象中实例化健康栏。这样它就会一直呆在那里。
  • 缩放偏移有效,但仅在我移动相机之前。即使缩放时偏移是正确的,一旦我将相机移向敌人,它仍然会搞砸。
  • 我可以在空的游戏对象中实例化健康条吗?我认为它必须将画布作为其父级,否则无法正确渲染?

标签: c# user-interface unity3d


【解决方案1】:

解决方案很简单。不要将偏移量添加到屏幕位置。而是将其添加到敌人的世界位置(target.position + offset)。

除此之外,您还可以使用 MeshRenderer.bounds 获取网格的边界。

【讨论】:

  • 就是这样。我实际上试图在 (targetPosition.y * canvasRect.sizeDelta.y) 计算中这样做,但从没想过只是在我定义位置的开始就这样做。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多