Zoom в Unity

Программирование на Юнити.

Zoom в Unity

Сообщение Merfik933 01 фев 2022, 10:41

Я написал метод zoom'а пальцами в Update. Но он не работал. Я провал что то менять но у меня не получилось. Проверьте пожалуйста этот код на наличие ошибок.
Синтаксис:
Используется csharp
[Header("Zoom")]
    private float TwoTouchOldDist;
    private float TwoTouchNewDist;
    private float OldAndNewTouchDistDelta;
    private float ZoomMoveSpeed;
    public float ZoomSpeed = 1;
void Update()
    {
        if (Input.touchCount == 2)
        {
            if(Input.GetTouch(1).phase  == TouchPhase.Began)
            {
                TwoTouchOldDist = Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
            }

            if(Input.GetTouch(1).phase == TouchPhase.Moved)
            {
                TwoTouchNewDist = Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
                OldAndNewTouchDistDelta = TwoTouchNewDist - TwoTouchOldDist;
                TwoTouchOldDist = TwoTouchNewDist;
                ZoomMoveSpeed = cameraTransform.position.z + (OldAndNewTouchDistDelta * ZoomSpeed);
                cameraTransform.localPosition = new Vector3(0, 0, Mathf.Clamp(ZoomMoveSpeed, distanceMin, distanceMax));
            }
        }
    }
Аватара пользователя
Merfik933
UNец
 
Сообщения: 35
Зарегистрирован: 30 сен 2021, 16:10
Откуда: Украина

Re: Zoom в Unity

Сообщение Alkos26Rus 01 фев 2022, 11:03

Возможно distanceMin, distanceMax низкие значения, проверь без клампа
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Zoom в Unity

Сообщение Merfik933 01 фев 2022, 14:30

Alkos26Rus писал(а):Возможно distanceMin, distanceMax низкие значения, проверь без клампа

Проверил, не работает
Аватара пользователя
Merfik933
UNец
 
Сообщения: 35
Зарегистрирован: 30 сен 2021, 16:10
Откуда: Украина

Re: Zoom в Unity

Сообщение Alkos26Rus 01 фев 2022, 17:58

Merfik933 писал(а):
Alkos26Rus писал(а):Возможно distanceMin, distanceMax низкие значения, проверь без клампа

Проверил, не работает

Как именно проверял без клампа? Вобще код выглядит рабочим, это твой код или взял откуда? Потуму как если взял, то код скорей всего рабочий, просто ты не правильно прикрутил его, может не туда повесил, может в инспекторе что то не так сделал. Для полной картины кинь скрины всех настроек в инспекторе.
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Zoom в Unity

Сообщение Merfik933 01 фев 2022, 23:43

Alkos26Rus писал(а):
Merfik933 писал(а):
Alkos26Rus писал(а):Возможно distanceMin, distanceMax низкие значения, проверь без клампа

Проверил, не работает

Как именно проверял без клампа? Вобще код выглядит рабочим, это твой код или взял откуда? Потуму как если взял, то код скорей всего рабочий, просто ты не правильно прикрутил его, может не туда повесил, может в инспекторе что то не так сделал. Для полной картины кинь скрины всех настроек в инспекторе.

Скажите пожалуйста как отправить скриншот? Потому что когда я нажимаю Img требует вставить ссылку
Аватара пользователя
Merfik933
UNец
 
Сообщения: 35
Зарегистрирован: 30 сен 2021, 16:10
Откуда: Украина

Re: Zoom в Unity

Сообщение Alkos26Rus 02 фев 2022, 10:27

Merfik933 писал(а):
Alkos26Rus писал(а):
Merfik933 писал(а):
Alkos26Rus писал(а):Возможно distanceMin, distanceMax низкие значения, проверь без клампа

Проверил, не работает

Как именно проверял без клампа? Вобще код выглядит рабочим, это твой код или взял откуда? Потуму как если взял, то код скорей всего рабочий, просто ты не правильно прикрутил его, может не туда повесил, может в инспекторе что то не так сделал. Для полной картины кинь скрины всех настроек в инспекторе.

Скажите пожалуйста как отправить скриншот? Потому что когда я нажимаю Img требует вставить ссылку

Нужно загрузить картинку используя какой нибудь сервис, я ползуюсь https://imgbox.com/ или https://clip2net.com/
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Zoom в Unity

Сообщение Merfik933 03 фев 2022, 13:34

Alkos26Rus писал(а):
Merfik933 писал(а):
Alkos26Rus писал(а):Возможно distanceMin, distanceMax низкие значения, проверь без клампа

Проверил, не работает

Как именно проверял без клампа? Вобще код выглядит рабочим, это твой код или взял откуда? Потуму как если взял, то код скорей всего рабочий, просто ты не правильно прикрутил его, может не туда повесил, может в инспекторе что то не так сделал. Для полной картины кинь скрины всех настроек в инспекторе.

1.Весь скрипт:
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;

[RequireComponent(typeof(Image))]
public class CameraRotator : UIBehaviour, IDragHandler
{
    public Transform cameraTransform;
    public Transform target;
    [Header("Position")]
    public float distanceMin = 10;
    public float distanceMax = 30;
    public float yOffset;
    public float scrollSensitivityPC = 1000;
    public float scrollSensitivity = 1;
    public float scrollSmoothing = 10;
    [Header("Rotation")]
    public float tiltMin = -85;
    public float tiltMax = 85;
    public float rotationSensitivity = 0.5f;
    public float rotationSpeed = 20;

    [Header("Zoom")]
    private float TwoTouchOldDist;
    private float TwoTouchNewDist;
    private float OldAndNewTouchDistDelta;
    private float ZoomMoveSpeed;
    public float ZoomSpeed = 1;

    private float distance;
    private float scrollDistance;
    private float velocity;
    private float lookAngle = 45;
    private float tiltAngle;
    private Quaternion rotation;

   

    protected override void Awake()
    {
        base.Awake();
        tiltAngle = 30;
        distance = scrollDistance = (distanceMax + distanceMin) / 2;

        if (cameraTransform == null || target == null) return;

        cameraTransform.rotation = rotation = Quaternion.Euler(tiltAngle, lookAngle, 0);
        cameraTransform.position = CalculateCameraPosition();
    }
    public void ChangeTarget(Transform Island)
    {
        target = Island;
        base.Awake();
        tiltAngle = 30;
        distance = scrollDistance = (distanceMax + distanceMin) / 2;

        if (cameraTransform == null || target == null) return;

        cameraTransform.rotation = rotation = Quaternion.Euler(tiltAngle, lookAngle, 0);
        cameraTransform.position = CalculateCameraPosition();
    }

    void Update()
    {
        if (Input.touchCount == 2)
        {
            if(Input.GetTouch(1).phase  == TouchPhase.Began)
            {
                TwoTouchOldDist = Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
            }

            if(Input.GetTouch(1).phase == TouchPhase.Moved)
            {
                TwoTouchNewDist = Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
                OldAndNewTouchDistDelta = TwoTouchNewDist - TwoTouchOldDist;
                TwoTouchOldDist = TwoTouchNewDist;
                ZoomMoveSpeed = cameraTransform.position.z + (OldAndNewTouchDistDelta * ZoomSpeed);
                cameraTransform.localPosition = new Vector3(0, 0, Mathf.Clamp(ZoomMoveSpeed, distanceMin, distanceMax));
            }
        }
    }

    private void LateUpdate()
    {
        if (cameraTransform == null || target == null) return;

        if (cameraTransform.rotation != rotation)
        {
            cameraTransform.rotation = Quaternion.Lerp(cameraTransform.rotation, rotation,
                Time.deltaTime * rotationSpeed);
        }

        float scroll = Input.GetAxis("Mouse ScrollWheel");
        if (scroll != 0)
        {
            scrollDistance -= scroll * Time.deltaTime * scrollSensitivityPC;
            scrollDistance = Mathf.Clamp(scrollDistance, distanceMin, distanceMax);
        }

        if (distance != scrollDistance)
        {
            distance = Mathf.SmoothDamp(distance, scrollDistance, ref velocity, Time.deltaTime * scrollSmoothing);
        }

        cameraTransform.position = CalculateCameraPosition();
    }

    public void OnDrag(PointerEventData eventData)
    {
        if (Input.touchCount < 2)
        {
            if (cameraTransform == null || target == null) return;

            lookAngle += eventData.delta.x * rotationSensitivity;
            tiltAngle -= eventData.delta.y * rotationSensitivity;
            tiltAngle = Mathf.Clamp(tiltAngle, tiltMin, tiltMax);
            rotation = Quaternion.Euler(tiltAngle, lookAngle, 0);
        }
    }

    private Vector3 CalculateCameraPosition()
    {
        return target.position + cameraTransform.rotation * (Vector3.back * distance) + Vector3.up * yOffset;
    }

}

Описание:
'Этот скрипт висит я взял в интернете и переделал под себя. Он пальцами или мышкой вращает камеру вокруг цели, делает зуум мышкой, и меняет цель при необходимости. Он висит не на canvas'е а на дочернем пустом объекте который растянут на весь canvas (Я так сделал потому что по другому не получалось). Я бы сам, возможно, нашел бы ошибку, но не могу тестить сразу на телефоне, приходиться каждый раз делать билд...
2. скрины (Sensor это тот пустой объект)
canvas (Там снизу где немного обрезано написано "Blocking Mask - Everything"):
https://imgbox.com/2IvZ5SxM
camera:
https://imgbox.com/7xfEF5sv
https://imgbox.com/NQfRHhTP
sensor(на нем скрипт):
https://imgbox.com/9ajHYPtY
https://imgbox.com/myAjl83E
Я кинул ссылки а не изображения, потомучто при предосмотре писало "Неудалось определить размеры изображений"...
Аватара пользователя
Merfik933
UNец
 
Сообщения: 35
Зарегистрирован: 30 сен 2021, 16:10
Откуда: Украина

Re: Zoom в Unity

Сообщение Alkos26Rus 03 фев 2022, 13:49

Во первых, зачем камеру засовывать в канвас, что это за извращение такое? Это же 3д игра? Тогда камера это обычный 3д объект на сцене в мировых координадах. Во вторых у тебя в LateUpdate у камеры назначается позиция cameraTransform.position = CalculateCameraPosition(); Поэтому ей все равно что ты там делаешь в Update, позиция все равно назначится в LateUpdate
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Zoom в Unity

Сообщение Merfik933 03 фев 2022, 15:25

Alkos26Rus писал(а):Во первых, зачем камеру засовывать в канвас, что это за извращение такое? Это же 3д игра? Тогда камера это обычный 3д объект на сцене в мировых координадах. Во вторых у тебя в LateUpdate у камеры назначается позиция cameraTransform.position = CalculateCameraPosition(); Поэтому ей все равно что ты там делаешь в Update, позиция все равно назначится в LateUpdate

я понял... спасибо большое. Попробую как-то переделать...
P.s. У меня камера не в cavas'е, а просто в иерархи, не знаю с чего ты это взял (может я что-то не понятно объяснил), но буду знать что засовывать ее туда не нужно:)
Аватара пользователя
Merfik933
UNец
 
Сообщения: 35
Зарегистрирован: 30 сен 2021, 16:10
Откуда: Украина

Re: Zoom в Unity

Сообщение Alkos26Rus 03 фев 2022, 15:52

Merfik933 писал(а):
Alkos26Rus писал(а):Во первых, зачем камеру засовывать в канвас, что это за извращение такое? Это же 3д игра? Тогда камера это обычный 3д объект на сцене в мировых координадах. Во вторых у тебя в LateUpdate у камеры назначается позиция cameraTransform.position = CalculateCameraPosition(); Поэтому ей все равно что ты там делаешь в Update, позиция все равно назначится в LateUpdate

я понял... спасибо большое. Попробую как-то переделать...
P.s. У меня камера не в cavas'е, а просто в иерархи, не знаю с чего ты это взял (может я что-то не понятно объяснил), но буду знать что засовывать ее туда не нужно:)

На скрине на камере висит RectTransform из чего я сделал вывод что камера в канвасе
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Zoom в Unity

Сообщение Merfik933 03 фев 2022, 19:33

Alkos26Rus писал(а):
Merfik933 писал(а):
Alkos26Rus писал(а):Во первых, зачем камеру засовывать в канвас, что это за извращение такое? Это же 3д игра? Тогда камера это обычный 3д объект на сцене в мировых координадах. Во вторых у тебя в LateUpdate у камеры назначается позиция cameraTransform.position = CalculateCameraPosition(); Поэтому ей все равно что ты там делаешь в Update, позиция все равно назначится в LateUpdate

я понял... спасибо большое. Попробую как-то переделать...
P.s. У меня камера не в cavas'е, а просто в иерархи, не знаю с чего ты это взял (может я что-то не понятно объяснил), но буду знать что засовывать ее туда не нужно:)

На скрине на камере висит RectTransform из чего я сделал вывод что камера в канвасе

я хз почему он там висит, а не обычный Transform:) надо будет посмотреть
Аватара пользователя
Merfik933
UNец
 
Сообщения: 35
Зарегистрирован: 30 сен 2021, 16:10
Откуда: Украина


Вернуться в Скрипты

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

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