Четверг, 14 Ноября 2024, 21:58

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Вопрос-[ответ] по Unity
QWER56Дата: Понедельник, 09 Августа 2010, 10:58 | Сообщение # 1
старожил
Сейчас нет на сайте
Вопрос-[Ответ] по Unity3d

  • База скриптов Unity3d
  • Курс Уроков по Unity 3D от Alcatraz

    ConsMark - поисковик по интернет магазинам.

    Сообщение отредактировал QWER56 - Вторник, 26 Июля 2011, 20:54
  • romeo98Дата: Воскресенье, 20 Ноября 2016, 18:56 | Сообщение # 8201
    участник
    Сейчас нет на сайте
    Цитата uslucifer ()
    Подскажите, если ли в unity метод, чтобы создавал желаемое количество точек расположенных на одинаковом расстоянии друг от друга на отрезке АБ?


    Специального метода нет, но делается это не трудно. Если ты знаешь длину АБ и знаешь сколько точек нужно, то ты можешь узнать расстояние между ними. После этого, используй просто знание векторной математики.

    Код
    float dist = new Vector2(Bx-Ax, By-Ay);
    Vector2 dir = dist.Normalize(); // вычесляем вектор(направление) отрезка
    point[i] = A + dir * dist * (i+1);// засунь это в цикл от 0 до кол-во точек


    Где A и B - вектора позиции точек


    Flist - social platform
    PuzzleSystem - Open-source Unity Asset
    [2D] Mission: Defender


    Сообщение отредактировал romeo98 - Воскресенье, 20 Ноября 2016, 19:05
    usluciferДата: Воскресенье, 20 Ноября 2016, 19:53 | Сообщение # 8202
    постоянный участник
    Сейчас нет на сайте
    romeo98, спасибо!
    я как раз разобрался и решил поделиться своим методом

    Код

    // v вектор начала, c вектор конца, n количество отрезков
    void interpolate(Vector2 v, Vector2 c, float n)
        {
            //создаем и инициализируем переменную содержащую Vector2 предыдущей позиции
            Vector2 last_p = v;
            // создаем и инициализируем переменную содержащую значение величины расстояния между создаваемыми точками
            float d = Vector2.Distance(v, c)/n;
            //запускаем цикл вычисляющий позиции N отрезков, всего N-1 без учета начальной и стартовой
            for(int i = 1; i < (int)n; i++)
            {
                //результирующий Vector2
                last_p = Vector2.MoveTowards(last_p, c, d);
                //тут я визуализировал для наглядности эксперимента разместив на сцене префабы в позиции last_p
                Instantiate(point_p, last_p,Quaternion.identity );
                    
            }
        }


    Сообщение отредактировал uslucifer - Воскресенье, 20 Ноября 2016, 19:54
    EchoITДата: Воскресенье, 20 Ноября 2016, 22:53 | Сообщение # 8203
    старожил
    Сейчас нет на сайте
    uslucifer, я бы на вашем месте использовал для этого Vector2.Lerp. Берём начало - a и конец - b, количество точек, затем делим единицу на кол-во точек (это наш шаг) - step и в цикле, умножая это значение на шаг цикла - i, получаем позиции каждой точкой конструкцией вида:
    Код
    Vector2.Lerp(a, b, step*i)




    Долгожданный анонсик: State of War
    БозингарДата: Воскресенье, 20 Ноября 2016, 23:53 | Сообщение # 8204
    почетный гость
    Сейчас нет на сайте
    Цитата Rean ()
    if (tempTime > 5f)
    Кстати, да. Об этом забыл.

    Вот ещё маленькое задание назрело. Есть небольшой код, генерирующий поле из ячеек (go):
    Код

    int[,] map; // массив поля
    public GameObject[] block; // массив ячеек

    void GenBoard(){
    for (int h = 0; h < map.GetLength (0); h++) {
       for (int r = 0; r < map.GetLength (1); r++) {
        int randomblock = Random.Range (0, block.Length); // выбираем случайный go из массива
    GameObject cell = Instantiate (block [randomblock].gameObject, new Vector2 (h, r), Quaternion.identity) as GameObject; // спавним
    }
    }
    }

    Собственно, задача заключается в следующем - go не должны спавниться линиями длиннее двух ячеек (по обоим координатам). Каким путём лучше пойти, дабы избежать повторений?


    #Хийвэл бүү ай, айвал бүү хий.
    ReanДата: Понедельник, 21 Ноября 2016, 01:09 | Сообщение # 8205
    участник
    Сейчас нет на сайте
    Бозингар, первое что пришло в голову:
    Код
    ...
    int randomblock;
    do
    {
        randomblock = Random.Range (0, block.Length);
    }
    while ( ((h > 1) && (map[h-1, r] == randomblock) && (map[h-2, r] == randomblock)) || ((r > 1) && (map[h, r-1] == randomblock) && (map[h, r-2] == randomblock)) )
    ...

    Повторяем рандом до тех пор, пока текущий индекс строки больше 1 (то есть, по факту как минимум третий), и пока два предыдущих в строке равны полученному рандому. Тоже самое для столбца.
    tdukДата: Среда, 23 Ноября 2016, 23:02 | Сообщение # 8206
    постоянный участник
    Сейчас нет на сайте
    Может,немного нубский вопрос... Как сделать плавный прыжок на большую высоту при нажатии кнопки???

    romeo98Дата: Среда, 23 Ноября 2016, 23:30 | Сообщение # 8207
    участник
    Сейчас нет на сайте
    Цитата tduk ()
    Может,немного нубский вопрос... Как сделать плавный прыжок на большую высоту при нажатии кнопки???

    Наиболее легкий вариант - использовать физику (rigidbody).

    ИНФА

    Код
    rigidbody.AddForce(Vector3.up * force, ForceMode.Impulse);


    Flist - social platform
    PuzzleSystem - Open-source Unity Asset
    [2D] Mission: Defender


    Сообщение отредактировал romeo98 - Среда, 23 Ноября 2016, 23:34
    tdukДата: Четверг, 24 Ноября 2016, 15:08 | Сообщение # 8208
    постоянный участник
    Сейчас нет на сайте
    romeo98, пробовал,выходит оч резко

    ReanДата: Четверг, 24 Ноября 2016, 23:51 | Сообщение # 8209
    участник
    Сейчас нет на сайте
    tduk, а ты пробовал при этом менять настройки сопротивления, гравитации, массы у компонента Rigidbody? Конечно, как альтернатива, можно покопать в сторону самописной гравитации или интерполяции/smoothdamp, но вряд ли этот велосипед будет лучше. Особенно, если не знаком с этим. А при условии, что будет обрабатываться какая-никакая коллизия, и Rigidbody так или иначе понадобиться - не пользоваться встроенными средствами не совсем рационально. Поразбирайся, возможно, ты не до конца раскрыл потенциал встроенной физики. ;)
    seregakalenikДата: Воскресенье, 27 Ноября 2016, 14:36 | Сообщение # 8210
    был не раз
    Сейчас нет на сайте
    Подскажите норм плагин для Unity в котором можно рисовать норм стены, а именно чтобы текстурка на все участки ровномерно ложилась(имею введу чтобы не сжималась в местах не которых) и что бы можно было стену в 2 или 3 цвета(текстуры) красить.

    <KS>
    БозингарДата: Среда, 30 Ноября 2016, 23:50 | Сообщение # 8211
    почетный гость
    Сейчас нет на сайте
    Использую для сохранения код сериализации данных (см. ниже). Внутри игры работает, при перезагрузке\выходе с уровней\выходе в главное меню и обратно на уровень всё сохраняется. Выходишь из приложения - сохранения исчезают (в папке файл сохранения остаётся однако). В чём может быть причина?
    Сперва подумал, что дело в коде игры, но набросал простое приложение на три строчки (войти\сохранить-выйти) и такая же проблема, после выхода данные не сохраняются.

    Собственно, сам код сериализации:


    ___________

    Пляски с бубном не помогли, пришлось прибегнуть к оккультной магии. Однако после десятка принесённых в жертву девственниц испробования различных конфигураций, проблема была решена. Всем спасибо за внимание!


    #Хийвэл бүү ай, айвал бүү хий.

    Сообщение отредактировал Бозингар - Четверг, 01 Декабря 2016, 16:39
    triptixДата: Понедельник, 12 Декабря 2016, 17:53 | Сообщение # 8212
    постоянный участник
    Сейчас нет на сайте
    Как обратиться к обьекту в префабе, не используя find и перебор child?
    BarbatosДата: Понедельник, 12 Декабря 2016, 18:14 | Сообщение # 8213
    3D-моделлер/Руководитель
    Сейчас нет на сайте
    triptix,
    Обратится к скрипту на объекте, который знает своих детей?


    Его остатки и на хлеб не намазать. Мой тебе совет Пабло - относись к жизни как к веселухе, но непродолжительной. @Эш
    triptixДата: Понедельник, 12 Декабря 2016, 18:17 | Сообщение # 8214
    постоянный участник
    Сейчас нет на сайте
    Barbatos, да, скрипт на самом префабе, обьект внутри префаба.
    Вообще, надо анимацию моргания глазами запустить со скрипта на верхнем уровне обьекта.


    Сообщение отредактировал triptix - Понедельник, 12 Декабря 2016, 18:23
    BarbatosДата: Понедельник, 12 Декабря 2016, 18:23 | Сообщение # 8215
    3D-моделлер/Руководитель
    Сейчас нет на сайте
    triptix,
    Я имел ввиду изначально назначить в скрипт префаба его детей и обращаясь к скрипту префаба запрашивать их.
    Но я так понял тебе нужно, что бы каким-то образом префаб знал о своих детях без запроса find и child. Я бы использовал GetChild(int номер чайлда в иерархии).


    Его остатки и на хлеб не намазать. Мой тебе совет Пабло - относись к жизни как к веселухе, но непродолжительной. @Эш
    triptixДата: Понедельник, 12 Декабря 2016, 18:30 | Сообщение # 8216
    постоянный участник
    Сейчас нет на сайте
    Barbatos, Если в префабе "туловище" есть обьект "голова", то какой у нее будет номер чайлда? Чтобы не обратиться к ноге, например. Должен же быть какой то способ.
    Во флеше, например, просто указываешь "тело.голова.глаза.проиграть("моргнуть")"
    berilДата: Понедельник, 12 Декабря 2016, 20:49 | Сообщение # 8217
    Я не ленивый, я — энергосберегающий
    Сейчас нет на сайте
    Цитата triptix ()
    Во флеше, например, просто указываешь "тело.голова.глаза.проиграть("моргнуть")"

    В unity так же..... Или по имени ищи в дочерних или по номеру в иерархии




    Накодил? Убери за собой!
    Инвентарь в Unity(UI)
    Инвентарь в Unity(GUI)
    triptixДата: Понедельник, 12 Декабря 2016, 21:07 | Сообщение # 8218
    постоянный участник
    Сейчас нет на сайте
    beril, как так же? к дочерним напрямую нельзя обратиться.
    В общем, самый быстрый способ какой нашел
    Цитата triptix ()
    изначально назначить
    через перебор
    Цитата triptix ()
    GetChild(int
    , и потом использовать по именам в скрипте.
    Пишут, что через transform как то можно, но я не понял, как.

    Добавлено (12 декабря 2016, 21:07)
    ---------------------------------------------
    Нашел забавную команду Component.GetComponentInChildren и она работает, но как при этом определяется нужный child, не понятно - их же может быть много, с одинаковой анимацией?
    GetComponentInChildren<Animator > ( ).Play ("kick");


    Сообщение отредактировал triptix - Понедельник, 12 Декабря 2016, 21:09
    BarbatosДата: Понедельник, 12 Декабря 2016, 21:39 | Сообщение # 8219
    3D-моделлер/Руководитель
    Сейчас нет на сайте
    triptix,
    У тебя есть тело, у нее в иерархии объектов сначала идет голова(у нее индекс 0), потом левая рука(у нее индекс 1), потом правая рука(у нее индекс 2). Иерархия это список объектов. Чем ближе объект к родителю - тем более низкий у него индекс.

    У тебя в префабе все равно иерархия не меняется.
    Значит:
    Голова = Body.Transform.GetChild(0).gameobject;
    Левая рука = Body.Transform.GetChild(1).gameobject;
    Правая рука= Body.Transform.GetChild(2).gameobject;


    Его остатки и на хлеб не намазать. Мой тебе совет Пабло - относись к жизни как к веселухе, но непродолжительной. @Эш
    triptixДата: Понедельник, 12 Декабря 2016, 22:55 | Сообщение # 8220
    постоянный участник
    Сейчас нет на сайте
    Barbatos, спасибо, понятно

    Добавлено (12 декабря 2016, 22:55)
    ---------------------------------------------
    Barbatos, еще вопрос: в чем кодите? Moho глючный, VS 2015 на месяц только вроде.

    Поиск:

    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг