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

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

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

Сообщение sergei201613 08 дек 2018, 14:40

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

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

Сообщение Tolking 08 дек 2018, 16:59

Просто передвигать камеру с помощью значений mouse axis...
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2714
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

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

Сообщение lawson 08 дек 2018, 18:26

Вот так?

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

Кидаете рейкаст с экрана на Plane получаете дистанцию и точку передвижения, дальше запоминаете ее, кидаете новый рейкаст и снова получаете точку. Берете длину между этими двумя точками и направление движения, и дальше применяете ее камере.
lawson
UNIверсал
 
Сообщения: 481
Зарегистрирован: 14 сен 2012, 21:20

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

Сообщение Tolking 08 дек 2018, 18:42

Просто подобрать коэффициенты к перемещению по осям...
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2714
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

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

Сообщение sergei201613 12 дек 2018, 17:01

lawson писал(а):Вот так?

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

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

Не могли бы вы показать пример кода? Так и не получилось реализовать это.
sergei201613
UNец
 
Сообщения: 12
Зарегистрирован: 04 апр 2017, 04:52

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

Сообщение 1max1 13 дек 2018, 09:51

Костыли заказывали?


Синтаксис:
Используется 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);
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

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

Сообщение lawson 13 дек 2018, 11:01

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

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

Если у вашей камеры 0 - нулевое вращение и двигается в точку по направлению, а не по расстоянию, тогда можете спокойно использовать способ выше - через позицию мыши.
lawson
UNIверсал
 
Сообщения: 481
Зарегистрирован: 14 сен 2012, 21:20


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: GoGo.Ru [Bot] и гости: 21