public void FocusTo(float targetScale, Vector2 targetWorldPosition, AnimCallback animMidCB, bool force2PointAnim) { DebugUtility.CheckFloat(targetScale); DebugUtility.CheckFloat(targetWorldPosition); mAnimMidCB = animMidCB; var effectiveTargetScale = m_WorldToViewScale * targetScale; var effectiveTargetTranslation = m_WorldToViewTranslation + (-targetWorldPosition * effectiveTargetScale); if (force2PointAnim || ViewInWorldSpace.Contains(targetWorldPosition)) { mAnimType = AnimType.Anim_2Point; mAnimDuration = 2; m_Scale_Anim_Start = m_Scale; m_Scale_Anim_Target = effectiveTargetScale / m_WorldToViewScale; m_Scale_Anim_Delta = m_Scale_Anim_Target - m_Scale_Anim_Start; m_Translation_Anim_Start = m_Translation; m_Translation_Anim_Target = effectiveTargetTranslation - m_WorldToViewTranslation; m_Translation_Anim_Delta = m_Translation_Anim_Target - m_Translation_Anim_Start; } else { var currentWorldPos = -(m_WorldToViewTranslation_Effective - m_WorldToViewTranslation) / m_WorldToViewScale_Effective; var midWorldPos = 0.5f * (currentWorldPos + targetWorldPosition); float marginPercent = 0.01f; var w = Mathf.Abs(targetWorldPosition.x - currentWorldPos.x) + marginPercent * m_WorldSpace.width; var h = Mathf.Abs(targetWorldPosition.y - currentWorldPos.y) + marginPercent * m_WorldSpace.height; var zw = m_WorldSpace.width / w; var zh = m_WorldSpace.height / h; var z = Mathf.Min(zw, zh); z = Mathf.Min(m_Scale.x, z); var midScale = new Vector2(z, z);//0.5f * (Vector2.one + m_Scale); var effectiveMidScale = m_WorldToViewScale * midScale; var effectiveMidTranslation = m_WorldToViewTranslation + (-midWorldPos * effectiveMidScale); mAnimType = AnimType.Anim_3Point; m_Scale_Anim_Start = m_Scale; m_Scale_Anim_Mid = midScale; m_Scale_Anim_Target = effectiveTargetScale / m_WorldToViewScale; m_Scale_Anim_Delta = m_Scale_Anim_Mid - m_Scale_Anim_Start; m_Scale_Anim_Mid_Delta = m_Scale_Anim_Target - m_Scale_Anim_Mid; m_Translation_Anim_Start = m_Translation; m_Translation_Anim_Mid = effectiveMidTranslation - m_WorldToViewTranslation; m_Translation_Anim_Target = effectiveTargetTranslation - m_WorldToViewTranslation; m_Translation_Anim_Delta = m_Translation_Anim_Mid - m_Translation_Anim_Start; m_Translation_Anim_Mid_Delta = m_Translation_Anim_Target - m_Translation_Anim_Mid; mAnimDuration = 4; } mbAnimated = true; mAnimTimer = new System.Diagnostics.Stopwatch(); mAnimTimer.Start(); }