Форум программистов, компьютерный форум, киберфорум
Наши страницы
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
_Axe_
2 / 2 / 0
Регистрация: 13.10.2014
Сообщений: 12
#1

Ограничение выхода камеры за поля

30.08.2015, 00:33. Просмотров 3482. Ответов 5
Метки нет (Все метки)

Доброго времени суток. Подскажите пожалуйста, как ограничить выход камеры с ортографической проекцией за определённые поля, представленные в виде блоков?
На этой картинке показано "игровое поле", которое состоит из отдельных блоков и оно ограничено блоками чёрного цвета, нужно запретить камере выходить за пределы этих чёрных блоков.
Ограничение выхода камеры за поля
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2015, 00:33
Ответы с готовыми решениями:

Ограничение движения камеры
Здравствуйте!Подскажите как ограничить полёт камеры?Может создать Vector?

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

Ограничение вращения камеры при использовании функции Transform.RotateAround
Здравствуйте! Я не могу разобраться как ограничить вращения камеры при...

Объекты за пределом поля видимости камеры
Доброго времени суток. Подскажите, пожалуйста, как сделать взаимодействия с...

Запретить движение камеры, при котором центр вью выйдет за пределы поля
Добрый день. Ортографическая камера. Топ-даун игра. Сгенерированное поле...

5
8Observer8
2238 / 1423 / 226
Регистрация: 05.10.2013
Сообщений: 4,394
Записей в блоге: 56
30.08.2015, 09:06 #2
В стандарных примерах есть скрипт CameraFollow. Можно его переделать.

C#
1
2
3
4
5
6
7
8
9
10
    public class CameraFollow : MonoBehaviour
    {
        public float xMargin = 1f; // Distance in the x axis the player can move before the camera follows.
        public float yMargin = 1f; // Distance in the y axis the player can move before the camera follows.
        public float xSmooth = 8f; // How smoothly the camera catches up with it's target movement in the x axis.
        public float ySmooth = 8f; // How smoothly the camera catches up with it's target movement in the y axis.
        public Vector2 maxXAndY; // The maximum x and y coordinates the camera can have.
        public Vector2 minXAndY; // The minimum x and y coordinates the camera can have.
        public Transform minCameraPoint;
        public Transform leftBound;
0
_Axe_
2 / 2 / 0
Регистрация: 13.10.2014
Сообщений: 12
30.08.2015, 12:49  [ТС] #3
Не могу найти этот скрипт, можете скинуть его целиком?
0
8Observer8
2238 / 1423 / 226
Регистрация: 05.10.2013
Сообщений: 4,394
Записей в блоге: 56
30.08.2015, 12:54 #4
Он находится в пакете: Standard Assets\2D.unitypackage

CameraFollow.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using System;
using UnityEngine;
 
 
namespace UnityStandardAssets._2D
{
    public class CameraFollow : MonoBehaviour
    {
        public float xMargin = 1f; // Distance in the x axis the player can move before the camera follows.
        public float yMargin = 1f; // Distance in the y axis the player can move before the camera follows.
        public float xSmooth = 8f; // How smoothly the camera catches up with it's target movement in the x axis.
        public float ySmooth = 8f; // How smoothly the camera catches up with it's target movement in the y axis.
        public Vector2 maxXAndY; // The maximum x and y coordinates the camera can have.
        public Vector2 minXAndY; // The minimum x and y coordinates the camera can have.
 
        private Transform m_Player; // Reference to the player's transform.
 
        private void Awake()
        {
            // Setting up the reference.
            m_Player = GameObject.FindGameObjectWithTag("Player").transform;
        }
 
 
        private bool CheckXMargin()
        {
            // Returns true if the distance between the camera and the player in the x axis is greater than the x margin.
            return Mathf.Abs(transform.position.x - m_Player.position.x) > xMargin;
        }
 
 
        private bool CheckYMargin()
        {
            // Returns true if the distance between the camera and the player in the y axis is greater than the y margin.
            return Mathf.Abs(transform.position.y - m_Player.position.y) > yMargin;
        }
 
 
        private void Update()
        {
            TrackPlayer();
        }
 
 
        private void TrackPlayer()
        {
            // By default the target x and y coordinates of the camera are it's current x and y coordinates.
            float targetX = transform.position.x;
            float targetY = transform.position.y;
 
            // If the player has moved beyond the x margin...
            if (CheckXMargin())
            {
                // ... the target x coordinate should be a Lerp between the camera's current x position and the player's current x position.
                targetX = Mathf.Lerp(transform.position.x, m_Player.position.x, xSmooth*Time.deltaTime);
            }
 
            // If the player has moved beyond the y margin...
            if (CheckYMargin())
            {
                // ... the target y coordinate should be a Lerp between the camera's current y position and the player's current y position.
                targetY = Mathf.Lerp(transform.position.y, m_Player.position.y, ySmooth*Time.deltaTime);
            }
 
            // The target x and y coordinates should not be larger than the maximum or smaller than the minimum.
            targetX = Mathf.Clamp(targetX, minXAndY.x, maxXAndY.x);
            targetY = Mathf.Clamp(targetY, minXAndY.y, maxXAndY.y);
 
            // Set the camera's position to the target position with the same z component.
            transform.position = new Vector3(targetX, targetY, transform.position.z);
        }
    }
}
0
_Axe_
2 / 2 / 0
Регистрация: 13.10.2014
Сообщений: 12
30.08.2015, 13:01  [ТС] #5
Это не совсем то, что мне нужно. Здесь сама камера не выходит за пределы координат, а мне нужно, что бы не выходила зона видимости. Зона видимости в ортографической карте определяется полем Size.
Кстати, вот мой скрипт управления камерой.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using UnityEngine;
using System.Collections;
 
public class CameraController:MonoBehaviour
{
    public float fieldHeight=30;
    public float fieldwidth=50;
    public float sensitivity=5;
    void Update()
    {
        gameObject.GetComponent<Camera>().orthographicSize-=Input.GetAxis("Mouse ScrollWheel");
        if(/*Input.mousePosition.x>=Screen.width||*/Input.GetKey(KeyCode.RightArrow))
        {
            transform.Translate(sensitivity*Time.deltaTime,0,0);
        }
        if(/*Input.mousePosition.y>=Screen.height||*/Input.GetKey(KeyCode.UpArrow))
        {
            transform.Translate(0,sensitivity*Time.deltaTime,0);
        }
        if(/*Input.mousePosition.x<=0||*/Input.GetKey(KeyCode.LeftArrow))
        {
            transform.Translate(-sensitivity*Time.deltaTime,0,0);
        }
        if(/*Input.mousePosition.y<=0||*/Input.GetKey(KeyCode.DownArrow))
        {
            transform.Translate(0,-sensitivity*Time.deltaTime,0);
        }
    }
}
0
lentinant
96 / 83 / 19
Регистрация: 15.04.2015
Сообщений: 353
Завершенные тесты: 1
31.08.2015, 10:51 #6
Ну так, берите в учет не только координаты камеры, но и ее размер. Она же ортографическая, значит, вам достаточно Считать Size, и его горизонтальный аналог. В итоге, используя скрипт, ограничивающий камеру по координатам, вы можете просто внести правки в координаты в зависимости от параметров камеры, например, если вам не нужно, чтобы Y поля зрения не выходит за 5, а размер камеры 1, то координата ограничения будет 4.
1
31.08.2015, 10:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2015, 10:51

Ограничение доступа выхода в интернет на модеме D-link500t
Объясняю ситуацию: у меня модем настроен роутером сервак на котором...

Ограничение продолжительности моделирования по интенсивности выхода обработанных заявок
Как задать ограничение на время моделирования, учитывая и максимальное...

Ограничение вариантов заполнения поля в форме на основе уже заполненного поля
Здравствуйте. Сразу к делу- Имеется база, в ней,кроме прочих,существуют...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru