Пятница, 29 Марта 2024, 09:50

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Управление анимацией покадрово. (Код и переменная текущего кадра данной анимации)
Управление анимацией покадрово.
NOVAДата: Среда, 07 Декабря 2011, 23:48 | Сообщение # 1
почетный гость
Сейчас нет на сайте
В связи с тем, что fps игры постоянно скачет, то таймер на длину анимации работает неадекватно. А именно: Имеем анимацию разворота ГГ (TURN) кадров на 15, по окончании анимации надо его развернуть в противоположную сторону gameObject.transform.rotation = new Quaternion (0,180,0,0). Если fps игры тупит, то получается полная х.... (скорость анимации не соответствует скорости таймера).
В общем я думаю, можно ведь с помощью каких-то переменных контролировать текущий кадр. Например {frame+=1}; if (frame = 14) {развернуть ГГ}.
Это типа использования счётчиков для сложной анимации.


RipDevДата: Суббота, 10 Декабря 2011, 15:05 | Сообщение # 2
гейм-дизайнер
Сейчас нет на сайте
NOVA, FixedUpdate() не помогает?

Добавлено (10.12.2011, 15:05)
---------------------------------------------

Quote (RipDev)
gameObject.transform.rotation = new Quaternion (0,180,0,0). Если fps игры тупит, то получается полная х.... (скорость анимации не соответствует скорости таймера).

Т.е после лага Анимация продолжается, а не прыгает как должно было быть?


Взгляни на сей изукрашенный образ, на тело, полное изъянов, составленное из частей, болезненное, исполненное многих мыслей, в которых нет ни определённости, ни постоянства.
noTformaTДата: Суббота, 10 Декабря 2011, 15:19 | Сообщение # 3
Ukrainian independent game developer
Сейчас нет на сайте
NOVA, ммм, может что-то путаю, или не знаю...
Но, анимация в Юнити3Д привязана к времени, а не к кадрам. Длительность анимации измеряется в секундах. Текущая позиция анимации - тоже в секундах. Понятия кадра в юнити нет, есть только Апдейт сцены, который идет немного асинхронее отрисовки графических данных (фпс/FPS).

Поэтому встречные вопросы:
Как ты проигрываешь анимацию? Как ты ее вообще привязал к кадрам? Зачем привязывать анимацию к кадром, если фпс в юнити не статический?


@noTformaT
NOVAДата: Суббота, 10 Декабря 2011, 19:47 | Сообщение # 4
почетный гость
Сейчас нет на сайте
noTformaT,
А пробовал импортировать объект с полным набором анимации? Там она потом разбивается покадрово. Я работаю с 3d max.
Как я проигрываю анимацию. Вот стоит перс. У него идёт анимация стойки 1. Нажимаю вниз. должна проиграться анимация приседания, потом анимация дыхания сидя. Вот анимация приседания равна 4 кадрам например. Я ставлю счётчик. nf=0; nf+=1; if nf>4, то анимация стоп и играем анимацию в положении сидя. Упор на реалистичную плавную анимацию до мелочей. Фишка в том что весь код находится в update. Но счётчик работает не синхронно фпс, а посему иногда анимация то недопроигрывается, то зацикливается. А вот если переменную воткнуть в скрипт типа как в гамаке "проиграть кадр анимации nf" никаких проблем не будет.

Добавлено (10.12.2011, 19:47)
---------------------------------------------
RipDev, Что за FixedUpdate()? и куда его писать?


M1ghtMortalДата: Воскресенье, 11 Декабря 2011, 11:55 | Сообщение # 5
участник
Сейчас нет на сайте
Вот в официальной справке про FixedUpdate.
А писать его там же где и простой Update, они просто вызываются в разное время. Но когда конкретно FixedUpdate вызывается я не знаю.


Java/C++/Unity(C#) Programmer.
Мой блог MightMortal.RU
noTformaTДата: Воскресенье, 11 Декабря 2011, 14:40 | Сообщение # 6
Ukrainian independent game developer
Сейчас нет на сайте
ммм, я так и не понял зачем вам апдейты.... Все апдейты управляют обновлением логики игры, но не как не отображением графики... ФикседАпдейт используется для расчетов РигидБоди, тоесть если двумя словами - это расчет логики физики.

Quote (NOVA)
А пробовал импортировать объект с полным набором анимации? Там она потом разбивается покадрово.

ммм, в 3Д Максе анимация задается не по секундам, а по кадрам?
Не может такого быть.

в юнити3д нет понятия кадра. Есть только Апдейт Логики, и апдейт графики, но, это разные и ассинхронные события.

Посмотри официальный туториал, про анимацию. Там все просто. В 3д максе делают две анимации для рук. Первая - персонаж стреляет, вторая - персонаж перезаряжает оружие. Никакими Апдейтами там не пользуются.


@noTformaT
SnakeRДата: Воскресенье, 11 Декабря 2011, 15:31 | Сообщение # 7
постоянный участник
Сейчас нет на сайте
noTformaT, в максе как и в юньке анимация покадровая, только кадры не в смысле FPS а кадр анимации, аналогия в 2д это один рисунок - один кадр анимации.
В максе точно также в каждом кадре ты задаешь положение объекта, а потом эти кадры один за одним воспроизводятся как мультик =)
Юнька как раз позволяет воспроизводить анимацию не всю, а определенные ее кадры для нужного действия.
Т.е. нажали кнопку, воспроизвели 5 кадров анимации, персонаж присел.


Unity3D Developer
Ваш лучший помощник при разработке в Unity3D
noTformaTДата: Воскресенье, 11 Декабря 2011, 15:48 | Сообщение # 8
Ukrainian independent game developer
Сейчас нет на сайте
SnakeR, тогда в чем проблема, если animation.Play("название_анимации"); проигрывается не относительно фпс, а относительно своего времени? Хоть 5 фпс, хоть 999 фпс, все равно результат тот же....

@noTformaT
NOVAДата: Пятница, 16 Декабря 2011, 17:35 | Сообщение # 9
почетный гость
Сейчас нет на сайте
Quote (noTformaT)
ммм, в 3Д Максе анимация задается не по секундам, а по кадрам? Не может такого быть.


Я выставляю движения ключевыми кадрами, работаю с максом лет 5. Так что может.

Quote (noTformaT)
animation.Play("название_анимации"); проигрывается не относительно фпс, а относительно своего времени? Хоть 5 фпс, хоть 999 фпс, все равно результат тот же....


ЛОГИКА
У меня например в update стоит условие:Икс=Икс+1. Если икс=24, то анимация стоп, перейти в другой статус ГГ и другую анимацию.

Если анимация соответствует времени, а апдэйт ФПСу, как они могут синхронно работать?

ФПС упало, икс до 24 добегает дольше, а время анимации не меняется, соответственно начинаются либо обрывы анимации, либо повторения.

Кому ещё чего не понятно? Разскажите лучше про фиксет апдейт. как работает и куда лепить?




Сообщение отредактировал NOVA - Воскресенье, 18 Декабря 2011, 22:09
seamanДата: Пятница, 16 Декабря 2011, 18:17 | Сообщение # 10
старожил
Сейчас нет на сайте
Так нельзя работать в игровых движках. Если Вы внимательно посмотрите на импортированный файл, то увидите, что там четко написан fps для которого создана анимация:

Не уверен, что FixedUpdate поможет. Движки работают по времени анимации, а не по кадрам. Работайте и Вы тоже.
Quote
как работает и куда лепить?

Вам уже ответил M1ghtMortal. Что Вам еще надо?
NOVAДата: Пятница, 16 Декабря 2011, 22:24 | Сообщение # 11
почетный гость
Сейчас нет на сайте
seaman, важаемый. Мы с Вами глубоко друг друга не понимаем.

Я ставлю счётчик, который работает по фпс игры. Сколько двиг раз обращается к апдейт ГГ, складывая переменную счётчика, столько ВРЕМЕНИ и проигрывается анимация. То есть FPS юнити это одно непостоянное измерение и оно НЕ РАВНО 30, а время анимации равно 30. Где логика в Ваших изречениях.

Quote (M1ghtMortal)
А писать его там же где и простой Update, они просто вызываются в разное время. Но когда конкретно FixedUpdate вызывается я не знаю.

Ключевое слово здесь "не знаю", потому что я уже писал его и где простой апдэйт. ГГ просто встал и не реагировал.
Тогда вопрос надо поставить так: Как сделать, чтобы по окончании одной анимации переменная stat меняла значение (да и вообще как поставить условие чётко на конец анимации)? Вот тогда точно багов не будет.


seamanДата: Пятница, 16 Декабря 2011, 22:35 | Сообщение # 12
старожил
Сейчас нет на сайте
Quote
То есть FPS юнити это одно непостоянное измерение и оно НЕ РАВНО 30, а время анимации равно 30.

Это не так. При ИМПОРТЕ число кадров в секунду было взято равным 30. Исходя из этого было рассчитано время анимации, которое выдает AnimationClip.length. В игре время анимации зависит от fps пропорционально пропорционально времени при fps=30.
Но в-общем не в этом дело. Почему Вы не хотите использовать встроенные фичи Юнити, а не изобретать велосипед? Почему не использовать это:
Animation.IsPlaying для проверки проигрывается ли еще Ваша анимация? Почему не использовать это: AnimationState? Зачем городить огород?
NOVAДата: Пятница, 16 Декабря 2011, 23:16 | Сообщение # 13
почетный гость
Сейчас нет на сайте
seaman, Во! Уже лучше. Про Фпс не совсем ясно, зато выявилась тенденция реализации проблемы.

Итак:

if (stat==1)
{animation.Play(to Run);
if (!animation.IsPlaying("to Run") && нажато бег влево)
{animation.Play(Run);
}
}
Чота типо того?


seamanДата: Пятница, 16 Декабря 2011, 23:44 | Сообщение # 14
старожил
Сейчас нет на сайте
Не совсем. Запускать анимацию нужно один раз. Вы же будете запускать ее каждый кадр. Т.е. нужно при запуске анимации еще установить какой-то флаг и проверять его. Типа:
Code
bool flag;

...
if (stat==1 && !flag)
{
      animation.Play("to Run");
      flag = true;
}
if (flag && !animation.IsPlaying("to Run") &&нажато бег влево)
{
      animation.Play(Run);
}


Сообщение отредактировал seaman - Пятница, 16 Декабря 2011, 23:46
NOVAДата: Суббота, 17 Декабря 2011, 00:29 | Сообщение # 15
почетный гость
Сейчас нет на сайте
ЁЖМАЁ. Флаг надо включать, потому что апдэйт фигзнает с какой скоростью обновляется и может пропустить момент конца анимации. Так?

Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Управление анимацией покадрово. (Код и переменная текущего кадра данной анимации)
  • Страница 1 из 1
  • 1
Поиск:

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