Ответ 1
Ты почти там.
Измените строку RequireComponent в вашем коде на:
[RequireComponent(typeof(BoxCollider2D))]
И добавьте компонент BoxCollider2D к объекту, к которому вы добавляете script. Я просто протестировал его, и он отлично работает.
Я искал объект, перетаскивающий script для Unity 2D. Я нашел хороший метод в Интернете, но, похоже, он работает только в Unity 3D. Это не очень хорошо для меня, поскольку я делаю 2D-игру, и она не сталкивается с "стенами" таким образом.
Я попытался переписать его на 2D, но я врезался в ошибки с помощью Vectors.
Я был бы очень рад, если бы вы могли помочь мне переписать его на 2D.
Вот код, который работает в 3D:
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(BoxCollider))]
public class Drag : MonoBehaviour {
private Vector3 screenPoint;
private Vector3 offset;
void OnMouseDown() {
offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
}
void OnMouseDrag()
{
Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
transform.position = curPosition;
}
}
Ты почти там.
Измените строку RequireComponent в вашем коде на:
[RequireComponent(typeof(BoxCollider2D))]
И добавьте компонент BoxCollider2D к объекту, к которому вы добавляете script. Я просто протестировал его, и он отлично работает.
Для тех, у кого проблемы с использованием этого кода, я удалил screenPoint
и заменил его на 10.0f
(это расстояние от объекта с камеры). Вы можете использовать любой флоат, который вам нужен. Теперь это работает. Также для объекта требуется BoxCollider
или CircleCollider
, чтобы его можно было перемещать. Поэтому нет смысла использовать [RequireComponent(typeof(BoxCollider2D))]
.
Последний код, который отлично подходит для меня, это:
using UnityEngine;
using System.Collections;
public class DragDrop : MonoBehaviour {
private Vector3 offset;
void OnMouseDown()
{
offset = gameObject.transform.position -
Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10.0f));
}
void OnMouseDrag()
{
Vector3 newPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10.0f);
transform.position = Camera.main.ScreenToWorldPoint(newPosition) + offset;
}
}