Страница 1 из 1

Zoom в Unity

СообщениеДобавлено: 01 фев 2022, 10:41
Merfik933
Я написал метод 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));
            }
        }
    }

Re: Zoom в Unity

СообщениеДобавлено: 01 фев 2022, 11:03
Alkos26Rus
Возможно distanceMin, distanceMax низкие значения, проверь без клампа

Re: Zoom в Unity

СообщениеДобавлено: 01 фев 2022, 14:30
Merfik933
Alkos26Rus писал(а):Возможно distanceMin, distanceMax низкие значения, проверь без клампа

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

Re: Zoom в Unity

СообщениеДобавлено: 01 фев 2022, 17:58
Alkos26Rus
Merfik933 писал(а):
Alkos26Rus писал(а):Возможно distanceMin, distanceMax низкие значения, проверь без клампа

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

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

Re: Zoom в Unity

СообщениеДобавлено: 01 фев 2022, 23:43
Merfik933
Alkos26Rus писал(а):
Merfik933 писал(а):
Alkos26Rus писал(а):Возможно distanceMin, distanceMax низкие значения, проверь без клампа

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

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

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

Re: Zoom в Unity

СообщениеДобавлено: 02 фев 2022, 10:27
Alkos26Rus
Merfik933 писал(а):
Alkos26Rus писал(а):
Merfik933 писал(а):
Alkos26Rus писал(а):Возможно distanceMin, distanceMax низкие значения, проверь без клампа

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

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

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

Нужно загрузить картинку используя какой нибудь сервис, я ползуюсь https://imgbox.com/ или https://clip2net.com/

Re: Zoom в Unity

СообщениеДобавлено: 03 фев 2022, 13:34
Merfik933
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
Я кинул ссылки а не изображения, потомучто при предосмотре писало "Неудалось определить размеры изображений"...

Re: Zoom в Unity

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

Re: Zoom в Unity

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

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

Re: Zoom в Unity

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

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

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

Re: Zoom в Unity

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

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

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

я хз почему он там висит, а не обычный Transform:) надо будет посмотреть