将零件夹在边界内 (Roblox)

问题描述 投票:0回答:1

我正在为我的游戏制作一个构建系统,为此我需要制作一个夹紧功能。

此函数应将玩家鼠标的击中位置限制为鼠标跟随的部分保持在特定范围内(玩家的底板),这样它就不会在任何旋转中的任何一侧被剪掉。

我的问题是,我不知道如何执行此操作。我为自己准备了一些变量(例如零件和底板的 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 问题,如果需要,请向我询问更多上下文/信息)

lua roblox
1个回答
0
投票

我找到了一种更简单的方法来做到这一点。

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 方向相同/相反。 Example of X and Z axes of plate and part facing different directions

© www.soinside.com 2019 - 2024. All rights reserved.