Пример #1
0
        private IEnumerator <float> _LateUpdate()
        {
            MovementComponent casterMovementComponent = casterEntity.GetComponent <MovementComponent>();
            Direction         casterFacingDirection   = casterMovementComponent.FacingDirection;
            Vector2           flippedOffset           = info.RagdollModifierConfig.grabOffset.FlipFollowDirection(casterFacingDirection);
            Vector3           originalPos             = targetRenderer.localPosition;

            targetRenderer.localPosition = Vector3.zero;
            Vector2 dragTarget             = (Vector2)casterWristTransform.position + flippedOffset;
            float   initialRadius          = (dragTarget - (Vector2)targetChest.position).magnitude;
            float   radiusReductionElapsed = 0;

            targetRenderer.localPosition = originalPos;
            Vector2 previousPosOfHierarchyRootOfTargetTransform = targetGo.transform.position;

            while (true)
            {
                if (lifetime.IsEnd())
                {
                    break;
                }
                yield return(Timing.WaitForOneFrame);

                originalPos = targetRenderer.localPosition;
                targetRenderer.localPosition = Vector3.zero;
                if (elapsed < timeUntilFall)
                {
                    casterFacingDirection = casterMovementComponent.FacingDirection;
                    flippedOffset         = info.RagdollModifierConfig.grabOffset.FlipFollowDirection(casterFacingDirection);
                    dragTarget            = (Vector2)casterWristTransform.position + flippedOffset;
                    if (shouldGraduallyTranslateToDragTarget)
                    {
                        radiusReductionElapsed += Time.deltaTime;
                        float progress = radiusReductionElapsed / info.RagdollModifierConfig.timeToReachDragTargetIfBehind;
                        progress = Math.Min(1, progress);
                        float   radius = initialRadius * (1 - progress);
                        Vector2 currentPosOfHierarchyRootOfTargetTransform = targetGo.transform.position;
                        Vector2 diff = currentPosOfHierarchyRootOfTargetTransform -
                                       previousPosOfHierarchyRootOfTargetTransform;
                        previousPosOfHierarchyRootOfTargetTransform = currentPosOfHierarchyRootOfTargetTransform;
                        if (info.RagdollModifierConfig.rootCheck)
                        {
                            if (diff == Vector2.zero)
                            {
                                continue;
                            }
                        }
                        Vector2 direction      = ((Vector2)targetChest.position - dragTarget).normalized;
                        Vector2 currentDragPos = dragTarget + direction * radius;
                        Vector2 translation    = currentDragPos - (Vector2)targetChest.position;
                        targetMovementComponent.Move(translation);
                    }
                    else
                    {
                        Vector2 offset = dragTarget - (Vector2)targetChest.position;
                        targetMovementComponent.Move(offset);
                    }
                }
                targetRenderer.localPosition = originalPos;
            }
        }