private void LateUpdate() { if (GameManager.Instance.IsLoadingLevel || Dungeon.IsGenerating) { return; } if (AttachTarget != null) { if (AttachTarget is AIActor && (!AttachTarget || AttachTarget.healthHaver.IsDead)) { Destroy(gameObject); return; } m_targetLength = ScarfLength; bool flag = false; if (AttachTarget is PlayerController) { PlayerController playerController = AttachTarget as PlayerController; m_mr.enabled = (playerController.IsVisible && playerController.sprite.renderer.enabled); m_mr.gameObject.layer = playerController.gameObject.layer; if (playerController.FacingDirection <= 155f && playerController.FacingDirection >= 25f) { flag = true; } if (playerController.IsFalling) { m_targetLength = 0.05f; } } else if (AttachTarget is AIActor) { AIActor AIActorController = AttachTarget as AIActor; m_mr.enabled = (AIActorController.sprite.renderer.enabled); m_mr.gameObject.layer = AIActorController.gameObject.layer; if (AIActorController.FacingDirection <= 155f && AIActorController.FacingDirection >= 25f) { flag = true; } if (AIActorController.IsFalling) { m_targetLength = 0.05f; } } m_currentLength = Mathf.MoveTowards(m_currentLength, m_targetLength, BraveTime.DeltaTime * 2.5f); if (m_currentLength < 0.1f) { m_mr.enabled = false; } Vector2 lastCommandedDirection = new Vector2(0, 0); if (AttachTarget is PlayerController) { lastCommandedDirection = (AttachTarget as PlayerController).LastCommandedDirection; } else if (AttachTarget is AIActor) { // float X = (AttachTarget as AIActor).aiAnimator.FacingDirection; // lastCommandedDirection = new Vector2(X, X); if (AttachTarget.specRigidbody) { lastCommandedDirection = AttachTarget.specRigidbody.Velocity; } } if (lastCommandedDirection.magnitude < 0.125f) { m_isLerpingBack = true; } else { m_isLerpingBack = false; } float num = m_lastVelAngle; if (m_isLerpingBack) { float num2 = Mathf.DeltaAngle(m_lastVelAngle, -45f); float num3 = Mathf.DeltaAngle(m_lastVelAngle, 135f); float num4 = ((num2 <= num3) ? 0 : 180); num = num4; } else { num = BraveMathCollege.Atan2Degrees(lastCommandedDirection); } m_lastVelAngle = Mathf.LerpAngle(m_lastVelAngle, num, BraveTime.DeltaTime * AngleLerpSpeed * Mathf.Lerp(1f, 2f, Mathf.DeltaAngle(m_lastVelAngle, num) / 180f)); float d = m_currentLength * Mathf.Lerp(2f, 1f, Vector2.Distance(transform.position.XY(), AttachTarget.sprite.WorldCenter) / 3f); m_currentOffset = (Quaternion.Euler(0f, 0f, m_lastVelAngle) * Vector2.left * d).XY(); Vector2 b = Vector2.Lerp(MinOffset, MaxOffset, Mathf.SmoothStep(0f, 1f, Mathf.PingPong(Time.realtimeSinceStartup * AnimationSpeed, 3f) / 3f)); m_currentOffset += b; Vector3 vector = AttachTarget.sprite.WorldCenter + new Vector2(0f, -0.3125f); Vector3 vector2 = vector + m_currentOffset.ToVector3ZisY(-3f); float num5 = Vector3.Distance(transform.position, vector2); if (num5 > 10f) { transform.position = vector2; } else { transform.position = Vector3.MoveTowards(transform.position, vector2, BraveMathCollege.UnboundedLerp(1f, 10f, num5 / CatchUpScale) * BraveTime.DeltaTime); } Vector2 b2 = vector2.XY() - transform.position.XY(); m_additionalOffsetTime += UnityEngine.Random.Range(0f, BraveTime.DeltaTime); BuildMeshAlongCurve(vector, vector.XY() + new Vector2(0f, 0.1f), transform.position.XY() + b2, transform.position.XY(), (!flag) ? ForwardZOffset : BackwardZOffset); m_mesh.vertices = m_vertices; m_mesh.RecalculateBounds(); m_mesh.RecalculateNormals(); } }