C# 敌人头顶上的团结健康棒

C# 敌人头顶上的团结健康棒,c#,user-interface,unity3d,C#,User Interface,Unity3d,我在这方面遇到了一些问题,所以我想在这里问一下 我编写了一个代码,实例化了一个健康条(一个简单的滑块)和一个敌人。然后,它将敌人(刚刚繁殖的)设置为该健康栏的目标,健康栏将更新其位置,使其始终位于敌人头部上方 这是健康栏的脚本 (canvasRect是canvas的rect变换,myRect是health bars的rect变换): 脚本工作得很好,但有一个问题:正如您所看到的,我在y坐标中添加了一个偏移量。这是将健康条放置在敌人上方,而不是放置在敌人内部 然而,当我移动相机时,问题就出现了。如

我在这方面遇到了一些问题,所以我想在这里问一下

我编写了一个代码,实例化了一个健康条(一个简单的滑块)和一个敌人。然后,它将敌人(刚刚繁殖的)设置为该健康栏的目标,健康栏将更新其位置,使其始终位于敌人头部上方

这是健康栏的脚本 (canvasRect是canvas的rect变换,myRect是health bars的rect变换):

脚本工作得很好,但有一个问题:正如您所看到的,我在y坐标中添加了一个偏移量。这是将健康条放置在敌人上方,而不是放置在敌人内部

然而,当我移动相机时,问题就出现了。如果我放大,它会旋转一点(像RTS相机),这意味着偏移是错误的。我越放大,健康栏越低(因为15f的偏移量已经不够了)。然后当我把相机移近敌人时,它又把健康棒推到了敌人身上

有没有办法让我的敌人的“边界”达到屏幕大小,这样我就可以随时知道偏移量是多少?还是有其他解决办法


提前谢谢

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


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

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


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

您可以尝试使用包含缩放因子和偏移的公式。当你缩小时,偏移量会相应增加(两倍于缩放距离,两倍于偏移量,等等)。创建一个空的游戏对象,将其作为敌人的子对象,将其位置安排在敌人头顶上方。并在空游戏对象中实例化healthbar。因此,它将始终保持在那里。缩放偏移有效,但仅在我移动相机之前有效。即使在缩放时偏移是正确的,但一旦我将相机移向敌人,它仍然会弄乱。我可以在空的游戏对象中实例化健康栏吗?我认为它必须将画布作为其父对象,否则无法正确渲染?你可以尝试使用一个包含缩放因子和偏移量的公式。当你缩小时,偏移量会相应增加(两倍于缩放距离,两倍于偏移量,等等)。创建一个空的游戏对象,将其作为敌人的子对象,将其位置安排在敌人头顶上方。并在空游戏对象中实例化healthbar。因此,它将始终保持在那里。缩放偏移有效,但仅在我移动相机之前有效。即使在缩放时偏移是正确的,但一旦我将相机移向敌人,它仍然会弄乱。我可以在空的游戏对象中实例化健康栏吗?我认为它必须将画布作为它的父对象,否则它将无法正确渲染?就是这样。实际上,我曾尝试在(targetPosition.y*canvasRect.sizeDelta.y)计算中这样做,但从未想过在定义位置的开始就这样做。谢谢!就这样。实际上,我曾尝试在(targetPosition.y*canvasRect.sizeDelta.y)计算中这样做,但从未想过在定义位置的开始就这样做。谢谢!
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;
        }
    }