Exemple #1
0
        protected override void OnUpdate(float dt)
        {
            justChanged = false;
            if (IsFinish())
            {
                return;
            }

            elapsed += dt;

            if (elapsed >= timeUntilReturnToIdle && !isReturnToIdleStarted)
            {
                isReturnToIdleStarted = true;
                if (targetEntity.GetComponent <HealthComponent>().IsAlive())
                {
                    targetAnimation.Animation.PlayAnimation(
                        animProfile.LieToIdle(), 1, PlayMethod.Crossfade, .1f
                        );
                    targetAnimation.Animation.PlayAnimation(
                        AnimationName.IDLE, 1, PlayMethod.Queue, 0
                        );
                }
                //DLog.Log("Return to idle");
            }

            if (elapsed >= timeUntilFall)
            {
                if (!isOnGroundAnimationPlayed)
                {
                    justChanged = true;
                    state       = MainModifierState.Air;
                    //DLog.Log("RagdollModifier: state: " + state);
                    isOnGroundAnimationPlayed = true;
                    JointHierarchyAdjustment jha = targetGo.GetComponentInChildren <JointHierarchyAdjustment>();
                    if (jha != null)
                    {
                        jha.UndoAdjustment();
                    }
                    targetAnimation.Animation.UnpauseAnimation();
                    targetAnimation.Animation.PlayAnimation(animProfile.FallLoop());
                    SetEnableDynamicBones(false);

                    MovementComponent targetMc = targetEntity.GetComponent <MovementComponent>();
                    targetMc.UpdateGround();
                    float s       = targetMc.Position.y;
                    float t       = info.RagdollModifierConfig.timeToFall;
                    float v0      = info.RagdollModifierConfig.initSpeedOfFall;
                    float gravity = 2 * (s - v0 * t) / (t * t);
                    fallRequest = new FallRequest(gravity);
                    targetMc.AbortAllRequests();
                    targetMc.AddMovementRequest(fallRequest);
                    //DLog.Log("Fall");
                }
            }

            if (elapsed >= timeUntilGround && !isGrounded)
            {
                justChanged = true;
                state       = MainModifierState.Ground;
                //DLog.Log("RagdollModifier: state: " + state);
                isGrounded = true;
                targetAnimation.Animation.PlayAnimation(animProfile.FallToLie());
                targetAnimation.Animation.JumpToFrame(info.RagdollModifierConfig.onGroundAnimationStartFrame);
                targetAnimation.Animation.QueueAnimation(animProfile.LieLoop());
                //DLog.Log("Lie");
            }

            if (fallRequest != null)
            {
                if (fallRequest.IsCompleted())
                {
                    if (!isEventTriggered)
                    {
                        isEventTriggered = true;
                        TriggerEvents();
                    }
                }
            }

            if (vfxLogic != null)
            {
                vfxLogic.Update(dt);
            }

            if (elapsed >= duration)
            {
                lifetime.End();
            }
        }