Я делаю систему сборки для своей игры, для которой мне нужно сделать функцию зажима.
Эта функция должна фиксировать положение попадания мыши игрока, чтобы часть, следующая за мышью, оставалась в определенных границах (опорная пластина игрока), чтобы она не выходила за пределы какой-либо стороны при любом вращении.
Моя проблема в том, что я не знаю, как это выполнить. Я подготовил для себя несколько переменных (например, 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, при необходимости обратитесь ко мне за дополнительным контекстом/информацией)
@RyanLuu Могут ли DragDetectors обеспечивать постоянное обновление или игрокам придется постоянно их перетаскивать? Я стремлюсь к тому, чтобы объект перемещался туда, где находится мышь, в каждом кадре.





Я нашел более простой способ сделать это.
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
В этом сценарии максимальное положение вдоль каждой оси плоскости зависит от того, какая ось зажимаемой детали обращена в ту же сторону, что и пластина.
Если оси X различаются на 90°, это означает, что Z детали обращена в ту же/противоположную сторону, что и X пластины.
Рассматривали ли вы вместо этого использование Детекторы сопротивления ? Они по-прежнему достигают ваших целей и легко позволяют вам устанавливать ограничения по оси или движениям.