Вопрос-[ответ] по Unity
| |
QWER56 | Дата: Понедельник, 09 Августа 2010, 10:58 | Сообщение # 1 |
старожил
Сейчас нет на сайте
| Вопрос-[Ответ] по Unity3d
База скриптов Unity3d Курс Уроков по Unity 3D от Alcatraz
ConsMark - поисковик по интернет магазинам.
Сообщение отредактировал QWER56 - Вторник, 26 Июля 2011, 20:54 |
|
| |
Lertmind | Дата: Пятница, 10 Июня 2016, 23:17 | Сообщение # 7901 |
заслуженный участник
Сейчас нет на сайте
| Цитата Бозингар ( ) Как можно изменить цвет примитивного объекта? По умолчанию у них материал, который нельзя изменить, надо создать новый материл в панели Project, настроить и перетащить на объект.
|
|
| |
AO | Дата: Суббота, 11 Июня 2016, 14:32 | Сообщение # 7902 |
был не раз
Сейчас нет на сайте
| Цитата Lertmind ( ) По умолчанию у них материал, который нельзя изменить, надо создать новый материл в панели Project, настроить и перетащить на объект. Можно это как-то через скрипт сделать?
|
|
| |
GameBit | Дата: Воскресенье, 12 Июня 2016, 09:04 | Сообщение # 7903 |
был не раз
Сейчас нет на сайте
| Собираюсь реализовать внутриигровые покупки в андроиде на Open AB. Вопрос- как получить в коде (желательно на JS) валюту покупки и стоимость, чтобы отображать в разных странах местные валюты( В России - рубли, в США - доллары и тд). Заранее благодарен за ответ или ссылку на тутор
|
|
| |
Бозингар | Дата: Воскресенье, 12 Июня 2016, 23:09 | Сообщение # 7904 |
почетный гость
Сейчас нет на сайте
| Как определить угол вектора движения объекта? На каждый конкретный угол движения (90°, 180°, 45° etc) привязано определённое действие. Допустим, анимация. Как узнать, в каком направление движется объект?
Объект не поворачивает, манипуляции с quaternion не помогут (иначе бы не спрашивал). Просто движется влево\вправо\в угол при помощи rigidbody.
#Хийвэл бүү ай, айвал бүү хий.
|
|
| |
Lertmind | Дата: Понедельник, 13 Июня 2016, 01:41 | Сообщение # 7905 |
заслуженный участник
Сейчас нет на сайте
| Бозингар, тебе точно надо знать угол? Если управление через Input.GetAxis(), то легко определить одно из 8 направлений.
Если всё-таки надо угол, то можно вычислить с помощь Atan2:
Код float a = Mathf.Atan2(velocity.z, velocity.x) * Mathf.Rad2Deg; // Преобразуем в положительный угол if (a < 0f) a += 360f; // По часовой стрелки a = 360f - a; // Поворачиваем на 180 a = Mathf.Repeat(a + 180f, 360f); Где velocity скорость объекта (является также направлением) и предполагается, что угол на плоскости XZ, а 0 градусов это вектор Vector3.left. Замечу, что последние два действия не обязательны, так как это только для отсчёта как у тебя на картинке. Другой вариант вычисления через Vector3.Angle, там возвращается всегда положительный минимальный угол, следовательно тоже надо делать проверки для получения угла больше 180.
Скорость (velocity) можно получить сохраняя предыдующую позицию:
Код using UnityEngine;
public class MyScript : MonoBehaviour { Vector3 prevPosition;
void Start() { prevPosition = transform.position; } void Update() { Vector3 velocity = (transform.position - prevPosition) / Time.deltaTime; prevPosition = transform.position; // Возвращает для 0-180: [0, 180], для 180-360: [-180, 0] float a = Mathf.Atan2(velocity.z, velocity.x) * Mathf.Rad2Deg; // Преобразуем в положительный угол if (a < 0f) a += 360f; // По часовой стрелки a = 360f - a; // Поворачиваем на 180 a = Mathf.Repeat(a + 180f, 360f); print(a + " " + velocity); } } Деление на Time.deltaTime необязательно, тогда это будет просто направление движения. Ещё у Rigidbody есть свойство velocity, но оно изменяется только при движении с помощью физических сил.
Чтобы узнать направление, как константу (от 0 до 7), смещаем угол на 360f/8f/2f == 22.5f, делим на 360f/8f == 45f и округляем вниз:
Код int index = (int)(Mathf.Repeat(a + 22.5f, 360f) / 45f); Где a - наш угол. Для 10 градусов будет индекс 0, для 40 - 1, для 92 - 2 и так далее.
|
|
| |
Бозингар | Дата: Понедельник, 13 Июня 2016, 10:15 | Сообщение # 7906 |
почетный гость
Сейчас нет на сайте
| Lertmind, благодарю; теперь ясно, в какую сторону копать.
#Хийвэл бүү ай, айвал бүү хий.
Сообщение отредактировал Бозингар - Вторник, 14 Июня 2016, 10:32 |
|
| |
Geonics | Дата: Четверг, 16 Июня 2016, 20:58 | Сообщение # 7907 |
был не раз
Сейчас нет на сайте
| Всем привет! Я не программист, прошу заранее меня простить за невежество. Есть идея сделать военную стратегическую игру в 3D. На большой карте с провинциями, с рельефом двигаются юниты (танки, бронетехника, пехота), над рельефом на определённой высоте самолёты и вертолёты, с транспортных самолётов десант высаживается. На морских участках карты перемещаются боевые корабли и подлодки. Подойдёт Unity для этого?
|
|
| |
Lertmind | Дата: Четверг, 16 Июня 2016, 21:05 | Сообщение # 7908 |
заслуженный участник
Сейчас нет на сайте
| Geonics, большинство 3D движков подойдёт, Unity в том числе.
|
|
| |
Geonics | Дата: Четверг, 16 Июня 2016, 21:24 | Сообщение # 7909 |
был не раз
Сейчас нет на сайте
| Цитата Lertmind ( ) Geonics, большинство 3D движков подойдёт, Unity в том числе. Благодарю, буду осваивать.
|
|
| |
Lertmind | Дата: Четверг, 16 Июня 2016, 21:45 | Сообщение # 7910 |
заслуженный участник
Сейчас нет на сайте
| Geonics, к тому же, стратегии обычно не имеют продвинутой графики и, в случае чего, есть возможность портирования на мобильные платформы, а Unity де-факто движок #1 для мобилок.
|
|
| |
Бозингар | Дата: Суббота, 18 Июня 2016, 15:50 | Сообщение # 7911 |
почетный гость
Сейчас нет на сайте
| Создать массив префабов из ресурсов и инстантить их в рандомном порядке - какие есть варианты? Resources.LoadAll использовать?
Ладно, хрен с ним, разобрался.
#Хийвэл бүү ай, айвал бүү хий.
Сообщение отредактировал Бозингар - Суббота, 18 Июня 2016, 16:19 |
|
| |
IAmStupidNoobLOOL | Дата: Вторник, 21 Июня 2016, 21:44 | Сообщение # 7912 |
был не раз
Сейчас нет на сайте
| Если сделать public Script myScipt; и закинуть туда GO со скриптом Script, и обращаться к переменной из этого скрипта (myScript.variable) каждый кадр, это будт == SomeGO.GetComponent<Script>().variable? (так же, каждый кадр) Т.е. переменная компонента есть GetComponent для GO на котором висит скрипт и по скорости это не уступает обычной записи GO.GetComponent, или это не так?
Ваша подпись: - Максимум 600 символов - BB-коды запрещены
Сообщение отредактировал IAmStupidNoobLOOL - Вторник, 21 Июня 2016, 21:47 |
|
| |
Lertmind | Дата: Вторник, 21 Июня 2016, 22:15 | Сообщение # 7913 |
заслуженный участник
Сейчас нет на сайте
| IAmStupidNoobLOOL, равнозначно, но GetComponent намного медленнее, чем обращение через переменную myScript. Сохранение ссылки на компонент в переменной называют кэшированием, недавно была статья об этом Особенности кэширования компонентов в Unity3D.
Сообщение отредактировал Lertmind - Вторник, 21 Июня 2016, 22:16 |
|
| |
IAmStupidNoobLOOL | Дата: Среда, 22 Июня 2016, 03:06 | Сообщение # 7914 |
был не раз
Сейчас нет на сайте
| Не так выразился, то, что это дно и тоже действия я в курсе, просто в плане производительности разница есть или нет интересовался. Просто скармливаю все же GO... Профайлить пока возможности нет. Но как я понял тут свои тонкости серриализации. И еще... Все наверно помнят игру Space Rangers (Космические рейнджеры)... Так вот, как организовать смену систем, посадку на планету, станцию и т.д. как там? В плане архитектуры, т.е. каждая система - отдельная сцена? Или выключать префабы сцен кроме текущей? Так же и с планетами. Если делать отдельные сцены для каждой системы\планеты, возникает геморрой с сохранением кучи полей, начиная от расположения планет до состояния кораблей НПС, к тому же придется хоть как-то просчитывать "жизнь" ботов когда игрок в другой сцене (системе)... А если сделать все это префабами, то, допустим, выключили системы (т.е. планеты, солнце) но корабли все гуляют, воюют, хотя мы их невидим. Как-то неоптимально получается. Короче, хочется и с сохранением не возится, и жизнь ботами обеспечить... (игра не пошаговая) В общем, какой подход по вашему будет оптимальным? Я так-то если что с юнити хорошо знаком, так что с объяснением проблем не возникнет...
Ваша подпись: - Максимум 600 символов - BB-коды запрещены
Сообщение отредактировал IAmStupidNoobLOOL - Среда, 22 Июня 2016, 03:16 |
|
| |
xMoonGuarDx | Дата: Среда, 22 Июня 2016, 05:48 | Сообщение # 7915 |
участник
Сейчас нет на сайте
| Цитата IAmStupidNoobLOOL ( ) Не так выразился, то, что это дно и тоже действия я в курсе, просто в плане производительности разница есть или нет интересовался. Просто скармливаю все же GO... Профайлить пока возможности нет. Но как я понял тут свои тонкости серриализации. В статье, что Lertmind, скинул выше скинул, как раз идет речь о производительности и сравнении методов. Почитайте. Очень смутно помню SR. Если будете делать каждую систему, как префаб, то тут явно вам поможет такой шаблон, Пул Объектов. Так как наверняка префаб системы будет большим и постоянно вызываться. Только не забывайте при убирании его в пул, обнулять состояние системы и обновлять, когда достаете из него. Жизнью ботов пусть занимается какой-нибудь менеджер ботов, который помечен, как неубиваемый объект при смене сцен (если у вас несколько игровых сцен). Только упростите логику просчетов поведения ботов, когда они не видны игроку.
|
|
| |
Lertmind | Дата: Среда, 22 Июня 2016, 08:08 | Сообщение # 7916 |
заслуженный участник
Сейчас нет на сайте
| IAmStupidNoobLOOL, мои мысли про Космических Рейнджеров: использовать для системы одну сцену и подгружать префабы планет и другие характеристики при переходе в другую систему. Вычисления симуляции AI надо минимизировать и упростить, иначе будет слишком много расчётов, например не хранить позицию в системе и двигать корабль, а иметь среднее время пребывание в системе, чтобы рассчитать когда бот отправится в другую систему. Надо будет размазывать вычисления по времени, будет глупо каждый кадр вычислять характеристики всех ботов, если он не в текущей системе. Главная мысль, как всегда, обмануть игрока, чтобы он поверил в симуляцию.
|
|
| |
Vicka | Дата: Четверг, 23 Июня 2016, 11:00 | Сообщение # 7917 |
Another ART
Сейчас нет на сайте
| блин воткнулось рожками мне нужно найти обжект на котором висит скрипт в котором есть всего одна переменная и отдать его имя таргет камеры чет не робает
Код public void findTarget() { targets = GameObject.FindGameObjectsWithTag("hiro");
foreach (GameObject This in targets) { if (GameObject.FindGameObjectWithTag("hiro").GetComponent<ThisActive>().thisActive) { targThis = This;
} } }
|
|
| |
AndVolkoV | Дата: Четверг, 23 Июня 2016, 11:36 | Сообщение # 7918 |
участник
Сейчас нет на сайте
| Vicka, Попробуй, переписать так, может получится:
Код
foreach (GameObject t in targets) { if (t.GetComponent<ThisActive>().thisActive){ targThis = t; } }
Сообщение отредактировал AndVolkoV - Четверг, 23 Июня 2016, 11:36 |
|
| |
ShortKedr | Дата: Четверг, 23 Июня 2016, 12:05 | Сообщение # 7919 |
Renword Studio
Сейчас нет на сайте
| Vicka, ошибочка вышла) Попробуй вот так)
Код public void FindTarget() { //Тип данных лучше всегда указывать GameObject[] targets = GameObject.FindGameObjectsWithTag("hiro");
foreach (GameObject target in targets) { if (target.GetComponent<ThisActive>().thisActive) { targThis = target;
} } }
Сообщение отредактировал ShortKedr - Четверг, 23 Июня 2016, 12:18 |
|
| |
Vicka | Дата: Четверг, 23 Июня 2016, 12:35 | Сообщение # 7920 |
Another ART
Сейчас нет на сайте
| ShortKedr, ага разобралась сябки) +++
|
|
| |
|