Управление анимацией покадрово.
| |
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 |
почетный гость
Сейчас нет на сайте
| ЁЖМАЁ. Флаг надо включать, потому что апдэйт фигзнает с какой скоростью обновляется и может пропустить момент конца анимации. Так?
|
|
| |
|