Unity - ограничение позиции камеры относительно её вида

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

Unity - ограничение позиции камеры относительно её вида

Сообщение Киборг 07 ноя 2017, 12:55

Всем привет. Не думал, что придётся обращаться на форумы. Может быть я не совсем понятно задал вопрос, но всё же, может кто-нибудь ответит.

Пишу игру RTS. Вид сверху.

В общем в чём проблема. Я написал скрипт для увеличения вида камеры (обзора). Камера: Ortographic. Также в этот скрипт добавил строки для перемещения (скроллинга) камеры. Поставил ограничение с помощью Mathf.Clamp. Теперь какой баг: Когда я не увеличиваю вид камеры (Zoom in), ограничения работают нормально, камера не выходит за пределы. Но когда я увеличиваю orthographicSize, камера не может дойти до конца сцены, и получается, будто ограничение увеличилось.

И как можно сделать так, чтобы ограничение вида камеры увеличилось относительно orthographicSize?

Игру сделал под андроид. Вот код для скроллинга камеры:

Синтаксис:
Используется csharp
var pos = Camera.main.transform.position;
pos.x = Mathf.Clamp (Camera.main.transform.position.x - Input.GetTouch (0).deltaPosition.x * 0.15f, 6.0f, 30.0f);
pos.z = Mathf.Clamp (Camera.main.transform.position.z - Input.GetTouch (0).deltaPosition.y * 0.15f, -300.0f, 15.0f);
Camera.main.transform.position = pos;

Наверное, нормально не смог объяснить, если что, простите. Заранее благодарен!
Аватара пользователя
Киборг
UNец
 
Сообщения: 22
Зарегистрирован: 27 окт 2017, 13:14

Re: Unity - ограничение позиции камеры относительно её вида

Сообщение samana 07 ноя 2017, 17:17

Может у Unity и есть специальные методы для такого решения, но пока нет времени искать.
Попробуйте каждый угол камеры перевести в мировые координаты (ViewportToWorldPoint), так можно вычислить ширину и высоту её прямоугольной области видимости. И уже отталкиваясь от этих данных.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Unity - ограничение позиции камеры относительно её вида

Сообщение Киборг 07 ноя 2017, 18:38

samana, вариант действительно неплохой. Тем более, что похожее мне уже приходило в голову.
Но я упомянул выше, что я написал скроллинг для камеры, то есть углы моей камеры "выходят за пределы экрана".
Твой метод мог бы помочь, если не было скроллинга.

Но всё равно, спасибо.
Аватара пользователя
Киборг
UNец
 
Сообщения: 22
Зарегистрирован: 27 окт 2017, 13:14

Re: Unity - ограничение позиции камеры относительно её вида

Сообщение samana 07 ноя 2017, 20:44

Не могу понять, чем скроллинг мешает ограничению камеры.
Я так понял, что у вас камера смотрит сверху вниз, то-есть передвигается она по x и z. Поэтому ширину уровня можно считать по z, а высоту по x.
Затем беру камеру (ортографическую) и меняю ей поворот по x на 90, чтобы она смотрела вниз.
В скрипте, для наглядности в эдиторе, я сделал отрисовку прямоугольной области уровня, которую можно сразу настроить в инспекторе.
Затем есть метод, который вычисляет минимальные и максимальные границы по x и z для камеры (текущего size-а), чтобы она не выходила за прямоугольную область уровня.
Скрипт такой:
Синтаксис:
Используется csharp
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    // центр уровня
    public float levelCenterX;
    public float levelCenterZ;
    [Space]
    // размер уровня
    public float levelSizeX;
    public float levelSizeZ;

    Camera cam;
    float camMinX, camMaxX;
    float camMinZ, camMaxZ;

    private void Start()
    {
        cam = Camera.main;
        recalculateCameraBounds();
    }

    private void Update()
    {
        // это симуляция свайпа
        Vector3 camPosition = cam.transform.position;
        camPosition.x += Input.GetAxis("Horizontal") * 3;
        camPosition.z += Input.GetAxis("Vertical") * 3;

        // ограничиваем передвижение камеры
        camPosition.x = Mathf.Clamp(camPosition.x, camMinX, camMaxX);
        camPosition.z = Mathf.Clamp(camPosition.z, camMinZ, camMaxZ);

        cam.transform.position = camPosition;
    }

    [ContextMenu("recalculate")]
    public void recalculateCameraBounds()
    {
        // узнаём минимум и максимум уровня по ИКС
        float minX = levelCenterX - levelSizeX * 0.5f;
        float maxX = levelCenterX + levelSizeX * 0.5f;

        // узнаём минимум и максимум уровня по ЗЕД
        float minZ = levelCenterZ - levelSizeZ * 0.5f;
        float maxZ = levelCenterZ + levelSizeZ * 0.5f;

        // узнаём ширину (по икс) и высоту (по зед) камеры в мире
        Vector3 minViewport = cam.ViewportToWorldPoint(Vector2.zero);
        Vector3 maxViewport = cam.ViewportToWorldPoint(Vector2.one);

        float camWidthHalf = (maxViewport.x - minViewport.x) * 0.5f;
        float camHeighthalf = (maxViewport.z - minViewport.z) * 0.5f;

        // устанавливаем пределы для позиции камеры по икс и зед
        camMinX = minX + camWidthHalf;
        camMaxX = maxX - camWidthHalf;

        camMinZ = minZ + camHeighthalf;
        camMaxZ = maxZ - camHeighthalf;
    }


    private void OnDrawGizmos()
    {
        // отрисовка прямоугольной области уровня в редакторе (для отладки удобно)
        Gizmos.DrawWireCube(new Vector3(levelCenterX, 0, levelCenterZ), new Vector3(levelSizeX, 0, levelSizeZ));
    }
}
 


В игре, если вы поменяли размеры прямоугольной области уровня (переменные levelSize...) или изменили размер камеры (Size в её инспекторе), то вам достаточно пересчитать границы, вызвав метод recalculateCameraBounds.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Unity - ограничение позиции камеры относительно её вида

Сообщение Киборг 08 ноя 2017, 14:21

(можно на "ты").
samana, спасибо конечно. Просто боюсь, ты не совсем понял. Ограничение размера камеры у меня уже давно работает. Даже с константами. Проблема в другом. Когда я увеличиваю orthographicSize, камера не доходит до конца сцены, её ограничения остаются теми же. Я не могу другое сделать: увеличивать ограничения относительно orthgrapgicSize. К примеру, у меня сейчас orthographicSize равен 60, к примеру я уменьшил до 15, а как теперь увеличить ограничения? Чтобы камера доходила до конца сцены как в начале.
Я попробовал твой скрипт, ничего не изменилось. Но он более правильный, чем мой.

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

Вот скрипт для увеличения и уменьшения orthographicSize (Zoom):
Синтаксис:
Используется csharp
public int speed = 4;
        public float minPinchSpeed = 5.0F;
        public float varianceInDistances = 5.0F;
        private float touchDelta = 0.0F;
        private Vector2 prevDist = new Vector2(0,0);
        private Vector2 curDist = new Vector2(0,0);
        private float speedTouch0 = 0.0F;
        private float speedTouch1 = 0.0F;

void Zoom()
    if (Input.touchCount == 2 && Input.GetTouch(0).phase == TouchPhase.Moved && Input.GetTouch(1).phase == TouchPhase.Moved)
                {
                        curDist = Input.GetTouch(0).position - Input.GetTouch(1).position; //current distance between finger touches
                        prevDist = ((Input.GetTouch(0).position - Input.GetTouch(0).deltaPosition) - (Input.GetTouch(1).position - Input.GetTouch(1).deltaPosition)); //difference in previous locations using delta positions
                        touchDelta = curDist.magnitude - prevDist.magnitude;
                        speedTouch0 = Input.GetTouch(0).deltaPosition.magnitude / Input.GetTouch(0).deltaTime;
                        speedTouch1 = Input.GetTouch(1).deltaPosition.magnitude / Input.GetTouch(1).deltaTime;

                        if ((touchDelta + varianceInDistances <= 1) && (speedTouch0 > minPinchSpeed) && (speedTouch1 > minPinchSpeed))
                        {
                                Camera.main.orthographicSize = Mathf.Clamp(Camera.main.orthographicSize + (1 * speed), 15, 60);
                        }

                        if ((touchDelta + varianceInDistances > 1) && (speedTouch0 > minPinchSpeed) && (speedTouch1 > minPinchSpeed))
                        {
                                Camera.main.orthographicSize = Mathf.Clamp(Camera.main.orthographicSize - (1 * speed), 15, 60);
                        }
                }
}
 
Аватара пользователя
Киборг
UNец
 
Сообщения: 22
Зарегистрирован: 27 окт 2017, 13:14

Re: Unity - ограничение позиции камеры относительно её вида

Сообщение Anonymyx 08 ноя 2017, 15:31

Если допустим, при 60 orthographic size у вас границы равны 300 и вас все устраивает, то 60/300 = 0.2.
Тогда высчитываем границы по формуле orthographic size/0.2f
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Unity - ограничение позиции камеры относительно её вида

Сообщение Киборг 08 ноя 2017, 15:51

Всем спасибо. Я разобрался.
В общем, добавил строчки кода. Теперь при Zoom у меня увеличиваются границы.
Работает как надо.

Тема закрыта.
Аватара пользователя
Киборг
UNец
 
Сообщения: 22
Зарегистрирован: 27 окт 2017, 13:14


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

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

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