Зажмите деталь в пределах границ (Roblox)

Я делаю систему сборки для своей игры, для которой мне нужно сделать функцию зажима.

Эта функция должна фиксировать положение попадания мыши игрока, чтобы часть, следующая за мышью, оставалась в определенных границах (опорная пластина игрока), чтобы она не выходила за пределы какой-либо стороны при любом вращении.

Моя проблема в том, что я не знаю, как это выполнить. Я подготовил для себя несколько переменных (например, Look- и RightVectors детали и опорной плиты и их негативы), но я точно не знаю, как их использовать.

Я думаю о:

  1. получение позиции попадания относительно опорной плиты

  2. фиксируя это положение вдоль 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 обеспечивать постоянное обновление или игрокам придется постоянно их перетаскивать? Я стремлюсь к тому, чтобы объект перемещался туда, где находится мышь, в каждом кадре.

rver 18.06.2024 22:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
2
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел более простой способ сделать это.

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 пластины.

Другие вопросы по теме