Воскресенье, 19 Мая 2024, 03:29

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Записи участника » Suntrash [10]
Результаты поиска
SuntrashДата: Пятница, 18 Апреля 2014, 07:59 | Сообщение # 1 | Тема: Инициализация объекта при Instantiate
был не раз
Сейчас нет на сайте
Спасибо, дяденьки, много написали - узнал кое-что полезное.

В целом, после некоторого времени размышлений и марания бумажек стало ясно, что этот кусок действительно можно перенести в Start().
Но, следуя вашим советам, решил сунуть в OnEnable() - выглядит логичнее.

Собственно кусок - это регистрация объекта в глобальном пуле, чтобы другие могли его легко найти. Только у меня есть ситуации, когда он зарегистрируется сильно позже рождения.
Из Awake() и Start() никто другие объекты не ищет (и вряд ли будет).

Дальше осталось для себя понять - как и когда правильно использовать Awake(), Start() и OnEnable(). Но это тема для нового вопроса =)
SuntrashДата: Четверг, 17 Апреля 2014, 16:01 | Сообщение # 2 | Тема: Инициализация объекта при Instantiate
был не раз
Сейчас нет на сайте
Поискал-поискал, да, видно, плохо.

Вопрос коротко.
Инстанциируем объект со скриптом. Как инициализировать паблик переменные этого скрипта до того, как он попадёт в Awake()?

Вопрос развёрнуто.
GameObject objA имеет некий скрипт scrA.
В какой-то момент времени этот скрипт создаёт GameObject objB из префаба.
У objB есть скрипт scrB:
Код

using UnityEngine;
public class scrB : MonoBehaviour
{
     public bool param = true;
     private void Awake()
     {
      if(param)
       Debug.Log("Объект находился на сцене в момент создания");
      else
       Debug.Log("Объект создан скриптом scrA");  // забегая вперёд - эта строчка никогда не сработает
     }
}


Кусок кода в scrA:
Код

private void Update()
{
     if(Input.GetMouseButtonDown(0))
     {
      GameObject _objB = Instantiate(objB) as GameObject;  // если здесь поставить точку останова и двинуться на шаг вперёд, то попадём в Awake() скрипта scrB
      scrB _scrB = _objB.GetComponent<scrB>();   // здесь очень хочется инициализировать param, но Awake() уже отработал...
      _scrB.param = false;        // всё бесполезно...
     }
}


Теперь читаем в начале пункт "Вопрос коротко".

P.S. Да, я знаю про Start(), но важный кусок инициализации (это должно случиться в Awake()) происходит в зависимости от параметра, необходимого к заполнению на этапе конструктора объекта.


Сообщение отредактировал Suntrash - Пятница, 18 Апреля 2014, 08:06
SuntrashДата: Пятница, 21 Февраля 2014, 22:01 | Сообщение # 3 | Тема: Проблема сопровождения движущегося объекта
был не раз
Сейчас нет на сайте
EchoIT, ага, я уже разглядел на docs.unity3d.com

Сообщение отредактировал Suntrash - Пятница, 21 Февраля 2014, 22:02
SuntrashДата: Пятница, 21 Февраля 2014, 21:51 | Сообщение # 4 | Тема: Проблема сопровождения движущегося объекта
был не раз
Сейчас нет на сайте
EchoIT, вот! То, что надо. Как же я это пропустил...
Вопрос решён - скорость одинаковая, всё чистенько сопровождается!
Огромное спасибо smile

Вот, что получилось в коде вращения башни:
Код

head.rotation = Quaternion.RotateTowards(head.rotation,
                      Quaternion.LookRotation(mob.position - head.position),
                      RotateSpeed * Time.deltaTime);
SuntrashДата: Пятница, 21 Февраля 2014, 21:41 | Сообщение # 5 | Тема: Проблема сопровождения движущегося объекта
был не раз
Сейчас нет на сайте
Nasa13, спасибо, дружище. Почитаю.
SuntrashДата: Пятница, 21 Февраля 2014, 21:24 | Сообщение # 6 | Тема: Проблема сопровождения движущегося объекта
был не раз
Сейчас нет на сайте
allods, вот Nasa13 всё верно про рэйкаст написал.
Есть алгоритм выбора моба (по дальности, скорости, жирноте и т.д.) и связанный с ним алгоритм поворота башни.
А есть алгоритм атаки, который с ними не связан. Его дело пускать луч и включать лазер, если под луч попал объект с нужным тегом.

Добавлено (21.02.2014, 21:24)
---------------------------------------------
Nasa13, я никогда не откажусь от ссылок на инфу :) Тем более, что без корутинов серьёзных вещей не сделать, как я понял.

Про Slerp - а какие ещё варианты? Это как раз векторный поворот. Башня же вращается.

Локальный поворот здесь не прокатит - башня внутри префаба находится. У неё локальная система координат своя.

Вот вариант с дочерним объектом впереди моба аналогичен моей придумке.
Я как раз в конце своего поста дописал, что хочу вычислить расстояние, которое моб пройдёт за следующий шаг (тут как раз FixedUpdate нам гарантирует константный шаг по времени). Соответственно буду стремится к этой точке, а не к центру моба.

SuntrashДата: Пятница, 21 Февраля 2014, 18:09 | Сообщение # 7 | Тема: Проблема сопровождения движущегося объекта
был не раз
Сейчас нет на сайте
allods, дык, я же писал
Цитата
...у меня Raycast влияет только на открытие атаки. А моб выбирается из массива мобов еще до начала вращения башни
SuntrashДата: Пятница, 21 Февраля 2014, 17:05 | Сообщение # 8 | Тема: Проблема сопровождения движущегося объекта
был не раз
Сейчас нет на сайте
Nasa13, да, простой Update я пробовал на все скрипты ставить - безрезультатно.
А как там корутин вставить - не знаю. Я не работал с этим. Если конкретнее алгоритм подскажешь -будет здорово :)

Ranger, у меня Raycast влияет только на открытие атаки. А моб выбирается из массива мобов еще до начала вращения башни. Т.о. башня поворачивается на уже известный трансформ (см.первый кусок кода). Поэтому мимо :(
SuntrashДата: Пятница, 21 Февраля 2014, 14:01 | Сообщение # 9 | Тема: Проблема сопровождения движущегося объекта
был не раз
Сейчас нет на сайте
Nasa13, это не то.

Update как раз зависит от fps, а FixedUpdate гарантирует вызов через жесткие промежутки времени (задаются в настройке проекта). Поэтому физику рекомендуют в FixedUpdate.
Про LateUpdate я уже писал - пробовал работу башни туда совать. Это гарантировало то, что физика моба уже отработала. Но не помогло :(
SuntrashДата: Пятница, 21 Февраля 2014, 10:58 | Сообщение # 10 | Тема: Проблема сопровождения движущегося объекта
был не раз
Сейчас нет на сайте
Здравствуйте, граждане.

Делаю tower defense.

Башня следит за заранее выбранным мобом, вовремя его замечает (Raycast), но в начале сопровождения (Quaternion.Slerp) отстаёт от него (проскакивает слежение за центром моба) и далее уже устойчиво сопровождает "хвост". Когда башня начинает доворачивать на моба, но ещё не видит его, то заметно, что угловая скорость поворота башни явно достаточная (с большим запасом).

Кусок кода сопровождения моба (mob) башней (head), вызывается в FixedUpdate:
Код

head.rotation = Quaternion.Slerp(head.rotation,
                        Quaternion.LookRotation(mob.position - head.position),
                        RotateSpeed * Time.deltaTime);

Здесь под башней имеется ввиду дочерний объект (поворотная часть башни), работающий в мировых координатах.

Кусок кода движения моба (transform) к точке (point), вызывается в FixedUpdate:
Код

// Поворот на точку
transform.rotation = Quaternion.Slerp(transform.rotation,
      Quaternion.LookRotation(point.position - transform.position),
      RotateSpeed * Time.deltaTime);

// Движение к точке
if (Vector3.Distance(transform.position, point.position) > DistanceToStop)
      transform.position += transform.forward * MoveSpeed * Time.deltaTime;


Далее в поисках решения:
1) У моба включено Continuous Dynamic и Interpolate.
2) Попробовал сунуть управление башней в LateUpdate - никаких изменений.
3) При пропорциональном изменении RotateSpeed башни и MoveSpeed моба картина почти не меняется - отставание на одно и то же расстояние.
4) При значительном увеличении скорости вращения башни ситуация с сопровождением нормализуется (следим ровно за центром моба), но поворот к следующему мобу происходит почти мгновенно.

Попробовал примерно обрисовать ситуацию.


Буду очень благодарен за помощь!

Добавлено (21.02.2014, 10:58)
---------------------------------------------
Попробую учитывать тангенсальную скорость моба, чтобы сопровождать упреждённую точку. Отпишусь на днях о результатах.

Добавлено (22.02.2014)
РЕШЕНИЕ НАЙДЕНО (СМ.НИЖЕ В ТЕМЕ)
Код

head.rotation = Quaternion.RotateTowards(head.rotation,   
                        Quaternion.LookRotation(mob.position - head.position),   
                        RotateSpeed * Time.deltaTime);


Сообщение отредактировал Suntrash - Суббота, 22 Февраля 2014, 00:33
Форум игроделов » Записи участника » Suntrash [10]
  • Страница 1 из 1
  • 1
Поиск:

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