如何限制精灵在 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 是一个非常简单的函数。它需要三个参数:valueminmax。如果该值小于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,您可以限制 xy 坐标的值:

//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) 范围内分别。您可以将这些变量创建为检查器变量,以便您可以即时更改它们。