void Optimize() { if (m_List.Count <= 1) { return; } float push_time = m_List[0].PushTime; float push_position_normal = m_List[0].PushPosition; float push_position_critical = m_List[0].PushPositionCritical; float push_position_critical_dot = m_List[0].PushPositionCriticalDot; float push_position_dot = m_List[0].PushPositionDot; float last_time = -10f; float last_position = 0f; eTextPushType last_push_type = eTextPushType.Normal; for (int i = m_List.Count - 1; i >= 0; --i) { TextAnimation animation = m_List[i]; if (animation.IsPlaying == false) { continue; } bool is_optimize = false; if (push_time > 0f) { float time = animation.PlaybackTime; if (time - last_time < push_time) { animation.PlaybackTime = last_time + push_time; is_optimize = true; } last_time = animation.PlaybackTime; } float local_push_position = 0f; if (i != m_List.Count - 1) { switch (last_push_type) { case eTextPushType.Dot: local_push_position += push_position_dot; break; case eTextPushType.Critical: local_push_position += push_position_critical; break; case eTextPushType.CriticalDot: local_push_position += push_position_critical_dot; break; default: local_push_position += push_position_normal; break; } } switch (animation.PushType) { case eTextPushType.Dot: local_push_position += push_position_dot; break; case eTextPushType.Critical: local_push_position += push_position_critical; break; case eTextPushType.CriticalDot: local_push_position += push_position_critical_dot; break; default: local_push_position += push_position_normal; break; } if (local_push_position > 0f) { float pos = animation.CurrentPosition; if (pos - last_position < local_push_position) { animation.AddPosition += last_position + local_push_position - pos; last_position = animation.CurrentPosition; is_optimize = true; } else { last_position = pos; } } last_push_type = animation.PushType; if (is_optimize == true) { animation.Sample(); } } }