Страница 1 из 1

Управление камерой в top down проекте.

СообщениеДобавлено: 08 дек 2018, 14:40
sergei201613
Хочу сделать перемещение камеры с помощью мыши(как в доте или симс).
Просто передвигать камеру с помощью значений mouse axis не получится потому, что нужен эффект прикрепления курсора к тому месту где был он в начале перетаскивания как в в этом видео - https://www.youtube.com/watch?v=LjRY86YT8UM.
Как это можно реализовать? (если можно, поподробнее)

Re: Управление камерой в top down проекте.

СообщениеДобавлено: 08 дек 2018, 16:59
Tolking
Просто передвигать камеру с помощью значений mouse axis...

Re: Управление камерой в top down проекте.

СообщениеДобавлено: 08 дек 2018, 18:26
lawson
Вот так?

Тут придется немного поработать с рейкастами и проекцией Plane.

Кидаете рейкаст с экрана на Plane получаете дистанцию и точку передвижения, дальше запоминаете ее, кидаете новый рейкаст и снова получаете точку. Берете длину между этими двумя точками и направление движения, и дальше применяете ее камере.

Re: Управление камерой в top down проекте.

СообщениеДобавлено: 08 дек 2018, 18:42
Tolking
Просто подобрать коэффициенты к перемещению по осям...

Re: Управление камерой в top down проекте.

СообщениеДобавлено: 12 дек 2018, 17:01
sergei201613
lawson писал(а):Вот так?

Тут придется немного поработать с рейкастами и проекцией Plane.

Кидаете рейкаст с экрана на Plane получаете дистанцию и точку передвижения, дальше запоминаете ее, кидаете новый рейкаст и снова получаете точку. Берете длину между этими двумя точками и направление движения, и дальше применяете ее камере.

Не могли бы вы показать пример кода? Так и не получилось реализовать это.

Re: Управление камерой в top down проекте.

СообщениеДобавлено: 13 дек 2018, 09:51
1max1
Костыли заказывали?


Синтаксис:
Используется csharp
using UnityEngine;
using System.Runtime.InteropServices;

class Move : MonoBehaviour
{
    [SerializeField] float speedMove;

    bool isMove;
    Camera _camera;
    Transform _transform;
    Vector3 world, delta;

    void Start()
    {
        _camera = GetComponent<Camera>();
        _transform = GetComponent<Transform>();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            var mp = Input.mousePosition;
            Ray ray = _camera.ScreenPointToRay(mp);
            if (Physics.Raycast(ray, out RaycastHit hit))
            {            
                Tools.GetCursorPos(out Point cp);
                delta.x = cp.x - mp.x;
                delta.y = cp.y - mp.y;
                world = hit.point;
                isMove = true;
            }
        }

        if (isMove)
        {
            float x = Input.GetAxis("Mouse X");
            float y = Input.GetAxis("Mouse Y");
            Vector3 move = new Vector3(x, 0.0f, y);
            Vector3 spPrev = _camera.WorldToScreenPoint(world);
            _transform.Translate(-move * speedMove, Space.World);
            Vector3 spNext = _camera.WorldToScreenPoint(world);
            delta.y += (spPrev.y - spNext.y) * 2.0f;
            spNext += delta;
            Tools.SetCursorPos((int)spNext.x, (int)spNext.y);
        }

        if (Input.GetMouseButtonUp(0))
        {
            isMove = false;
        }
    }
}

struct Point
{
    public int x;
    public int y;
}

static class Tools
{
    [DllImport("user32.dll")]
    public static extern bool SetCursorPos(int x, int y);

    [DllImport("user32.dll")]
    public static extern bool GetCursorPos(out Point point);
}


Это если сильно припекло сделать залипание курсора (был бы просто имейдж было бы проще раз в 10:D), а если не выделоваться то всё сводится к 4 строчкам))
Просто нужно будет speedMove подобрать.
Синтаксис:
Используется csharp
           
float x = Input.GetAxis("Mouse X");
float y = Input.GetAxis("Mouse Y");
Vector3 move = new Vector3(x, 0.0f, y);
_transform.Translate(-move * speedMove, Space.World);

Re: Управление камерой в top down проекте.

СообщениеДобавлено: 13 дек 2018, 11:01
lawson
Не могли бы вы показать пример кода? Так и не получилось реализовать это.

Этот способ нужен только если ваша камера вращается, и нужно чтобы расстояние передвижения увеличивалось или уменьшалось в зависимости от угла под которым смотрит камера.

Если у вашей камеры 0 - нулевое вращение и двигается в точку по направлению, а не по расстоянию, тогда можете спокойно использовать способ выше - через позицию мыши.