Как сделать перетаскивание по оси X и Z в Unity3D? - PullRequest
0 голосов
/ 31 августа 2018

Я пытался заставить Drag and Drop объектов в Unity 3D работать на мобильных устройствах. Мне бы хотелось, чтобы при перемещении по экрану объект перемещался по оси z, а при перемещении вверх или вниз по экрану объект будет перемещаться по оси z, а не по оси y. Это код, который у меня сейчас есть ...

public class MovementController : MonoBehaviour
{
Vector3 dist;
Vector3 startPos;
float posX;
float posZ;
float posY;
void OnMouseDown()
{
    startPos = transform.position;
    dist = Camera.main.WorldToScreenPoint(transform.position);
    posX = Input.mousePosition.x - dist.x;
    posY = Input.mousePosition.y - dist.y;
    posZ = Input.mousePosition.z - dist.z;
}

void OnMouseDrag()
{
    float disX = Input.mousePosition.x - posX;
    float disY = Input.mousePosition.y - posY;
    float disZ = Input.mousePosition.z - posZ;
    Vector3 lastPos = Camera.main.ScreenToWorldPoint(new Vector3(disX, disY, disZ));
    transform.position = new Vector3(lastPos.x, startPos.y, lastPos.z);

}
}

Однако из-за этого объект перемещается лишь незначительно по оси z, мне нужно подойти вправо к верхней части экрана, чтобы он немного сдвинулся. Есть ли лучший способ сделать это, так как я не могу найти способ изменить код, чтобы исправить эту проблему. Спасибо.

1 Ответ

0 голосов
/ 31 августа 2018

Вы немного перепутали назначение ваших переменных - они не содержали значений, которые описали их имена:)

используйте это для плоскости XY:

public class MovementController : MonoBehaviour
{
    Vector3 startPos;
    Vector3 dist;

    void OnMouseDown()
    {
        startPos = Camera.main.WorldToScreenPoint(transform.position);
        dist = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, startPos.z));
    }

    void OnMouseDrag()
    {
        Vector3 lastPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, startPos.z);
        transform.position = Camera.main.ScreenToWorldPoint(lastPos) + dist;
    }
}

или это, если вы предпочитаете плоскость XZ:

public class MovementController : MonoBehaviour
{
    Vector3 startPos;
    Vector3 dist;

    void OnMouseDown()
    {
        startPos = Camera.main.WorldToScreenPoint(transform.position);
        dist = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, startPos.y, Input.mousePosition.y));
    }

    void OnMouseDrag()
    {
        Vector3 lastPos = new Vector3(Input.mousePosition.x, startPos.y, Input.mousePosition.y);
        transform.position = Camera.main.ScreenToWorldPoint(lastPos) + dist;
    }
}

EDIT:

для контроля изменения позиции, измените:

transform.position = Camera.main.ScreenToWorldPoint(lastPos) + dist;

до:

Vector3 targetPos = Camera.main.ScreenToWorldPoint(lastPos) + dist;
Vector3 dir = targetPos - transform.position;
float dist = dir.magnitude;
Vector3.Normalize(dir);
// change 1.0f to something else if you want:
transform.position += new Vector3(dir.x * dist * 1.0f, dir.y * dist * 1.0f, dir.z * dist * 1.0f);

и если вы измените dir.z * dist * 1.0f на dir.z * dist * 2.0f, то вы будете двигаться вдвое больше в направлении Z.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...