类似于mathf.clamp函数

本文关键字:函数 clamp mathf 类似于 | 更新日期: 2023-09-27 18:02:53

我有一个vector2变量,其中向量。X和向量。Y已被限制,因此两者都只允许取值在0到4之间。显然,这让我在坐标2,2周围有一个二次空间来移动游戏对象。但我想要实现的是有一个圆形空间来移动游戏对象,这意味着我需要它来夹住vector.x+vector的值。y是0到4之间的一个总数值,但我似乎做不到。我应该用别的功能来代替clamp吗?

这是我现在拥有的:

Vector2 pos = rigidbody2D.transform.position;
pos.x = Mathf.Clamp (pos.x, 19.5f, 24);
pos.y = Mathf.Clamp (pos.y, 3.3f, 6);
rigidbody2D.transform.position = pos;

与其单独夹紧每个轴,我如何给它们一个总的最小值和最大值?

类似于mathf.clamp函数

对于vector有一个类似的函数:Vector2.ClampMagnitudeVector3.ClampMagnitude

你只能指定一个最大长度,所以你必须自己处理最小长度。最小值的问题是,如果向量的长度为0,函数将不知道该怎么做。矢量应该指向哪个方向才能达到最小长度?

限制输入为圆圈

如果你只想限制移动到一个圆,你不需要一个最小值。相反,将中心定义为(2,2),并将移动限制为2的半径。

Vector2 center = new Vector2(2f, 2f);
Vector2 moveBy = new Vector(4f, 7f); // set this to whatever your input is
moveBy = Vector2.ClampMagnitude(moveBy, 2f);
Vector2 newPosition = center + moveBy;

newPosition将位于以(2,2)为中心的半径为2的圆圈内

限制给定位置

如果要将给定位置夹紧到圆上,可以稍微修改上面的版本。这就像把物体拴在皮带上,当它离开圈时再把它拉回来。

Vector2 center = new Vector2(2f, 2f);
Vector2 position = new Vector2(6f, 5f); // outside your desired circle
Vector2 offset = position - center;
Vector2.ClampMagnitude(offset, 2f);
position = center + offset;

遗憾的是,没有与clamp功能相同的内置功能。但是如果你不想使用CLAMP函数,你可以使用 if 语句。

if(pos.x > 19.5f )
{
  //put logic here
}
if( pos.x < 24f)
{
  //put logic here
}
if(pos.y > 3.3f) 
{
      //put logic here
}
if( pos.y < 6f)
{
   //put logic here
}

你可以这样做。但在我看来,Mathf.Clamp()是限制统一值的最佳选择,如果条件不准确,则Mathf.Clamp() Function.

不是c#,但这里是我在libgdx项目中用于将触摸板旋钮限制在触摸板区域的代码片段:

    Vector2 maxPos = new Vector2(screenX, screenY);
    if (maxPos.dst(new Vector2(Settings.touchpadPositionX, Settings.touchpadPositionY)) > painter.getTouchpadSize())
    {
        maxPos.sub(Settings.touchpadPositionX,Settings.touchpadPositionY);
        maxPos.nor();
        maxPos.scl(painter.getTouchpadSize());
        maxPos.add(Settings.touchpadPositionX,Settings.touchpadPositionY);
    }
    painter.updateTouchpadPos((int)maxPos.x, (int)maxPos.y);