【问题标题】:Something similar to Mathf.Clamp-functions?类似于 Mathf.Clamp 函数的东西?
【发布时间】:2014-05-12 21:04:56
【问题描述】:

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

这是我目前拥有的:

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;

我怎样才能给它们一个总的最小值和最大值,而不是单独夹紧每个轴?

【问题讨论】:

    标签: c# unity3d 2d


    【解决方案1】:

    Vectors 也有类似的功能: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;
    

    【讨论】:

      【解决方案2】:

      不幸的是,没有与钳位功能相同的内置功能。但如果您不想使用 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() 函数那样准确。

      【讨论】:

        【解决方案3】:

        不是 C#,但这是我用来将触摸板旋钮限制在我的 libgdx 项目中的触摸板区域的 sn-p:

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

        【讨论】:

          猜你喜欢
          • 2020-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-17
          • 2011-04-18
          • 2011-10-03
          • 1970-01-01
          • 2013-01-26
          相关资源
          最近更新 更多