我正在制作一个神经网络建模程序,并且已经为背景网格制作了平铺的图像。
我正在尝试通过代码更改每单位乘数的图像像素,这不起作用(在运行时通过编辑器进行编辑就可以了)
这是我的放大/缩小代码:
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;
它按预期更改了每像素的像素值,但似乎对图像本身没有任何影响。
答案 0 :(得分:1)
有趣的是,此属性在任何地方都没有记录。我什至没有在ImageEditor
或GraphcisEditor
的源代码中找到它,所以现在我对真正负责显示此字段的真正兴趣是^^
但是我发现,在更改了大小设置之后,编辑者调用了EditorUtility.SetDirty(graphic);
。当然,这在构建中不可用,但它使我寻找-我认为-正确的解决方案:
更改属性后,您必须致电SetVerticesDirty
gridImage.SetVerticesDirty();
或简单地SetAllDirty
gridImage.SetAllDirty();
虽然我不确定效率,但您可能仅在值实际更改时才调用它。
也避免所有重复的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();
}
固定版本:
在分配“ pixelsPerUnitMultiplier
时,四舍五入是由于您舍入时产生的,您可能要考虑删除此舍入并直接应用
gridImage.pixelsPerUnitMultiplier = size / 2f
答案 1 :(得分:0)
Image.SetAllDirty();将使其工作,但稍后可能会产生随机故障。