📅  最后修改于: 2023-12-03 14:59:59.686000             🧑  作者: Mango
当你正在编写使用 Roact 或其他 Lua 框架创建的 UI 时,可能会遇到 Color3 不起作用的问题。
当你尝试设置元素的颜色时,会发现颜色并没有生效。比如下面这个例子:
local Roact = require(game.ReplicatedStorage.Roact)
local Color3 = require(game.ReplicatedStorage.Color3)
local MyComponent = Roact.Component:extend("MyComponent")
function MyComponent:init()
self:setState({
color = Color3.new(1, 0, 0)
})
end
function MyComponent:render()
return Roact.createElement("Frame", {
Size = UDim2.new(1, 0, 1, 0),
BackgroundColor3 = self.state.color,
})
end
return MyComponent
在这个例子中,我们创建了一个 Frame,并设置了它的背景颜色为 state 中的 color 。但是当我们运行这个代码,会发现 Frame 的背景颜色并没有变成红色。
Color3 不工作的问题通常是由于颜色格式不正确导致的。Lua 中 Color3 有两种常见的表示方式。
第一种是使用三个浮点数表示 R、G、B 三个分量的值,取值范围为 0 到 1,像下面这样:
local color1 = Color3.fromRGB(255, 0, 0)
local color2 = Color3.new(1, 0, 0)
第二种是使用三个整数表示 R、G、B 三个分量的值,取值范围为 0 到 255,像下面这样:
local color3 = Color3.fromRGB(255, 0, 0)
local color4 = Color3.new(1, 0, 0)
如果有多个编写者一起编写代码,可能会出现混淆两种表示方式的情况。
在上面的例子中,我们使用的是第二种方式定义了一个 Color3 对象,但是在 Roact 的 createElement 函数中,我们却使用了第一种方式来设置 BackgroundColor3 属性。这就是导致颜色不起作用的原因。
我们需要将代码修改为下面这样:
function MyComponent:render()
return Roact.createElement("Frame", {
Size = UDim2.new(1, 0, 1, 0),
BackgroundColor3 = Color3.fromRGB(self.state.color.r * 255, self.state.color.g * 255, self.state.color.b * 255),
})
end
这里我们使用了 fromRGB 函数来创建了一个 Color3 对象,同时将 state 中的 color 对象的三个浮点数值乘以 255 来得到对应的整数值。这样就能确保代码中使用的颜色格式是一致的了。