类似于Mathf.Clamp函数的东西?

时间:2014-05-12 21:04:56

标签: c# unity3d 2d

我有一个Vector2变量,其中vector.x和vector.y已被钳制,因此两者都只允许介于0和4之间的值。显然,这使我在坐标2,2周围有一个二次空间移动一个游戏对象。 但我想要实现的是有一个圆形空间来移动游戏对象,这意味着我需要它来将vector.x + vector.y的值钳制为0到4之间的总值,但我可以'似乎使它工作。我应该使用另一种功能而不是钳位吗?

这就是我现在所拥有的:

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;

不是单独夹紧每个轴,而是如何给它们提供总的最小值和最大值?

3 个答案:

答案 0 :(得分:4)

向量有一个类似的功能: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;

答案 1 :(得分:0)

不幸的是,没有内置功能可用于钳位功能。但如果您不想使用 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()功能。

答案 2 :(得分:0)

不是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);