Как работать с камерой на Android / pan and zoom в Unity
HTML-код
- Опубликовано: 28 сен 2024
- В этом видео я покажу, как на платформе Android менять масштаб камеры, а так же перемещаться не при помощи мыши, а при помощи экрана вашего девайса.
/ graphicaldesignua - мой патреон для поддержки)
t.me/joinchat/... - телеграм канал
unity.com/ru - ссылка на Unity
Спасибо огромное! Продолжай в том же духе :3
Как исправить дергания при забирании одного пальца?
уже поздно, но мож кому ещё пригодится, создаёшь булевую переменную, в стиле isZooming, ставишь false когда проверяешь mouseButtonDown, ставишь true когда проверяешь касание двух пальцев в touchCount, в проверке "GetMouseButton(0)" добавляешь && !isZooming
@@triceramops3280 спасибо
@@triceramops3280 вот бы увидеть это в виде скрипта а то я не понимаю 😞 А дёргание противное это да
@@lora6938 Вот
Vector3 touch;
public float zoomMin = 2;
public float zoomMax = 5;
bool multiTouch ;
[SerializeField]
float leftLimit;
[SerializeField]
float rightLimit;
[SerializeField]
float bottomLimit;
[SerializeField]
float upperLimit;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
Vector3 camPos = transform.position;
if (Input.GetMouseButtonDown(0))
{
touch = Camera.main.ScreenToWorldPoint(Input.mousePosition);
multiTouch = false;
}
if (Input.touchCount == 2)
{
multiTouch = true;
Touch touchZero = Input.GetTouch(0);
Touch touchOne = Input.GetTouch(1);
Vector2 touchZeroLastPos = touchZero.position - touchZero.deltaPosition;
Vector2 touchOneLastPos = touchOne.position - touchOne.deltaPosition;
float distTouch = (touchZeroLastPos - touchOneLastPos).magnitude;
float currentDistTouch = (touchZero.position - touchOne.position).magnitude;
float difference = currentDistTouch - distTouch;
zoom(difference * 0.01f);
}
else if (Input.GetMouseButton(0) && multiTouch == false)
{
Vector3 direction = touch - Camera.main.ScreenToWorldPoint(Input.mousePosition);
Camera.main.transform.position += direction;
}
zoom(Input.GetAxis("Mouse ScrollWheel"));
transform.position = new Vector3
(
Mathf.Clamp(transform.position.x, leftLimit, rightLimit),
Mathf.Clamp(transform.position.y, bottomLimit, upperLimit),
transform.position.z
);
}
void zoom(float increment)
{
Camera.main.orthographicSize = Mathf.Clamp(Camera.main.orthographicSize - increment, zoomMin, zoomMax);
}
@@NoName-rv3vb никогда в Update не используй Camera.main, потому что это равносильно -> GameObject.FindWithTag("MainCamera").GetComponent();
Лучше закешировать в переменную в Awake и потом использовать. Например Camera cam=Camera.main. а потом пихать в Update переменную cam
Добрый день!
Протестировал скрипт на смартфоне - при зумировании с неодновременным отпусканием пальцев камеру периодически "дергает". Изображение рывком смещается в сторону.
Подскажи, как это можно исправить? Или это только у меня такая проблема?
Решил?
@@TFM2024 Умножайте значение на Time.delstatime()
transform.position += direction * Time.deltaTime;
А не проще использовать scroll wiew? (Или как его там)
нету ссылки на скрипт, и переписывать не удобно потому что ты пишешь скрипт не с начала до конца а как то перебежками, на экране не видно весь код (
пока искал простой способ (как этот) как это реализовать (я новичок), наткнулся на пост, где чел в 2Д проекте делает тоже самое через тонну кода + raycast....
автор топ!
Расскажи когда-нибудь про создание скелетной 2д анимации и 2д ик прямо в unity, у них там в package manager как раз ассеты есть.
Пожалуйста подскажите как добавить плавности на всё в ваш код.?
Как такое сделать в 3D с перспективной камерой?
Спасибо огромное, очень помогли
Спасибо, все понятно
Спасибо большое )
Лайкос,а можеш побольше про мабильную тиматику
thank you
кто-нибудь знает решение проблемы: при зумировании камеры "съедаются" пиксели спрайтов (спрайт растровый, формат png) у изображения мультяшный контур чёрный и эта проблема очень ощутима, появляется рябь спрайта, при этом если задать параметр size камеры =1 изображение нормального качества. Сглаживание изображения портит его качество. В вектор из растра картинку насколько я знаю нельзя конвертировать.
Попробуй отключить у картинки в папке (не у самого спрайта, а его исходника) сглаживание. Делается это в инспекторе в строке "Filter mode". Поставь значение "Pont (no filter)"
Можно спросить, а какая разница между vector 2 и vector 3, и когда ихнеобходимо юзать, понимаю, глупый вопрос.
Vector2 содержит в себе 2 координаты, поэтому он применяется для измерений на плоскости, а Vector3 имеет в себе уже 3 координаты, поэтому используется в пространстве.
Кирилл Лячин спасибо, а для чего его используют и как, если не сложно, напишите.
Про векторы хорошо говорит математика. Если ты уже забыл - имеет смысл повторить, а если и не знал - выучить. Если коротко, то вектор - это направленный отрезок. А чтобы понимать, куда он направлен, у него есть координаты. Допустим, вектор с координатами (2; 3) направлен из начала координат (0; 0) в точку (2; 3) на плоскости. Всё, направление задано. Аналогично и в пространстве, только там используется Vector3 с тремя координатами.
С помощью векторов можно задавать не только направление, но и силу. Сила - это тоже векторная величина, потому что недостаточно сказать, что трактор тянет с такой-то силой. Важно ещё знать, КУДА он тянет. Вектором как раз можно выразить и направление, и величину силы. Чем длиннее вектор, который задаёт силу, тем эта сила больше.
То есть мы видим, что векторы можно использовать и для направления, и для силы. Где ещё? Так как Vector2 - это пара чисел, а Vector3 - тройка чисел, то в векторе можно хранить просто точку. На плоскости или в пространстве. Допустим, мы ткнулись в экран. В какую-то точку. Мы её можем определить и положить в вектор: Vector2(x, y).
Векторы можно складывать. Так как это отрезки, их можно нарисовать на бумаге так, что второй начинается в той точке, где заканчивается первый. И тогда образуется новый вектор, где начало первого, а конец - где конец второго. И этот новый вектор есть сумма векторов.
Векторы можно и вычитать, и умножать на число. Это всё хорошо рассматривается в таком разделе математики, который называется векторная алгебра. Я тут уже не буду сильно распинаться, потому что можно всё найти поподробнее в интернете, причём с картинками и с алгоритмами вычислений.
Кирилл Лячин История тебя не забудет. Спасибо, а про векторы в матеше я знаю, просто думал, что в юнити они отличаются.
На здоровье. В игровом программировании не так много используется математики, как в каких-то других областях. Вот векторы - это повсеместная тема, которую желательно знать очень хорошо. Кватернионы знать необязательно, достаточно просто понимать, что они нужны для описания поворота тела в пространстве.
Ещё из математики для программирования игр обязательно нужно знать алгебру логики (она же Булева алгебра). Это для того, чтобы уметь грамотно составлять сложные условия (если, то, иначе) и выполнять побитовые преобразования внутри числа (но это уже редко встречается).
Ещё потребуются знания тригонометрии при расчёте траекторий. Нужно знать хотя бы на уровне понимания что такое синус, косинус и тангенс. И как они друг через друга выражаются.
Может быть ещё пригодится теория множеств, теория графов, теория вероятности, матрицы... Но это уже достаточно узкие области, не каждому человеку придётся с ними работать.
What kind of game is this that looks like a hand-drawn pencil drawing
Здравствуйте! А как сделать тоже самое только с прокрутков в бок?
Пока непонятна задача
понимаю что отвечаю как дэбил через год, но просто ограничить прокрутку по y. только чтоб x остался тогда вбок будет
@@fisashgames6704 Та, я уже сам допёр, когда стал шарить хоть чуть больше в коде, хотя так я его и не выучил, я больше по графике)
пишет что нет референса
Merci
А как перенести проект юнити на другой компьютер
В идеале сархивировать весь проект, и просто открыть его на другом компе
с git hub работать умеешь? или вообще с любой системой контроля версий
Странно, что так мало активности на канале
Когда отпускаешь один палец при зуме, резко перепрыгивает в сторону пальца
Решил?
Фух, наконец-то пересмотрел все Ваши уроки) просто, доступно, актуально) радует, что отвечаете на вопросы в комментариях) спасибо, за Ваш труд) теперь, когда еще и андроид подъехал, цены Вам не будет) Желаю успеха и кучу подписчиков)
Спасибо)
Гайды по андроиду то что нужно
Друг, подскажи как ограничить в твоём скрипте перемещение камеры по X и Y ?
Один из вариантов, поставить какие-то пустышки, и указать что положение камеры не должно превышать эти пустышки.
@@graphicaldesign2776 Ну или использовать Mathf.Clamp
Добавил переменные ограничения положения координат камеры:
public float cameraXMin = 7;
public float cameraXMax = 24;
public float cameraYMin = 3;
public float cameraYMax = 17;
И в последнем методе после вычисления положения камеры воспользовался Mathf.Clamp:
Camera.main.transform.position += direction;
Camera.main.transform.position = new Vector3 (Mathf.Clamp(Camera.main.transform.position.x, cameraXMin, cameraXMax), Mathf.Clamp(Camera.main.transform.position.y, cameraYMin, cameraYMax), Camera.main.transform.position.z);
У меня ограничение работает так.
Дружище! Спасибо! Ты внес небольшой вклад в мою игру. Скоро публикация!
Спасибо, брат. Счастья тебе и здоровья
а как сделать в 3д?
В 3д там вместо size пишешь fieldOfView
Автор, подскажи пожалуйста, как инвертировать движение? Палец двигаю вправо, камера движется влево. А нужно палец вправо и камера вправо
смени положительное и отрицательно значение осей
@@graphicaldesign2776 direction.x *= -1f; ? Или Vector3 direction = Camera.main.ScreenToWorldPoint(Input.mousePosition) - touch; ?
не срабатывает - камера улетает. Не совсем понял вас
@@graphicaldesign2776 это лучшее решение для моей задачи, что я нашел, но никак не получается инвертировать( Пробовал вот так, но фигня выходит
if (Input.GetMouseButtonDown(0))
{
touch = Camera.main.ScreenToWorldPoint(Input.mousePosition);
}
if (Input.GetMouseButton(0))
{
Vector3 direction = Camera.main.ScreenToWorldPoint(Input.mousePosition) - touch;
transform.position += direction.normalized * speed * Time.deltaTime;
}
а если ставить -speed
@@graphicaldesign2776 Camera.main.transform.position += direction * -1f;
Камера улетает мгновенно в сторону. В коде из моего коммента направление правильное, но движения неадекватно плавные и не совсем корректные. В твоем примере из видео именно так как и надо)
Vector3 direction = Camera.main.ScreenToWorldPoint(Input.mousePosition) - touch;
transform.position += direction.normalized * speed * Time.deltaTime;
2019.3 не работает, direction всегда 0
Поправка: не работает для 3d, чтобы работало в 3d не нужно переводить координаты экрана в мировые
Грустно
Виталий без поправки. Это и не предназначалось на 3d
@@bestia96 а как тогда написать?
@@Filimon_enc собственно не переводить координаты экрана в мировые, как и писал год назад.
А так я на анриал перешёл, в пекло юнити