С Новым годом! Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/103: Рейтинг темы: голосов - 103, средняя оценка - 4.98
 Аватар для Serj190492
160 / 159 / 59
Регистрация: 19.02.2015
Сообщений: 830

Ограничить перемещение объекта краями экрана

03.07.2017, 18:02. Показов 19602. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Проект 2D. ГГ перемещается с помощью акселератора от края до края экрана (только по оси х. По у всегда одна координата)
C#
1
2
3
4
5
6
7
8
9
10
11
12
void Update()
    {
        dir.x = Input.acceleration.x;
 
        if (dir.sqrMagnitude > 1)
            dir.Normalize();
        dir *= Time.deltaTime;
 
        gameObject.GetComponent<Rigidbody2D>().velocity = (dir * speed);
 
        //posOnScreen = Camera.main.WorldToScreenPoint(transform.position).x;
    }
Нужно как-то ограничить перемещение ГГ краями экрана, чтобы за них нельзя было зайти. Раньше это были коллайдеры по краям, сейчас такой вариант не подходит.
Нашел метод WorldToScreenPoint, но как его в этом случае применить - не понимаю
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.07.2017, 18:02
Ответы с готовыми решениями:

Перемещение объекта с одной стороны экрана на противоположную
Подскажите, пожалуйста, как лучше реализовать постепенное перемещение объекта с одной стороны экрана на противоположную. К примеру, есть...

Ограничить перемещение окна
Можно ли ограничить перемещение окна, чтобы оно не двигалось дальше указанного диапазона

Ограничить перемещение курсора
Как ограничить перемещение курсора по круговой ттраектории с определенным радиусом в определенной позиции формы ? Знаю что lock курсор...

16
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
03.07.2017, 18:31
Если камера неподвижна а гг движется в одной плоскости, то движем шарик до каждог.о края смотрим мировие координати по оба края и далее применить mathf.clamp(minX,maxX, transform position.x)
0
 Аватар для Serj190492
160 / 159 / 59
Регистрация: 19.02.2015
Сообщений: 830
03.07.2017, 20:00  [ТС]
ASDFD12, можно пример?
Я это пробовал реализовать, что-то пошло не так)

Добавлено через 1 минуту
C#
1
2
3
 maxX = Screen.width / 2 - 0.5f;
 
Mathf.Clamp(transform.position.x, -maxX, maxX);
Вот что я пробовал)
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
03.07.2017, 22:02
1.Запускаеш сцену в редакторе.
2. Открываеш окна Сцена и Гейм.
3. В окне сцена перемещаешь шарик до крайнего левого края екрана.
4.Записываешь позицию Xleft.
5. Аналогично вычисляешь XRight;
C#
1
2
float X = Mathf.Clamp(transform.position.x, Xleft, Xright);
tranform.position = new Vector3(X, transform.position.y, transform.position.z);
1
 Аватар для Serj190492
160 / 159 / 59
Регистрация: 19.02.2015
Сообщений: 830
04.07.2017, 05:44  [ТС]
Цитата Сообщение от ASDFD12 Посмотреть сообщение
3. В окне сцена перемещаешь шарик до крайнего левого края екрана.
4.Записываешь позицию Xleft.
5. Аналогично вычисляешь XRight;
C#
1
2
XRight = Screen.width / 2;
XLeft = -XRight;
Так ведь лучше, чем "шарик катать".
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
04.07.2017, 08:52
Цитата Сообщение от Serj190492 Посмотреть сообщение
Так ведь лучше, чем "шарик катать".
не лучше. нужно вычислять не экранные координаты, а мировые.
0
 Аватар для Serj190492
160 / 159 / 59
Регистрация: 19.02.2015
Сообщений: 830
04.07.2017, 15:25  [ТС]
Цитата Сообщение от ASDFD12 Посмотреть сообщение
нужно вычислять не экранные координаты, а мировые.
Точно. Ошибся.
Но использовать константы тоже не выход - на разных разрешениях будут разные результаты при одних и тех же числах...
Кликните здесь для просмотра всего текста
0
 Аватар для wmysterio
295 / 244 / 128
Регистрация: 24.12.2014
Сообщений: 708
05.07.2017, 04:22
Цитата Сообщение от Serj190492 Посмотреть сообщение
что-то пошло не так)
И какже по-Вашему оно должно быть так? Допустим размер дисплея по ширине будет 640 пикселей. Тогда:
Code
1
2
maxX = 640 / 2 - 0.5f // равно 319.5
-maxX // это -319.5
У Вас большой диапазон слева получается. 0 - это крайняя левая точка. Если брать во внимание размеры экрана с отступом 0.5, то должно быть так:
C#
1
var val = Mathf.Clamp(transform.position.x, 0.5f, Screen.width - 0.5f);
Это если координаты будут в рамках дасплея.
0
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
05.07.2017, 09:05
Если проект 2D то и камера скорее ортографическая.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    float widthCam; // ширина камеры
    Vector2 centrCam; // центр камеры (это ее пивот)
    float minX, maxX; 
 
    void Start ()
    {
        widthCam = cam.orthographicSize * cam.aspect; // Получаем половину ширины камеры, путем умножения высоты на соотношение
                                                                                
        centrCam = cam.transform.position; // получаем центр камеры, т.к. пивот у камеры по умолчанию в центре, центром будет ее позиция
 
        minX = centrCam.x - widthCam; // левый край  (отнимаем от центра половину ширины)
        maxX = centrCam.x + widthCam; // правый край (прибавляем к центру половину ширины)
    }
2
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
05.07.2017, 09:27
Что то сайт часто падает. Это у меня у одного?

Добавлено через 21 минуту
одну строчку сверху пропустил
C#
1
public Camera cam;
0
 Аватар для Serj190492
160 / 159 / 59
Регистрация: 19.02.2015
Сообщений: 830
05.07.2017, 09:34  [ТС]
Цитата Сообщение от Prog_maker Посмотреть сообщение
Что то сайт часто падает. Это у меня у одного?
Нет. У меня так же.

Prog_maker, Но в вашем случае я получу не мировые координаты, правильно понимаю? Или они совпадают?

Спасибо всем откликнувшимся.

Решение в итоге использовал такое:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
float maxX, minX;
 
    void Start()
    {
        minX = Camera.main.ScreenToWorldPoint(new Vector2(0f, 0f)).x + 0.3f;
        maxX = -minX;
    }
 
    void Update()
    {
        dir.x = Input.acceleration.x;
        Debug.Log(Input.acceleration.x);
        if (dir.x == 0f) dir.x = Input.GetAxis("Horizontal");
 
        if (dir.sqrMagnitude > 1)
            dir.Normalize();
        dir *= Time.deltaTime;
 
        gameObject.GetComponent<Rigidbody2D>().velocity = (dir * speed);
 
        if (transform.position.x > maxX) transform.position = new Vector2(maxX, transform.position.y);
        else if (transform.position.x < minX) transform.position = new Vector2(minX, transform.position.y);
    }
Prog_maker, Покатит?) Или ваш вариант будет чем-то выгоднее?
0
 Аватар для Serj190492
160 / 159 / 59
Регистрация: 19.02.2015
Сообщений: 830
05.07.2017, 09:34  [ТС]
Цитата Сообщение от Prog_maker Посмотреть сообщение
Что то сайт часто падает. Это у меня у одного?
Нет. У меня так же.

Prog_maker, Но в вашем случае я получу не мировые координаты, правильно понимаю? Или они совпадают?

Спасибо всем откликнувшимся.

Решение в итоге использовал такое:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
float maxX, minX;
 
    void Start()
    {
        minX = Camera.main.ScreenToWorldPoint(new Vector2(0f, 0f)).x + 0.3f;
        maxX = -minX;
    }
 
    void Update()
    {
        dir.x = Input.acceleration.x;
        Debug.Log(Input.acceleration.x);
        if (dir.x == 0f) dir.x = Input.GetAxis("Horizontal");
 
        if (dir.sqrMagnitude > 1)
            dir.Normalize();
        dir *= Time.deltaTime;
 
        gameObject.GetComponent<Rigidbody2D>().velocity = (dir * speed);
 
        if (transform.position.x > maxX) transform.position = new Vector2(maxX, transform.position.y);
        else if (transform.position.x < minX) transform.position = new Vector2(minX, transform.position.y);
    }
Prog_maker, Покатит?) Или ваш вариант будет чем-то выгоднее?
0
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
05.07.2017, 09:49
Цитата Сообщение от Serj190492 Посмотреть сообщение
Но в вашем случае я получу не мировые координаты, правильно понимаю? Или они совпадают?
Координаты будут мировые!!!!
1
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
05.07.2017, 09:52
Цитата Сообщение от Serj190492 Посмотреть сообщение
Но в вашем случае я получу не мировые координаты, правильно понимаю? Или они совпадают?
Координаты будут мировые!!!!

У меня менее мудреный ))))

Добавлено через 2 минуты
Да что сайт лагает то так!!!!
0
 Аватар для Serj190492
160 / 159 / 59
Регистрация: 19.02.2015
Сообщений: 830
05.07.2017, 10:00  [ТС]
Цитата Сообщение от Prog_maker Посмотреть сообщение
Координаты будут мировые!!!!
Ок, вроде разобрался что там и как)

Еще вопрос, сейчас сам проверить не могу...
В вашем случае я могу вместо
C#
1
2
if (transform.position.x > maxX) transform.position = new Vector2(maxX, transform.position.y);
else if (transform.position.x < minX) transform.position = new Vector2(minX, transform.position.y);
использовать
C#
1
2
float X = Mathf.Clamp(transform.position.x, minX, maxX);
tranform.position = new Vector3(X, transform.position.y, transform.position.z);
?
0
 Аватар для Serj190492
160 / 159 / 59
Регистрация: 19.02.2015
Сообщений: 830
05.07.2017, 10:01  [ТС]
Цитата Сообщение от Prog_maker Посмотреть сообщение
Координаты будут мировые!!!!
Ок, вроде разобрался что там и как)

Еще вопрос, сейчас сам проверить не могу...
В вашем случае я могу вместо
C#
1
2
if (transform.position.x > maxX) transform.position = new Vector2(maxX, transform.position.y);
else if (transform.position.x < minX) transform.position = new Vector2(minX, transform.position.y);
использовать
C#
1
2
float X = Mathf.Clamp(transform.position.x, minX, maxX);
tranform.position = new Vector3(X, transform.position.y, transform.position.z);
?
0
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
05.07.2017, 11:12
Лучший ответ Сообщение было отмечено Serj190492 как решение

Решение

Да конечно.

Добавлено через 26 секунд
Вот что у меня получилось
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
using UnityEngine;
 
public class CameraBounds : MonoBehaviour
{
    public Camera cam; // Камера
 
    public GameObject movedObj; // объект который нужно двигать
 
    public float speed;
 
    float widthCam; // ширина камеры
    Vector2 centrCam; // центр камеры (это ее пивот)
    float minX, maxX;
 
    SpriteRenderer sR; 
    Vector3 width;
 
    private void Awake ()
    {
        sR = movedObj.GetComponent<SpriteRenderer> ();
    }
 
    void Start ()
    {
        widthCam = cam.orthographicSize * cam.aspect;
        centrCam = cam.transform.position;
 
        minX = centrCam.x - widthCam;
        maxX = centrCam.x + widthCam;
 
        width = sR.bounds.extents; // получаем размеры объекта (вернее половины ширины, высоты, глубины)
    }
 
 
    void Update ()
    {
        float dir = Input.GetAxis("Horizontal");
 
        if (Mathf.Abs(dir) > 0)
        {
            float  x = Mathf.Clamp (movedObj.transform.position.x + (dir * speed) , minX + width.x, maxX - width.x);
 
            movedObj.transform.position = new Vector3 (x, movedObj.transform.position.y, movedObj.transform.position.z);
        }
    }
 
 
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.07.2017, 11:12
Помогаю со студенческими работами здесь

Ограничить перемещение Timage за рамки Tpanel
Как сделать ограничение что бы Timage не заходил за рамки Tpanel, при перемещении первого?

Ограничить перемещение курсора в пределах формы
Как ограничить перемещение курсора в пределах формы?

Как ограничить перемещение компонента на форме?
Здравствуйте. Подскажите пожалуйста, как сделать 2 (n) Image «не проходимыми» при перемещение на расстояние установленном программистом ?

Как ограничить перемещение кнопки в пределах диапазона
Доброго времени суток! Пытаюсь сделать свой track bar но с несколькими ползунками, которые будут перемещаться в изменяемом диапазоне....

Как ограничить перемещение пользователя по личному кабинету?
Пожалуйста подскажите решение или &quot;где спросить&quot;? Задача: ограничить перемещение пользователя по личному кабинету вебсайта. Доступ к коду...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru