我有一个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;
不是单独夹紧每个轴,而是如何给它们提供总的最小值和最大值?
答案 0 :(得分:4)
向量有一个类似的功能:Vector2.ClampMagnitude
和Vector3.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);