/// <summary> /// Остановка анимации /// </summary> public void Stop() { float currentTime = 0f; if (IsTransition) { currentTime = time / transLength; } else { if (speed < 0) { currentTime = lastFrame - time; } else { currentTime = firstFrame + time; } } if (meshes != null) { foreach (AnimatedMeshComponent m in meshes) { AnimatedMeshComponent.QueuedMeshUpdate qu = new AnimatedMeshComponent.QueuedMeshUpdate(); qu.FirstFrame = firstFrame; qu.LastFrame = lastFrame; qu.IsLooping = Mode == AnimationMode.Loop; qu.Time = currentTime; m.queuedUpdate = qu; } } Playing = false; }
/// <summary> /// Установка кадра без анимирования /// </summary> /// <param name="frame">Время для установки</param> public void StopWithFrame(float frame) { Stop(); if (meshes == null) { meshes = Parent.GetComponents <AnimatedMeshComponent>(); } if (meshes != null) { foreach (AnimatedMeshComponent m in meshes) { AnimatedMeshComponent.QueuedMeshUpdate qu = new AnimatedMeshComponent.QueuedMeshUpdate(); qu.FirstFrame = 0; qu.LastFrame = MaxTime; qu.IsLooping = false; qu.Time = 0; if (qu.LastFrame > 0) { qu.Time = frame % qu.LastFrame; } m.queuedUpdate = qu; } } }
/// <summary> /// Анимирование меша /// </summary> /// <param name="from">Начальное время</param> /// <param name="to">Конечное время</param> /// <param name="mode">Режим анимации</param> /// <param name="transition">Количество переходных кадров</param> public void Animate(float from, float to, float spd = 1f, AnimationMode mode = AnimationMode.Loop, float transition = 0f) { meshes = Parent.GetComponents <AnimatedMeshComponent>(); if (meshes != null) { // Установка общих значений float oldFirstFrame = firstFrame; float oldLastFrame = lastFrame; float currentTime = 0f; if (IsTransition) { currentTime = time / transLength; } else { if (speed < 0) { currentTime = oldLastFrame - time; } else { currentTime = oldFirstFrame + time; } } bool allowRepeat = Mode == AnimationMode.Loop; speed = spd; firstFrame = from; lastFrame = to; Mode = mode; IsTransition = false; if (firstFrame > lastFrame) { float d = firstFrame; firstFrame = lastFrame; lastFrame = d; } float maxFrame = MaxTime; if (firstFrame < 0) { firstFrame = 0; } if (lastFrame > maxFrame) { lastFrame = maxFrame; } if (transition > 0) { time = -transition; transLength = transition; foreach (AnimatedMeshComponent m in meshes) { AnimatedMeshComponent.QueuedMeshUpdate qu = new AnimatedMeshComponent.QueuedMeshUpdate(); qu.FirstFrame = oldFirstFrame; qu.LastFrame = oldLastFrame; qu.IsLooping = allowRepeat; qu.Time = currentTime; m.queuedTransitionUpdate = qu; } IsTransition = true; } else { time = 0f; } Playing = true; } }
/// <summary> /// Обновление анимации /// </summary> internal override void Update() { if (Playing) { // Рассчёт текущих значений float currentTime = 0f; if (IsTransition) { currentTime = -time / transLength; } else { if (speed < 0) { currentTime = lastFrame - time; } else { currentTime = firstFrame + time; } } // Установка анимации foreach (AnimatedMeshComponent mc in meshes) { AnimatedMeshComponent.QueuedMeshUpdate qu = new AnimatedMeshComponent.QueuedMeshUpdate(); qu.FirstFrame = firstFrame; qu.LastFrame = lastFrame; qu.IsLooping = Mode == AnimationMode.Loop; qu.Time = currentTime; mc.queuedUpdate = qu; } // Обвновление логики if (IsTransition) { time += 1f; if (time > 0) { IsTransition = false; } } else { if (speed == 0 || firstFrame == lastFrame) { Playing = false; } else { time += Math.Abs(speed); if (time > lastFrame - firstFrame) { switch (Mode) { case AnimationMode.OneShot: time = lastFrame; Playing = false; break; case AnimationMode.Loop: time = time % (lastFrame - firstFrame + 1f); break; case AnimationMode.PingPongLoop: time = time % (lastFrame - firstFrame); speed *= -1; break; } } } } } }