首页 > 解决方案 > 如何在 Roblox Studio 中检查 vector3 值是否在 region3 值中?

问题描述

我正在使用建筑系统制作游戏。我试图通过在一个人的帐篷周围创建一个区域来为我的游戏添加土地所有权。问题是我不知道如何检查另一个玩家是否在另一个玩家的土地上放置了一些东西。有人有答案吗?

标签: roblox

解决方案


Vector3本质上只是一个带有 X、Y 和 Z 分量的坐标。这里的假设是它的原点在 (0, 0, 0)。

Region3是一个轴对齐的边界框,它是基于最小的 Vector3 坐标和最大的 Vector3 坐标构建的。

如果 Vector3 的大小大于最小坐标且小于最大坐标,则可以认为 Vector3 在 Region3 内。

由于 Region3 为您提供区域的中心作为其 CFrame 属性,因此您可以使用其大小除以一半来计算 Region3 的范围,然后检查 Vector3 是否落在该区域内。

local function isVect3InRegion3(vector, region)
    -- validate input
    assert(typeof(vector) == "Vector3")
    assert(typeof(region) == "Region3")

    -- get the dimensions of the region
    local regionCenter = region.CFrame.Position
    local regionHalfSize = region.Size * 0.5

    -- calculate the extents of the region
    local lowerLeftCorner = regionCenter - regionHalfSize
    local upperRightCorner = regionCenter + regionHalfSize

    -- check if the vector is inside the extents
    local isBeyondLeftCorner = (vector.X >= lowerLeftCorner.X) and
        (vector.Y >= lowerLeftCorner.Y) and
        (vector.Z >= lowerLeftCorner.Z)
    local isBeforeRightCorner = (vector.X <= upperRightCorner.X) and
        (vector.Y <= upperRightCorner.Y) and
        (vector.Z <= upperRightCorner.Z)

    return isBeyondLeftCorner and isBeforeRightCorner

    -- NOTE : comparing individual values above is less expensive than
    -- return vector.Magnitude >= lowerLeftCorner.Magnitude and
    --     vector.Magnitude <= upperRightCorner.Magnitude
end

推荐阅读