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

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

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

Например вот так

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

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

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

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


Обычный слайдер это UI компонент, как его совместить с 3D объектами ?? Если есть пример такой реализации, буду очень благодарен!)

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

СообщениеДобавлено: 12 сен 2018, 13:33
1max1
как его совместить с 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;
        }
    }
}

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

СообщениеДобавлено: 12 сен 2018, 13:37
denprox
Это именно то что нужно!! Спасибо! :)

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

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


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

СообщениеДобавлено: 18 сен 2018, 12:47
1max1
Объекты под пустышку, пустышку двигать влево-вправо по кнопке, если достигли конца/начала - отключаем кнопку, потом включаем.

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

СообщениеДобавлено: 18 сен 2018, 13:34
denprox
Это понятно, я уже сделал само передвижение по аналогии с вашим примером. Проблема больше в том, как "выдвигать" и "задвигать" по отдельности объекты ?

Синтаксис:
Используется 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;
                }
        }
 

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

СообщениеДобавлено: 18 сен 2018, 13:57
1max1
по отдельности

Например?

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

СообщениеДобавлено: 18 сен 2018, 14:57
denprox
Например так:

Изображение
-
Изображение
-
Изображение

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

СообщениеДобавлено: 18 сен 2018, 15:05
1max1
Ну и в чем проблема брать текущий выбранный объект и лерпить его позицию чуть вперед к камере, а потом лерпить обратно если был выбран другой.

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

СообщениеДобавлено: 20 сен 2018, 14:51
denprox
Сделал таким образом:

Синтаксис:
Используется 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;
                }
        }
 


Если переключать медленно, то все работает нормально, но если быстро нажимать кнопку Вперед/Назад , то Лерп прерывается и предыдущие объекты остаются не доведенные до заданного начального положения. Как с этим можно бороться ?

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

СообщениеДобавлено: 21 сен 2018, 09:38
1max1
Разделяй на компоненты https://mega.nz/#!7UAAkAKT!0kia19d4br9E ... My6fnz4vtE

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

СообщениеДобавлено: 24 сен 2018, 11:43
denprox
1max1 писал(а):Разделяй на компоненты https://mega.nz/#!7UAAkAKT!0kia19d4br9E ... My6fnz4vtE


Спасибо! Все отлично работает!