如何限制精灵在 Unity 中可以移动的位置?
How to limit where a sprite can move in Unity?
我是 Unity 的新手,所以请耐心等待我到处寻找答案,但没有成功。
基本上,我使用 onMouseDrag 在背景周围移动具有 table 的教室 (1366x768) 的精灵。但是,我想限制精灵可以去的地方,这样它就不会离开屏幕或离开我背景上的 table。
我的 sprite 附有 2d box collider 和 rigidbody 组件(重力设置为零并且处于固定角度)。我认为通过在我想将精灵保留在其中的区域周围放置四个 2d 盒子碰撞器就足以包含它,但精灵只是直接穿过它们。
我也阅读了有关使用 Mathf.Clamp 来限制区域的内容,但我并没有真正理解如何使用我所看到的示例。
下面是我移动精灵的代码:
using UnityEngine;
using System.Collections;
public class MovementScript : MonoBehaviour {
float x;
float y;
void Update() {
x = Input.mousePosition.x;
y = Input.mousePosition.y;
}
public void OnMouseDrag() {
transform.position = Camera.main.ScreenToWorldPoint (new Vector3 (x, y, 1.0f));
}
}
如有任何帮助,我们将不胜感激!
使用对象移动对象 transform
与移动对象不同。
当您使用 transform
时,该对象不会 "move",它会每隔 Update
进行少量传送。不幸的是,Rigidbody
无法将这种位置变化检测为运动,因此不会对任何碰撞器做出反应。无论如何,这可能是更复杂的方法。使用 Clamp
肯定更容易。
Clamp
是一个非常简单的函数。它需要三个参数:value
、min
和 max
。如果该值小于min
或大于max
,它就是returns那个边界。否则,它 returns 值本身。
例如,
Mathf.Clamp(5, 1, 3); //returns 3
Mathf.Clamp(2, 1, 3); //returns 2
Mathf.Clamp(-2, 1, 3); //returns 1
这只是一个方便的函数,用于类似这样的事情:
if(val > max) {
return max;
} else if(val < min) {
return min;
} else {
return val;
}
因此使用 Clamp
,您可以限制 x
和 y
坐标的值:
//to avoid confusion, I'm referring to your x and y variables
//as inputX and inputY. they represent the mouse position.
public void OnMouseDrag() {
Vector3 pos = Vector3.zero;
pos.x = Mathf.Clamp(inputX, minX, maxX);
pos.y = Mathf.Clamp(inputY, minY, maxY);
pos.z = 1.0;
transform.position = Camera.main.ScreenToWorldPoint (pos);
}
Mathf.Clamp
将使您的 Transform 的 X 和 Y 坐标保持在 (minX
, maxX
) 和 (minY
, maxY
) 范围内分别。您可以将这些变量创建为检查器变量,以便您可以即时更改它们。
我是 Unity 的新手,所以请耐心等待我到处寻找答案,但没有成功。
基本上,我使用 onMouseDrag 在背景周围移动具有 table 的教室 (1366x768) 的精灵。但是,我想限制精灵可以去的地方,这样它就不会离开屏幕或离开我背景上的 table。
我的 sprite 附有 2d box collider 和 rigidbody 组件(重力设置为零并且处于固定角度)。我认为通过在我想将精灵保留在其中的区域周围放置四个 2d 盒子碰撞器就足以包含它,但精灵只是直接穿过它们。
我也阅读了有关使用 Mathf.Clamp 来限制区域的内容,但我并没有真正理解如何使用我所看到的示例。
下面是我移动精灵的代码:
using UnityEngine;
using System.Collections;
public class MovementScript : MonoBehaviour {
float x;
float y;
void Update() {
x = Input.mousePosition.x;
y = Input.mousePosition.y;
}
public void OnMouseDrag() {
transform.position = Camera.main.ScreenToWorldPoint (new Vector3 (x, y, 1.0f));
}
}
如有任何帮助,我们将不胜感激!
使用对象移动对象 transform
与移动对象不同。
当您使用 transform
时,该对象不会 "move",它会每隔 Update
进行少量传送。不幸的是,Rigidbody
无法将这种位置变化检测为运动,因此不会对任何碰撞器做出反应。无论如何,这可能是更复杂的方法。使用 Clamp
肯定更容易。
Clamp
是一个非常简单的函数。它需要三个参数:value
、min
和 max
。如果该值小于min
或大于max
,它就是returns那个边界。否则,它 returns 值本身。
例如,
Mathf.Clamp(5, 1, 3); //returns 3
Mathf.Clamp(2, 1, 3); //returns 2
Mathf.Clamp(-2, 1, 3); //returns 1
这只是一个方便的函数,用于类似这样的事情:
if(val > max) {
return max;
} else if(val < min) {
return min;
} else {
return val;
}
因此使用 Clamp
,您可以限制 x
和 y
坐标的值:
//to avoid confusion, I'm referring to your x and y variables
//as inputX and inputY. they represent the mouse position.
public void OnMouseDrag() {
Vector3 pos = Vector3.zero;
pos.x = Mathf.Clamp(inputX, minX, maxX);
pos.y = Mathf.Clamp(inputY, minY, maxY);
pos.z = 1.0;
transform.position = Camera.main.ScreenToWorldPoint (pos);
}
Mathf.Clamp
将使您的 Transform 的 X 和 Y 坐标保持在 (minX
, maxX
) 和 (minY
, maxY
) 范围内分别。您可以将这些变量创建为检查器变量,以便您可以即时更改它们。