Аналог UI слайдера

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

Аналог UI слайдера

Сообщение denprox 12 сен 2018, 10:31

Доброго времени суток! Есть у кого ни будь пример того, как сделать прокручиваемый список, состоящий из 3D объектов, как обычно бывает в игрушках, где нужно выбрать машину или оружие. В видимой части 3 объекта, тот что по центру (текущий), размером побольше. Остальные поменьше.

Например вот так
Аватара пользователя
denprox
UNIт
 
Сообщения: 107
Зарегистрирован: 25 май 2017, 09:06
  • Сайт

Re: Аналог UI слайдера

Сообщение 1max1 12 сен 2018, 10:38

И зачем тебе аналог если обычный бы прекрасно справился.
Диапазон слайдера 0-2 целых чисел, и в зависимости от числа подставляешь нужный объект.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Аналог UI слайдера

Сообщение denprox 12 сен 2018, 12:57

1max1 писал(а):И зачем тебе аналог если обычный бы прекрасно справился.
Диапазон слайдера 0-2 целых чисел, и в зависимости от числа подставляешь нужный объект.


Обычный слайдер это UI компонент, как его совместить с 3D объектами ?? Если есть пример такой реализации, буду очень благодарен!)
Аватара пользователя
denprox
UNIт
 
Сообщения: 107
Зарегистрирован: 25 май 2017, 09:06
  • Сайт

Re: Аналог UI слайдера

Сообщение 1max1 12 сен 2018, 13:33

как его совместить с 3D объектами ??

Что это значит? Ты хочешь чтобы из 2д он перелез в 3д пространство? Для это достаточно канвас поставить в режим World Space и поместить туда куда нужно, но мне кажется ты имел ввиду что-то другое...
Такое разве не подойдет тебе?

Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.UI;
using System.Collections;

class SliderInt : MonoBehaviour
{
    [SerializeField] Slider sliderInt;
    [SerializeField] float speedChoose = 5.0f;

    int value;

    Coroutine coroutine;

    void Start()
    {
        value = (int)sliderInt.value;
    }

    void Update()
    {
        if ((int)sliderInt.value != value)
        {
            value = (int)sliderInt.value;

            if (coroutine != null)
            {
                StopCoroutine(coroutine);
            }

            coroutine = StartCoroutine(c_Choose(value));
        }
    }

    IEnumerator c_Choose(int value)
    {
        float newY = 0.0f;

        switch (value)
        {
            case 0: newY = 0.0f; break;
            case 1: newY = 90.0f; break;
            case 2: newY = 180.0f; break;
            case 3: newY = 270.0f; break;
        }

        while (true)
        {
            var euler = transform.eulerAngles;

            euler.y = Mathf.Lerp(euler.y, newY, speedChoose * Time.deltaTime);

            transform.eulerAngles = euler;

            if (Mathf.Approximately(transform.eulerAngles.y, newY))
            {
                coroutine = null;

                yield break;
            }

            yield return null;
        }
    }
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Аналог UI слайдера

Сообщение denprox 12 сен 2018, 13:37

Это именно то что нужно!! Спасибо! :)
Аватара пользователя
denprox
UNIт
 
Сообщения: 107
Зарегистрирован: 25 май 2017, 09:06
  • Сайт

Re: Аналог UI слайдера

Сообщение denprox 18 сен 2018, 12:43

Снова решил вернуться к данному вопросу. Как сделать не вращение а перемещение объектов ? Например как тут на 3:12 -

Аватара пользователя
denprox
UNIт
 
Сообщения: 107
Зарегистрирован: 25 май 2017, 09:06
  • Сайт

Re: Аналог UI слайдера

Сообщение 1max1 18 сен 2018, 12:47

Объекты под пустышку, пустышку двигать влево-вправо по кнопке, если достигли конца/начала - отключаем кнопку, потом включаем.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Аналог UI слайдера

Сообщение denprox 18 сен 2018, 13:34

Это понятно, я уже сделал само передвижение по аналогии с вашим примером. Проблема больше в том, как "выдвигать" и "задвигать" по отдельности объекты ?

Синтаксис:
Используется csharp
IEnumerator c_Choose (int value) {
                float newX = 0.0f;

                switch (value) {
                        case 0:
                                newX = 15.0f;
                                break;
                        case 1:
                                newX = 0.0f;
                                break;
                        case 2:
                                newX = -15.0f;
                                break;
                        case 3:
                                newX = -30.0f;
                                break;
                }

                while (true) {

                        var pos = transform.position;
                        pos.x = Mathf.Lerp (pos.x, newX, speedChoose * Time.deltaTime);

                        transform.position = pos;

                        if (Mathf.Approximately (transform.position.x, newX)) {
                                coroutine = null;

                                yield break;
                        }

                        yield return null;
                }
        }
 
Аватара пользователя
denprox
UNIт
 
Сообщения: 107
Зарегистрирован: 25 май 2017, 09:06
  • Сайт

Re: Аналог UI слайдера

Сообщение 1max1 18 сен 2018, 13:57

по отдельности

Например?
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Аналог UI слайдера

Сообщение denprox 18 сен 2018, 14:57

Например так:

Изображение
-
Изображение
-
Изображение
Аватара пользователя
denprox
UNIт
 
Сообщения: 107
Зарегистрирован: 25 май 2017, 09:06
  • Сайт

Re: Аналог UI слайдера

Сообщение 1max1 18 сен 2018, 15:05

Ну и в чем проблема брать текущий выбранный объект и лерпить его позицию чуть вперед к камере, а потом лерпить обратно если был выбран другой.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Аналог UI слайдера

Сообщение denprox 20 сен 2018, 14:51

Сделал таким образом:

Синтаксис:
Используется csharp
IEnumerator c_Choose () {

                while (true) {

                        //Возвращаем предыдущий объект в исходное положение по Z
                        if (trigerStep == "next") {
                                var OldObjPos = ObjList[SelectObjNum - 1].transform.position;
                                OldObjPos.z = Mathf.Lerp (OldObjPos.z, DefaultPosZ, speedChoose * Time.deltaTime);

                                ObjList[SelectObjNum - 1].transform.position = OldObjPos;
                        } else {
                                var OldObjPos = ObjList[SelectObjNum + 1].transform.position;
                                OldObjPos.z = Mathf.Lerp (OldObjPos.z, DefaultPosZ, speedChoose * Time.deltaTime);

                                ObjList[SelectObjNum + 1].transform.position = OldObjPos;
                        }

                        //Выдвигаем текущий объект по Z
                        var ObjPos = ObjList[SelectObjNum].transform.position;
                        ObjPos.z = Mathf.Lerp (ObjPos.z, MovePosZ, speedChoose * Time.deltaTime);

                        ObjList[SelectObjNum].transform.position = ObjPos;

                        //Двигаем все объекты по Х
                        var pos = transform.position;
                        pos.x = Mathf.Lerp (pos.x, newX, speedChoose * Time.deltaTime);

                        transform.position = pos;

                        if (Mathf.Approximately (transform.position.x, newX)) {
                                coroutine = null;

                                yield break;
                        }

                        yield return null;
                }
        }
 


Если переключать медленно, то все работает нормально, но если быстро нажимать кнопку Вперед/Назад , то Лерп прерывается и предыдущие объекты остаются не доведенные до заданного начального положения. Как с этим можно бороться ?
Аватара пользователя
denprox
UNIт
 
Сообщения: 107
Зарегистрирован: 25 май 2017, 09:06
  • Сайт

Re: Аналог UI слайдера

Сообщение 1max1 21 сен 2018, 09:38

Разделяй на компоненты https://mega.nz/#!7UAAkAKT!0kia19d4br9E ... My6fnz4vtE
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Аналог UI слайдера

Сообщение denprox 24 сен 2018, 11:43

1max1 писал(а):Разделяй на компоненты https://mega.nz/#!7UAAkAKT!0kia19d4br9E ... My6fnz4vtE


Спасибо! Все отлично работает!
Аватара пользователя
denprox
UNIт
 
Сообщения: 107
Зарегистрирован: 25 май 2017, 09:06
  • Сайт


Вернуться в Почемучка

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 29