Некое подобие тачпада

Программирование для iPhone & Android

Некое подобие тачпада

Сообщение Febz 07 май 2017, 15:57

Есть скрипт перемещения 2D объекта в точку тапа по экрану

Синтаксис:
Используется csharp
if (Input.touchCount > 0)
{
        screenToWorldVector = Camera.main.ScreenToWorldPoint(new Vector2(Input.mousePosition.x,Input.mousePosition.y));
        float touchX = Mathf.SmoothDamp(transform.position.x, screenToWorldVector.x, ref xVel, speed);
        float touchY = Mathf.SmoothDamp(transform.position.y, screenToWorldVector.y, ref yVel, speed);
        transform.position = new Vector2(touchX, touchY);
}


Как сделать так,чтобы координаты точки тапа брались не с камеры, а только внутри определенной области, к примеру с небольшого canvas'а в углу и проецировались на весь экран: щелкнул в левом верхнем углу кэнваса - объект переместился в левый верхний угол камеры, и т.д ?
Febz
UNец
 
Сообщения: 32
Зарегистрирован: 20 дек 2014, 18:02

Re: Некое подобие тачпада

Сообщение samana 07 май 2017, 16:21

Здесь должна помочь простая математика. Сначала определите насколько соотношение миниКанваса меньше сторон экрана с помощью

float w = ширинаЭкрана / ширинаМиниКанваса
float h = вышинаЭкрана / вышинаМиниКанваса

Затем ловите координаты тача в миниКанвасе, например это будет (х: 30 у:10), умножайте каждую сторону на полученный раннее результат и это будет положение относительно всего экрана

obj.position = new Vector(30*w, 10*h);

как-то так.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Некое подобие тачпада

Сообщение Febz 07 май 2017, 20:12

Затем ловите координаты тача в миниКанвасе

В этом то и загвоздка - никак не могу найти что-нибудь типа ScreenToWorldPoint только НЕ для камеры..
Febz
UNец
 
Сообщения: 32
Зарегистрирован: 20 дек 2014, 18:02

Re: Некое подобие тачпада

Сообщение samana 08 май 2017, 19:07

Создайте канвас. В нём создайте Image, это будет ваш мини экран. Размеры Image могут быть любыми, но pivot (начало координат) должны быть в левом нижнем углу, поэтому в инспекторе этого Image установите pivot-ы в нули.
Далее примерно такой скрипт:
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.UI;

public class NewBehaviourScript : MonoBehaviour
{
    public Image miniScreen; //миниЭкран, сюда перетащите Image из канваса

    private Vector2 _screenRatio;// отношение миниЭкрана к обзему экрану игры  
    private Vector2 _miniMapPointToWorld; // сюда записывается точно в мире, спроецированная из мириЭкрана

    private void Start()
    {
        // узнаём насколько общий экран больше чем миниЭкран
        _screenRatio.x = Screen.width / miniScreen.rectTransform.rect.width;
        _screenRatio.y = Screen.height / miniScreen.rectTransform.rect.height;
    }

    private void Update()
    {
        // при нажатии левой кнопки мыши
        if (Input.GetMouseButtonDown(0))
        {
            // узнаём - попал ли курсор в область миниЭкрана
            Vector2 localPoint;
            RectTransformUtility.ScreenPointToLocalPointInRectangle(miniScreen.rectTransform, Input.mousePosition, null, out localPoint);
            if (miniScreen.rectTransform.rect.Contains(localPoint))
            {
                // и если курсор в миниЭкране, то проецируем локальную точку миниЭкрана в общий экран игры.
                _miniMapPointToWorld = Camera.main.ScreenToWorldPoint(new Vector3(localPoint.x * _screenRatio.x, localPoint.y * _screenRatio.y, 10));
            }
        }
        // двигаем объект в полученную точку.
        transform.position = Vector3.Lerp(transform.position, _miniMapPointToWorld, 0.1f);
    }

}


После этого, объект будет перемещаться по условию
Febz писал(а):Как сделать так,чтобы координаты точки тапа брались не с камеры, а только внутри определенной области, к примеру с небольшого canvas'а в углу и проецировались на весь экран: щелкнул в левом верхнем углу кэнваса - объект переместился в левый верхний угол камеры


Конечно возможно что-то не сработает, какая задача индивидуальна.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Некое подобие тачпада

Сообщение Febz 20 май 2017, 22:44

Я, конечно, понимаю, что поздноватенько, но все равно спасибо за столь развернутый ответ и полностью рабочий код)

Но теперь застрял на следующем шаге..
Чтобы геймплей не отличался на разных по размеру экранах, игровую зону (где может перемещаться игрок и где происходит весь геймплей) нужно сделать фиксированной ширины и повесить её по центру камеры, чтобы на более широких девайсах она оставалась всегда по центру и всегда одинакового размера.

Для этого я:
- создал еще один image "gameplay_area" (в его пределах будет перемещаться игрок)
- расчитал отношение размеров этого image'а к миниэкрану:
Синтаксис:
Используется csharp
       
             _screenRatio.x = gameplay_area.rectTransform.rect.width / miniScreen.rectTransform.rect.width;
             _screenRatio.y =  gameplay_area.rectTransform.rect.height / miniScreen.rectTransform.rect.height;
 

- ииии теперь, по идеи, нужно проецировать локальную точку миниэкрана не на камеру, а на gameplay_area, но я окончательно запутался с ScreenPointToLocalPointInRectangle... КАААК преобразовать координаты точки одного Image'a на другой?
Febz
UNец
 
Сообщения: 32
Зарегистрирован: 20 дек 2014, 18:02


Вернуться в iPhone & Android

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2