我正在为我的游戏制作一个构建系统,为此我需要制作一个夹紧功能。
此函数应将玩家鼠标的击中位置限制为鼠标跟随的部分保持在特定范围内(玩家的底板),这样它就不会在任何旋转中的任何一侧被剪掉。
我的问题是,我不知道如何执行此操作。我为自己准备了一些变量(例如零件和底板的 Look- 和 RightVectors 及其负数),但我并不完全知道如何使用它们。
我在想:
获取相对于底板的撞击位置
沿 x 和 z 固定该位置,使最大值为 (baseplateSize-(partSize/2))
这可行,但前提是零件无法旋转,即使如此也只能在大多数侧面上工作。
我目前的进展:
function clamp(hit,obj:Model)
local part = obj.PrimaryPart
local partSize = part.Size/2
local partFront = part.CFrame.LookVector
local partBack = -partFront
local partRight = part.CFrame.RightVector
local partLeft = -partRight
local plateFront = platePart.CFrame.LookVector
local plateBack = -plateFront
local plateRight = platePart.CFrame.RightVector
local plateLeft = -plateRight
return CFrame.new()
end
(我真的不知道如何编写正确的 StackOverflow 问题,如果需要,请向我询问更多上下文/信息)
我找到了一种更简单的方法来做到这一点。
function clamp(obj:Model,cf:CFrame)
local part = obj.PrimaryPart
local partSize = part.Size/2
local plateSize = platePart.Size/2
local localCf = platePart.CFrame:ToObjectSpace(cf)
local _,ry,_ = cf:ToOrientation()
local Y = math.deg(ry)+180
if math.round(Y/90)%2 == 0 then
maxX = plateSize.X-partSize.X
maxZ = plateSize.Z-partSize.Z
else
maxX = plateSize.Z-partSize.Z
maxZ = plateSize.X-partSize.X
end
local x = math.clamp(localCf.X,-maxX,maxX)
local z = math.clamp(localCf.Z,-maxZ,maxZ)
local newCf = platePart.CFrame:ToWorldSpace(CFrame.new(x,0.5+partSize.Y,z)) * cf.Rotation
return newCf
end
在此脚本中,沿平面每个轴的最大位置取决于要夹紧的零件的哪个轴与板的朝向相同。