类似于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;
与其单独夹紧每个轴,我如何给它们一个总的最小值和最大值?
对于vector有一个类似的函数: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;
遗憾的是,没有与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);