UI.Image.pixelsPerUnitMultiplier不会通过代码更新

时间:2019-08-28 02:38:50

标签: c# image user-interface unity3d pixel

我正在制作一个神经网络建模程序,并且已经为背景网格制作了平铺的图像。

我正在尝试通过代码更改每单位乘数的图像像素,这不起作用(在运行时通过编辑器进行编辑就可以了)

这是我的放大/缩小代码:

float desiredSize = this.GetComponent<Camera>().orthographicSize;
desiredSize -= Input.mouseScrollDelta.y * 3;

//Clamp between min and max
desiredSize = Mathf.Clamp(desiredSize, minSize, maxSize);

//Smoothly interpolates to desired size
this.GetComponent<Camera>().orthographicSize = Mathf.Lerp(this.GetComponent<Camera>().orthographicSize, desiredSize, 5f * Time.deltaTime);

//Change pixels per unit multiplier to half of camera's size (with only 1 decimal char)
gridImage.pixelsPerUnitMultiplier = Mathf.Round( (this.GetComponent<Camera>().orthographicSize / 2) * 10f) / 10f;

它按预期更改了每像素的像素值,但似乎对图像本身没有任何影响。

2 个答案:

答案 0 :(得分:1)

有趣的是,此属性在任何地方都没有记录。我什至没有在ImageEditorGraphcisEditor的源代码中找到它,所以现在我对真正负责显示此字段的真正兴趣是^^

但是我发现,在更改了大小设置之后,编辑者调用了EditorUtility.SetDirty(graphic);。当然,这在构建中不可用,但它使我寻找-我认为-正确的解决方案:

更改属性后,您必须致电SetVerticesDirty

gridImage.SetVerticesDirty();

或简单地SetAllDirty

gridImage.SetAllDirty();

enter image description here


虽然我不确定效率,但您可能仅在值实际更改时才调用它。

也避免所有重复的GetComponent通话!在Awake中执行一次,然后重新使用引用。

最后,您的Lerp毫无用处!由于您获得了当前尺寸并在该尺寸上计算出所需的尺寸,因此根本没有平滑的缩放比例。而是在类中使用全局字段并更新该字段:

// would even be better if you can already reference this in the Inspector
[SerializeField] private Camera _camera;

public Image gridImage;

public float minSize;
public float maxSize;

private float desiredSize;

private void Awake()
{
    if (!_camera) _camera = GetComponent<Camera>();

    // initialize the desired size with the current one
    desiredSize = Mathf.Clamp(_camera.orthographicSize, minSize, maxSize);

    // do it once on game start
    UpdateImage(desiredSize);
}

// Update is called once per frame
private void Update()
{
    var currentSize = _camera.orthographicSize;
    desiredSize -= Input.mouseScrollDelta.y * 3;

    //Clamp between min and max
    desiredSize = Mathf.Clamp(desiredSize, minSize, maxSize);

    // is the scaling already done?
    // -> Skip unnecessary changes/updates
    if (Mathf.Approximately(desiredSize, currentSize)) return;

    //Smoothly interpolates to desired size
    _camera.orthographicSize = Mathf.Lerp(currentSize, desiredSize, 5f * Time.deltaTime);

    UpdateImage(_camera.orthographicSize);
}

private void UpdateImage(float size)
{
    //Change pixels per unit multiplier to half of camera's size (with only 1 decimal char)
    gridImage.pixelsPerUnitMultiplier = Mathf.Round(size / 2 * 10f) / 10f;

    gridImage.SetVerticesDirty();
}

固定版本:

enter image description here

在分配“ pixelsPerUnitMultiplier时,四舍五入是由于您舍入时产生的,您可能要考虑删除此舍入并直接应用

gridImage.pixelsPerUnitMultiplier = size / 2f

答案 1 :(得分:0)

Image.SetAllDirty();将使其工作,但稍后可能会产生随机故障。