从 Canvas 缩放器 (Unity) 检索缩放量

Retrieving the amount of scaling from the Canvas Scaler (Unity)

我目前正在开发一个健康栏,它会慢慢耗尽你的健康状况。我按照本教程获得了我想要的健康栏:https://www.youtube.com/watch?v=NgftVg3idB4

简而言之,它使用遮罩层和单独的绿色条来指示生命值。通过向左移动绿色条,它会消失在遮罩层后面,因此显示健康状况越来越差。 根据生命值计算其位置的方法在这里: 代码 (CSharp):

float maxXValue = healthTransform.position.x;
float minXValue = healthTransform.position.x - healthTransform.rect.width;

private void HandleHealth()
{
    Stats attachedStats = attachedObject.GetComponent<Stats>();

    float currentXValuePlayer = MapValues(attachedStats.currentHealth, 0, attachedStats.maxHealth, minXValue, maxXValue);
    healthTransform.position = new Vector3(currentXValuePlayer, cachedY);
}

private float MapValues(float x, float inMin, float inMax, float outMin, float outMax)
{
    return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;
}
/*
EXPLANATION:
attachedStats.currentHealth is the current health the player has
attachedStats.maxHealth is the maximum amount of health the player can have
minXValue is the furthest left point the bar is at when health is 0
maxXValue is the furthest right point the bar is at when health is full
*/

这是我用于 canvas 健康栏绘制的设置。

问题是(可能)由于 canvas 的缩放,healthTransform.rect.width 仍然是 returns 健康栏的原始大小,而不是新的缩放大小。那么有没有办法找出 Canvas 缩放器缩放了多少东西?

12 月份我在 Unity 论坛上问过同样的问题:

http://forum.unity3d.com/threads/canvasscaler-current-scale.285134/

Unity 的回答是: "After the canvas has been scaled you should be able to just read it back from the scaleFactor on the canvas as the canvas scaler just controls this value. "

但是,无论 UI 变得多么小,scaleFactor 的值始终为 1.0。不知道这是为什么,Unity再也没有回应过。有没有其他人有幸提取这个值?

作为解决方法,您拥有 CanvasScaler 脚本的对象上的 RectTransform 的 localScale 应该反映整个 UI.

的当前比例

有一种更简单的方法来处理绿色条的宽度 - 即使其成为 "Filled" 图像类型。这样你就根本不需要面具,这大大简化了事情。


使用填充在 Unity 4.6+ 中创建健康栏

创建一个包含所需图像的 canvas 对象(在本例中为红色背景条、绿色前景条和轮廓)。

按此顺序放置时,最低的图像将出现在最上面(见下文)。

结果将是一个如下所示的健康栏:

但是,现在我们需要能够根据生命点数来控制绿色条的宽度。为此,我们可以修改 "Green Bar" 的图像组件:

  • 将类型更改为 "filled"
  • 将填充方法更改为 "Horizontal"
  • 将填充原点更改为 "Left"。

现在可以通过修改填充量来控制绿色条的宽度。 (你可以用滑块测试一下)

最后,您必须添加一个脚本来设置绿色条的宽度,在 C# 中可能如下所示:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class HealthBar : MonoBehaviour {

    public float MaxHealth = 100;
    private float _playerHealth;
    private Image _greenBar

    void Start () {
            _playerHealth = MaxHealth;
            _greenBar = transform.FindChild("GreenBar").GetComponent<Image>();
    }

    void Update () {

            //logic to set _playerHealth goes here

            _greenBar.fillAmount = _playerHealth/MaxHealth;
    }
}

我今天正好遇到了这个问题(问题提出大约三年后),发现通过在 Start() 和 [=12] 中的 Canvas 对象上使用 scaleFactor =],我能够获得缩放面罩运动的适当系数。但是,似乎 Awake() 中的值设置不可靠,这可能引起了一些麻烦。

为了将来参考,您不需要任何类型的解决方法,正如 Farmer Joe 的回答中所建议的那样。如果有错误——我怀疑——它已经被修复了。