Как работать с камерой на Android / pan and zoom в Unity

Поделиться
HTML-код
  • Опубликовано: 28 сен 2024
  • В этом видео я покажу, как на платформе Android менять масштаб камеры, а так же перемещаться не при помощи мыши, а при помощи экрана вашего девайса.
    / graphicaldesignua - мой патреон для поддержки)
    t.me/joinchat/... - телеграм канал
    unity.com/ru - ссылка на Unity

Комментарии • 76

  • @thebad7628
    @thebad7628 5 лет назад +4

    Спасибо огромное! Продолжай в том же духе :3

  • @nooneelse9406
    @nooneelse9406 3 года назад +5

    Как исправить дергания при забирании одного пальца?

    • @triceramops3280
      @triceramops3280 3 года назад +2

      уже поздно, но мож кому ещё пригодится, создаёшь булевую переменную, в стиле isZooming, ставишь false когда проверяешь mouseButtonDown, ставишь true когда проверяешь касание двух пальцев в touchCount, в проверке "GetMouseButton(0)" добавляешь && !isZooming

    • @nooneelse9406
      @nooneelse9406 3 года назад

      @@triceramops3280 спасибо

    • @lora6938
      @lora6938 3 года назад

      @@triceramops3280 вот бы увидеть это в виде скрипта а то я не понимаю 😞 А дёргание противное это да

    • @NoName-rv3vb
      @NoName-rv3vb 3 года назад +4

      @@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);
      }

    • @alexgames5232
      @alexgames5232 3 года назад

      @@NoName-rv3vb никогда в Update не используй Camera.main, потому что это равносильно -> GameObject.FindWithTag("MainCamera").GetComponent();
      Лучше закешировать в переменную в Awake и потом использовать. Например Camera cam=Camera.main. а потом пихать в Update переменную cam

  • @СергейЩетинин-щ2ш
    @СергейЩетинин-щ2ш 3 года назад +2

    Добрый день!
    Протестировал скрипт на смартфоне - при зумировании с неодновременным отпусканием пальцев камеру периодически "дергает". Изображение рывком смещается в сторону.
    Подскажи, как это можно исправить? Или это только у меня такая проблема?

    • @TFM2024
      @TFM2024 2 года назад

      Решил?

    • @TheRoket00
      @TheRoket00 2 года назад

      @@TFM2024 Умножайте значение на Time.delstatime()

    • @TheRoket00
      @TheRoket00 2 года назад

      transform.position += direction * Time.deltaTime;

  • @xVitOSx
    @xVitOSx 5 лет назад +2

    А не проще использовать scroll wiew? (Или как его там)

  • @4elowww742
    @4elowww742 3 года назад +1

    нету ссылки на скрипт, и переписывать не удобно потому что ты пишешь скрипт не с начала до конца а как то перебежками, на экране не видно весь код (

  • @ВоттакВот-г8б
    @ВоттакВот-г8б Год назад

    пока искал простой способ (как этот) как это реализовать (я новичок), наткнулся на пост, где чел в 2Д проекте делает тоже самое через тонну кода + raycast....
    автор топ!

  • @philippb8894
    @philippb8894 5 лет назад +1

    Расскажи когда-нибудь про создание скелетной 2д анимации и 2д ик прямо в unity, у них там в package manager как раз ассеты есть.

  • @lora6938
    @lora6938 3 года назад

    Пожалуйста подскажите как добавить плавности на всё в ваш код.?

  • @geniygames4620
    @geniygames4620 Год назад

    Как такое сделать в 3D с перспективной камерой?

  • @КириллТенишев
    @КириллТенишев 4 года назад

    Спасибо огромное, очень помогли

  • @distraw1753
    @distraw1753 2 года назад

    Спасибо, все понятно

  • @vingrig
    @vingrig 3 года назад

    Спасибо большое )

  • @darksidemods3134
    @darksidemods3134 5 лет назад

    Лайкос,а можеш побольше про мабильную тиматику

  • @wentghu137
    @wentghu137 4 года назад +1

    thank you

  • @СергейЗуборев-ч6э
    @СергейЗуборев-ч6э 3 года назад

    кто-нибудь знает решение проблемы: при зумировании камеры "съедаются" пиксели спрайтов (спрайт растровый, формат png) у изображения мультяшный контур чёрный и эта проблема очень ощутима, появляется рябь спрайта, при этом если задать параметр size камеры =1 изображение нормального качества. Сглаживание изображения портит его качество. В вектор из растра картинку насколько я знаю нельзя конвертировать.

    • @Ghost_gamedev
      @Ghost_gamedev 2 года назад

      Попробуй отключить у картинки в папке (не у самого спрайта, а его исходника) сглаживание. Делается это в инспекторе в строке "Filter mode". Поставь значение "Pont (no filter)"

  • @kuma4an
    @kuma4an 5 лет назад

    Можно спросить, а какая разница между vector 2 и vector 3, и когда ихнеобходимо юзать, понимаю, глупый вопрос.

    • @-unity-
      @-unity- 4 года назад +1

      Vector2 содержит в себе 2 координаты, поэтому он применяется для измерений на плоскости, а Vector3 имеет в себе уже 3 координаты, поэтому используется в пространстве.

    • @kuma4an
      @kuma4an 4 года назад

      Кирилл Лячин спасибо, а для чего его используют и как, если не сложно, напишите.

    • @-unity-
      @-unity- 4 года назад +2

      Про векторы хорошо говорит математика. Если ты уже забыл - имеет смысл повторить, а если и не знал - выучить. Если коротко, то вектор - это направленный отрезок. А чтобы понимать, куда он направлен, у него есть координаты. Допустим, вектор с координатами (2; 3) направлен из начала координат (0; 0) в точку (2; 3) на плоскости. Всё, направление задано. Аналогично и в пространстве, только там используется Vector3 с тремя координатами.
      С помощью векторов можно задавать не только направление, но и силу. Сила - это тоже векторная величина, потому что недостаточно сказать, что трактор тянет с такой-то силой. Важно ещё знать, КУДА он тянет. Вектором как раз можно выразить и направление, и величину силы. Чем длиннее вектор, который задаёт силу, тем эта сила больше.
      То есть мы видим, что векторы можно использовать и для направления, и для силы. Где ещё? Так как Vector2 - это пара чисел, а Vector3 - тройка чисел, то в векторе можно хранить просто точку. На плоскости или в пространстве. Допустим, мы ткнулись в экран. В какую-то точку. Мы её можем определить и положить в вектор: Vector2(x, y).
      Векторы можно складывать. Так как это отрезки, их можно нарисовать на бумаге так, что второй начинается в той точке, где заканчивается первый. И тогда образуется новый вектор, где начало первого, а конец - где конец второго. И этот новый вектор есть сумма векторов.
      Векторы можно и вычитать, и умножать на число. Это всё хорошо рассматривается в таком разделе математики, который называется векторная алгебра. Я тут уже не буду сильно распинаться, потому что можно всё найти поподробнее в интернете, причём с картинками и с алгоритмами вычислений.

    • @kuma4an
      @kuma4an 4 года назад

      Кирилл Лячин История тебя не забудет. Спасибо, а про векторы в матеше я знаю, просто думал, что в юнити они отличаются.

    • @-unity-
      @-unity- 4 года назад +2

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

  • @namestring9884
    @namestring9884 4 года назад

    What kind of game is this that looks like a hand-drawn pencil drawing

  • @karpa2895
    @karpa2895 5 лет назад

    Здравствуйте! А как сделать тоже самое только с прокрутков в бок?

    • @graphicaldesign2776
      @graphicaldesign2776  5 лет назад

      Пока непонятна задача

    • @fisashgames6704
      @fisashgames6704 3 года назад

      понимаю что отвечаю как дэбил через год, но просто ограничить прокрутку по y. только чтоб x остался тогда вбок будет

    • @karpa2895
      @karpa2895 3 года назад +1

      @@fisashgames6704 Та, я уже сам допёр, когда стал шарить хоть чуть больше в коде, хотя так я его и не выучил, я больше по графике)

  • @Filimon_enc
    @Filimon_enc 2 года назад

    пишет что нет референса

  • @Барбарис-р1ш
    @Барбарис-р1ш 4 года назад

    Merci

  • @bay-2363
    @bay-2363 5 лет назад

    А как перенести проект юнити на другой компьютер

    • @graphicaldesign2776
      @graphicaldesign2776  5 лет назад +1

      В идеале сархивировать весь проект, и просто открыть его на другом компе

    • @alexgames5232
      @alexgames5232 3 года назад

      с git hub работать умеешь? или вообще с любой системой контроля версий

  • @Donna-f6i8z
    @Donna-f6i8z 5 лет назад

    Странно, что так мало активности на канале

  • @eugenekrutoy1475
    @eugenekrutoy1475 3 года назад +1

    Когда отпускаешь один палец при зуме, резко перепрыгивает в сторону пальца

    • @TFM2024
      @TFM2024 2 года назад

      Решил?

  • @ivanivanov9872
    @ivanivanov9872 5 лет назад +1

    Фух, наконец-то пересмотрел все Ваши уроки) просто, доступно, актуально) радует, что отвечаете на вопросы в комментариях) спасибо, за Ваш труд) теперь, когда еще и андроид подъехал, цены Вам не будет) Желаю успеха и кучу подписчиков)

  • @nepochat
    @nepochat 5 лет назад +1

    Гайды по андроиду то что нужно

  • @dartrevan4842
    @dartrevan4842 4 года назад +1

    Друг, подскажи как ограничить в твоём скрипте перемещение камеры по X и Y ?

    • @graphicaldesign2776
      @graphicaldesign2776  4 года назад

      Один из вариантов, поставить какие-то пустышки, и указать что положение камеры не должно превышать эти пустышки.

    • @alexgames5232
      @alexgames5232 3 года назад

      @@graphicaldesign2776 Ну или использовать Mathf.Clamp

    • @katylife8576
      @katylife8576 10 месяцев назад

      Добавил переменные ограничения положения координат камеры:
      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);
      У меня ограничение работает так.

  • @manageradv6905
    @manageradv6905 2 года назад

    Дружище! Спасибо! Ты внес небольшой вклад в мою игру. Скоро публикация!

  • @fortochka5227
    @fortochka5227 3 года назад

    Спасибо, брат. Счастья тебе и здоровья

  • @gamet6841
    @gamet6841 4 года назад

    а как сделать в 3д?

  • @AlexandrPyslar
    @AlexandrPyslar 4 года назад

    Автор, подскажи пожалуйста, как инвертировать движение? Палец двигаю вправо, камера движется влево. А нужно палец вправо и камера вправо

    • @graphicaldesign2776
      @graphicaldesign2776  4 года назад

      смени положительное и отрицательно значение осей

    • @AlexandrPyslar
      @AlexandrPyslar 4 года назад

      @@graphicaldesign2776 direction.x *= -1f; ? Или Vector3 direction = Camera.main.ScreenToWorldPoint(Input.mousePosition) - touch; ?
      не срабатывает - камера улетает. Не совсем понял вас

    • @AlexandrPyslar
      @AlexandrPyslar 4 года назад

      @@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;
      }

    • @graphicaldesign2776
      @graphicaldesign2776  4 года назад

      а если ставить -speed

    • @AlexandrPyslar
      @AlexandrPyslar 4 года назад

      @@graphicaldesign2776 Camera.main.transform.position += direction * -1f;
      Камера улетает мгновенно в сторону. В коде из моего коммента направление правильное, но движения неадекватно плавные и не совсем корректные. В твоем примере из видео именно так как и надо)
      Vector3 direction = Camera.main.ScreenToWorldPoint(Input.mousePosition) - touch;
      transform.position += direction.normalized * speed * Time.deltaTime;

  • @bestia96
    @bestia96 4 года назад

    2019.3 не работает, direction всегда 0

    • @bestia96
      @bestia96 4 года назад

      Поправка: не работает для 3d, чтобы работало в 3d не нужно переводить координаты экрана в мировые

    • @graphicaldesign2776
      @graphicaldesign2776  4 года назад

      Грустно

    • @graphicaldesign2776
      @graphicaldesign2776  4 года назад

      Виталий без поправки. Это и не предназначалось на 3d

    • @Filimon_enc
      @Filimon_enc 2 года назад

      @@bestia96 а как тогда написать?

    • @bestia96
      @bestia96 2 года назад

      @@Filimon_enc собственно не переводить координаты экрана в мировые, как и писал год назад.
      А так я на анриал перешёл, в пекло юнити