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

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;

Наверное, нормально не смог объяснить, если что, простите. Заранее благодарен!

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

СообщениеДобавлено: 07 ноя 2017, 17:17
samana
Может у Unity и есть специальные методы для такого решения, но пока нет времени искать.
Попробуйте каждый угол камеры перевести в мировые координаты (ViewportToWorldPoint), так можно вычислить ширину и высоту её прямоугольной области видимости. И уже отталкиваясь от этих данных.

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

СообщениеДобавлено: 07 ноя 2017, 18:38
Киборг
samana, вариант действительно неплохой. Тем более, что похожее мне уже приходило в голову.
Но я упомянул выше, что я написал скроллинг для камеры, то есть углы моей камеры "выходят за пределы экрана".
Твой метод мог бы помочь, если не было скроллинга.

Но всё равно, спасибо.

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

СообщениеДобавлено: 07 ноя 2017, 20:44
samana
Не могу понять, чем скроллинг мешает ограничению камеры.
Я так понял, что у вас камера смотрит сверху вниз, то-есть передвигается она по 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.

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

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

СообщениеДобавлено: 08 ноя 2017, 15:31
Anonymyx
Если допустим, при 60 orthographic size у вас границы равны 300 и вас все устраивает, то 60/300 = 0.2.
Тогда высчитываем границы по формуле orthographic size/0.2f

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

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

Тема закрыта.