gpt4 book ai didi

c# - unity 3D mathf.clamp 到多个区域

转载 作者:太空宇宙 更新时间:2023-11-03 15:07:23 30 4
gpt4 key购买 nike

我正在构建一个只能转到某些固定区域的旋钮..现在我正在为这些区域之一使用数学钳:

float clampedAngle = Mathf.Clamp(angle, -250f, 0f);

我希望它适用于多个区域,如下所示:

clampedAngle = Mathf.Clamp(angle, -250f, -230f);
clampedAngle = Mathf.Clamp(angle, -100f, -45f);
clampedAngle = Mathf.Clamp(angle, -30f, 0f);

不幸的是,上面的代码不起作用,因为它会钳制到最后一个值。如何将一个值限制在多个有效区域?

最佳答案

这个问题的棘手部分是确定要限制在哪个范围内。一种方法是找到与该值最近的最小/最大边界,然后根据相应的范围进行限制。

假设您的范围表示为值对数组(双值数组),我们可以将它们连接在一起并通过采用 this answer 中的方法找到最近的最小/最大值。 .然后,很容易向后工作以确定最小值/最大值的范围,并相应地进行限制:

// Clamps given value to nearest of given min/max pairs
private float ClampToNearestRange(float value, float[][] ranges)
{
// First, let's flatten the values into a single list
List<float> flattenedRanges = ranges.SelectMany(item => item).ToList();

// Now, we'll find the closest value in the list, and then get its index
float nearestValue = flattenedRanges.Aggregate((x,y) => Mathf.Abs(x-value) < Mathf.Abs(y-value) ? x : y);
int valueIndex = flattenedRanges.IndexOf(nearestValue);

// With the value index, we can deduce the corresponding range index
int rangeIndex = (valueIndex % 2 == 0) ? valueIndex / 2 : (valueIndex - 1) / 2;

// Finally, we'll clamp according to the range we selected
return Mathf.Clamp(value, ranges[rangeIndex][0], ranges[rangeIndex][1]);
}

然后您将使用如下方法:

// First, declaring your ranges somewhere in your class
float[] range1 = new float[]{0, 60};
float[] range2 = new float[]{80, 100};
float[] range3 = new float[]{150, 200};
float[][] ranges;

Start ()
{
ranges = new float[][]{range1, range2, range3};
float clampedAngle1 = ClampToNearestRange(120, ranges); // returns 100
float clampedAngle2 = ClampToNearestRange(126, ranges); // returns 150
float clampedAngle3 = ClampToNearestRange(170, ranges); // returns 170
}

注意:这确实使用了 LINQ,这意味着如果您需要经常这样做,您可能希望将逻辑扩展到对 Unity 更友好的循环中。不会那么简洁,但它可能会影响您的游戏性能。

希望对您有所帮助!如果您有任何问题,请告诉我。

关于c# - unity 3D mathf.clamp 到多个区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42736460/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com