Подскажите, если ли в unity метод, чтобы создавал желаемое количество точек расположенных на одинаковом расстоянии друг от друга на отрезке АБ?
Специального метода нет, но делается это не трудно. Если ты знаешь длину АБ и знаешь сколько точек нужно, то ты можешь узнать расстояние между ними. После этого, используй просто знание векторной математики.
Код
float dist = new Vector2(Bx-Ax, By-Ay); Vector2 dir = dist.Normalize(); // вычесляем вектор(направление) отрезка point[i] = A + dir * dist * (i+1);// засунь это в цикл от 0 до кол-во точек
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
uslucifer, я бы на вашем месте использовал для этого Vector2.Lerp. Берём начало - a и конец - b, количество точек, затем делим единицу на кол-во точек (это наш шаг) - step и в цикле, умножая это значение на шаг цикла - i, получаем позиции каждой точкой конструкцией вида:
Код
Vector2.Lerp(a, b, step*i)
Вообще, может я даже усложнил, т.к. идёт двенадцатый час моей работы и я малость плохо соображаю.
Вот ещё маленькое задание назрело. Есть небольшой код, генерирующий поле из ячеек (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 не должны спавниться линиями длиннее двух ячеек (по обоим координатам). Каким путём лучше пойти, дабы избежать повторений? #Хийвэл бүү ай, айвал бүү хий.
Повторяем рандом до тех пор, пока текущий индекс строки больше 1 (то есть, по факту как минимум третий), и пока два предыдущих в строке равны полученному рандому. Тоже самое для столбца.
tduk, а ты пробовал при этом менять настройки сопротивления, гравитации, массы у компонента Rigidbody? Конечно, как альтернатива, можно покопать в сторону самописной гравитации или интерполяции/smoothdamp, но вряд ли этот велосипед будет лучше. Особенно, если не знаком с этим. А при условии, что будет обрабатываться какая-никакая коллизия, и Rigidbody так или иначе понадобиться - не пользоваться встроенными средствами не совсем рационально. Поразбирайся, возможно, ты не до конца раскрыл потенциал встроенной физики.
Подскажите норм плагин для Unity в котором можно рисовать норм стены, а именно чтобы текстурка на все участки ровномерно ложилась(имею введу чтобы не сжималась в местах не которых) и что бы можно было стену в 2 или 3 цвета(текстуры) красить. <KS>
Использую для сохранения код сериализации данных (см. ниже). Внутри игры работает, при перезагрузке\выходе с уровней\выходе в главное меню и обратно на уровень всё сохраняется. Выходишь из приложения - сохранения исчезают (в папке файл сохранения остаётся однако). В чём может быть причина? Сперва подумал, что дело в коде игры, но набросал простое приложение на три строчки (войти\сохранить-выйти) и такая же проблема, после выхода данные не сохраняются.
public static void DataLoad(){ if (File.Exists(Application.persistentDataPath + "/savedGames.xml")){ BinaryFormatter bf = new BinaryFormatter(); FileStream file = File.Open (Application.persistentDataPath + "/savedGames.xml", FileMode.Open); Save.savedGames = (List<int>)bf.Deserialize(file); file.Close(); } }
___________
Пляски с бубном не помогли, пришлось прибегнуть к оккультной магии. Однако после десятка принесённых в жертву девственниц испробования различных конфигураций, проблема была решена. Всем спасибо за внимание! #Хийвэл бүү ай, айвал бүү хий.
Сообщение отредактировал Бозингар - Четверг, 01 Декабря 2016, 16:39
triptix, Обратится к скрипту на объекте, который знает своих детей? Его остатки и на хлеб не намазать. Мой тебе совет Пабло - относись к жизни как к веселухе, но непродолжительной. @Эш
triptix, Я имел ввиду изначально назначить в скрипт префаба его детей и обращаясь к скрипту префаба запрашивать их. Но я так понял тебе нужно, что бы каким-то образом префаб знал о своих детях без запроса find и child. Я бы использовал GetChild(int номер чайлда в иерархии). Его остатки и на хлеб не намазать. Мой тебе совет Пабло - относись к жизни как к веселухе, но непродолжительной. @Эш
Barbatos, Если в префабе "туловище" есть обьект "голова", то какой у нее будет номер чайлда? Чтобы не обратиться к ноге, например. Должен же быть какой то способ. Во флеше, например, просто указываешь "тело.голова.глаза.проиграть("моргнуть")"
beril, как так же? к дочерним напрямую нельзя обратиться. В общем, самый быстрый способ какой нашел
Цитатаtriptix ()
изначально назначить
через перебор
Цитатаtriptix ()
GetChild(int
, и потом использовать по именам в скрипте. Пишут, что через transform как то можно, но я не понял, как.
Добавлено (12 декабря 2016, 21:07) --------------------------------------------- Нашел забавную команду Component.GetComponentInChildren и она работает, но как при этом определяется нужный child, не понятно - их же может быть много, с одинаковой анимацией? GetComponentInChildren<Animator > ( ).Play ("kick");
Сообщение отредактировал triptix - Понедельник, 12 Декабря 2016, 21:09
triptix, У тебя есть тело, у нее в иерархии объектов сначала идет голова(у нее индекс 0), потом левая рука(у нее индекс 1), потом правая рука(у нее индекс 2). Иерархия это список объектов. Чем ближе объект к родителю - тем более низкий у него индекс.
У тебя в префабе все равно иерархия не меняется. Значит: Голова = Body.Transform.GetChild(0).gameobject; Левая рука = Body.Transform.GetChild(1).gameobject; Правая рука= Body.Transform.GetChild(2).gameobject; Его остатки и на хлеб не намазать. Мой тебе совет Пабло - относись к жизни как к веселухе, но непродолжительной. @Эш
Добавлено (12 декабря 2016, 22:55) --------------------------------------------- Barbatos, еще вопрос: в чем кодите? Moho глючный, VS 2015 на месяц только вроде.