如何在 Roblox Studio 中获取缩放 image/frame 的 rendered/displayed 大小

How to get the rendered/displayed size of a scaled image/frame in Roblox Studio

我需要获取帧内图像的宽度和高度。框架和图像都使用 Scale 属性 而不是 Offset 属性 来设置大小。我在图像所在的框架上有一个 UIAspectRatioConstraint。一切都随屏幕尺寸缩放。

但是,我需要能够获取图像(或帧)的当前 width/height,以便我可以执行一些数学函数,以便将图像上的标记移动到特定位置(X,Y)。我无法获取 image/frame 的大小,因此无法更新位置。

有没有办法获取使用 Scale 大小选项和 UIAspectRatioConstraint 的图像或帧的当前渲染宽度?

我困了。我希望这是有道理的...

我目前在另一个使用 Offset 而不是 Size 的图像上获得位置的数学是:

local _x = (_miniMapImageSize.X.Offset / _worldCenterSize.X) * (_playerPos.X - _worldCenterPos.X) + (_miniMapFrameSize.X.Offset / 2)
local _y = (_miniMapImageSize.Y.Offset / _worldCenterSize.Z) * (_playerPos.Z - _worldCenterPos.Z) + (_miniMapFrameSize.Y.Offset / 2)

这让我知道了玩家在我的迷你地图中的位置。但这并没有扩展。实际地图确实如此,我还需要在该地图上定位玩家的标记。

解决方法

现在(对于其他正在寻找解决方案的人),我已经创建了一个解决方法。我现在指定我的实际图像大小:

local _mapSize = Vector2.new(814, 659)

然后我使用屏幕宽度和高度来决定是否需要基于 x 轴或 y 轴进行缩放。 (缩放我的数学公式,而不是图像。)

if (_mouse.ViewSizeX / _mouse.ViewSizeY) - (_mapSize.X / _mapSize.Y) <= 0  then
    -- If the width of the screen is at the same or smaller ratio with the height of the screen
    -- then calculate the new size based off the width
    local _smallerByPercent = (_mouse.ViewSizeX * 0.9) / _mapSize.X

    _mapWidth = _mapSize.X * _smallerByPercent
    mapHeight = _mapSize.Y * _smallerByPercent
else
    local _smallerByPercent = (_mouse.ViewSizeY * 0.9) / _mapSize.Y

    _mapWidth = _mapSize.X * _smallerByPercent
    _mapHeight = _mapSize.Y * _smallerByPercent
end

之后,我可以在我的地图上为我的标记创建位置。

_x = ((_mapWidth / _worldCenterSize.X) * (_playerPos.X - _worldCenterPos.X)) * -1
_y = ((_mapHeight / _worldCenterSize.Z) * (_playerPos.Z - _worldCenterPos.Z)) * -1

_mapCharacterArrow.Position = UDim2.new(0.5, _x, 0.5, _y)

现在,当我按 "M" 打开大地图时,我的标记可以放置在我的角色所在的位置。

然而

我仍然很想知道一种获取 rendered/displayed 图像大小的方法...我试图做到这一点,而不必在脚本中手动输入图像大小。我希望它是动态的。

所以似乎有一个 属性 的大多数 GUI 元素称为 AbsoluteSize。这是元素的实际显示大小,无论它缩放到什么。 (并不是说它在缩放时保持不变,而是在缩放时发生变化以提供新的尺寸。)

有了这个,我能够将我的代码重写为:

local _x = (_mapImageSize.X / _worldCenterSize.X) * (_playerPos.X - _worldCenterPos.X) * -1
local _y = (_mapImageSize.Y / _worldCenterSize.Z) * (_playerPos.Z - _worldCenterPos.Z) * -1

_mapCharacterArrow.Position = UDim2.new(0.5, _x, 0.5, _y)

其中 _mapImageSize = [my map image].AbsoluteSize.

比以前好多了。