Границы для UI объектов в Unity

145
28 января 2022, 06:10

У меня есть Canvas. На нем есть некое поле Field и в нем объект Aim. Aim должен двигаться с определенной скоростью и "отскакивать" от границ Field. Как это сделать?

Вот мои попытки:

    public GameObject Aim;
    public Transform MaxX;
    float maxX;                    
    public Transform MaxY;
    float maxY;                   
    public Transform MinX;
    float minX;                    
    public Transform MinY;
    float minY;           //Это все "грани"

    void Start()
    {
        maxX = MaxX.transform.position.x;
        maxY = MaxY.transform.position.y;
        minX = MinX.transform.position.x;
        minY = MinY.transform.position.y;
        Debug.Log($"{maxX} {maxY} {minX} {minY}");
    }
    void Update()
    {
        Move();
    }
    public float Speed;
    void Move()
    {
        Aim.transform.Translate(Aim.transform.up*Speed);
        Debug.Log((Vector2)Aim.transform.position);
        float x = Aim.transform.position.x;
        if (x > maxX)
        {
            Rotate(60);
        }
        else if (x < minX)
        {
            Rotate(60);
        }
        float y = Aim.transform.position.y;
        if (y > maxX)
        {
            Rotate(60);
        }
        else if (y < minX)
        {
            Rotate(60);
        }
    }
    //Вращаем и, тем самым, отскакиваем от грани
    void Rotate(float angle)
    {
        Debug.Log("A");
        Aim.transform.Rotate(new Vector3(0, 0, angle));
    }

Все объекты - MaxX, MaxY, MinX, MinY, Aim - находятся в Field

Я думал еще добавить коллайдеры, и делать это через OnCollision, но не думаю что это хорошая идея.

В Unity есть куча инструментов для работы с миром. Но как быть, если вся игра - это часть UI?

Answer 1

Описанная вами задача решается не инструментами Unity, а весьма банальным кодом, без физики. Не transform.Translate, а просто localPosition += MoveVec. При столкновении с вертикальными стенками менять x = -x и соответственно y = -y горизонтальными у MoveVec. Вот и всё. И никаких Rotate.

П.C. не паникуйте и разберитесь с устройством Canvas и его взаимодействием с сценой и камерой. Как и написал коллега, игра на UI это стрельба себе в ногу, причём из BFG, если только вы не делаете текстовую рпг/квест или 2048.

READ ALSO
C# граница TabControl и Panel

C# граница TabControl и Panel

Имеется проблема с визуализацией в MetroUIЕсли в MetroTabControl создать MetroPanel, и в параметре Dock поставить заполнение, то появляются такие полоски

166
Telegram Bot API не отправляет файл?

Telegram Bot API не отправляет файл?

С наступающим! (для всех, читающих в 2020 - с наступившим!) )

134
Обновление mysql

Обновление mysql

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

101
Почему не переключает?

Почему не переключает?

Почему когда я вставляю код с выбором option в select и вывод данные в другом блоке, здесь всё работаетА когда вставляю на сайте, выбивается ошибка:

77