/// <summary> /// 根据刚体速度更新惯性 /// </summary> /// <param name="rect">要微调的UI</param> /// <param name="inertia">惯性设置</param> private void UpdateInertanceByVelocity(RectTransform rect, InertiaWithHud inertia) { SpacecraftEntity main = GetMainEntity(); if (main == null) { return; } Transform mainShadow = main.GetSyncTarget(); if (mainShadow == null) { return; } Rigidbody rigidbody = mainShadow.GetComponent <Rigidbody>(); if (rigidbody == null) { return; } SpacecraftMotionComponent mainMotion = main.GetEntityComponent <SpacecraftMotionComponent>(); if (mainMotion == null) { return; } SpacecraftMotionInfo cruiseMotion = mainMotion.GetCruiseModeMotionInfo(); Vector3 velocity = rigidbody.transform.InverseTransformDirection(rigidbody.velocity); float forwardSpeed = velocity.z; float forwardSpeedMax = cruiseMotion.LineVelocityMax.z; float forwardSpeedPercent = Mathf.Clamp01(Mathf.Abs(forwardSpeed) / Mathf.Abs(forwardSpeedMax)); float upSpeed = velocity.y; float upSpeedMax = cruiseMotion.LineVelocityMax.y; float upSpeedPercent = Mathf.Clamp01(Mathf.Abs(upSpeed) / Mathf.Abs(upSpeedMax)); float rotationSpeed = rigidbody.angularVelocity.y * Mathf.Rad2Deg; float rotationSpeedMax = cruiseMotion.AngularVelocityMax.y; float rotationSpeedPercent = Mathf.Clamp01(Mathf.Abs(rotationSpeed) / Mathf.Abs(rotationSpeedMax)); float forwardDir = Vector3.Dot(rigidbody.velocity.normalized, Camera.main.transform.forward); float x = rotationSpeedPercent * inertia.OffsetX * (rotationSpeed > 0 ? 1 : -1); float y = upSpeedPercent * inertia.OffsetY * (upSpeed > 0 ? 1 : -1); float z = forwardSpeedPercent * inertia.OffsetZ * forwardDir; //Debug.LogError("----> " + // string.Format("{0:N2}", forwardSpeed) + "/" + forwardSpeedMax + " " + // string.Format("{0:N2}", upSpeed) + "/" + upSpeedMax + " " + // string.Format("{0:N2}", rotationSpeed) + "/" + rotationSpeedMax); rect.anchoredPosition3D = new Vector3(x, y, z); }
/// <summary> /// 根据输入状态更新惯性 /// </summary> /// <param name="rect">要微调的UI</param> /// <param name="inertia">惯性设置</param> private void UpdateInertanceByInput(RectTransform rect, InertiaWithHud inertia) { Vector3 offset = rect.anchoredPosition3D; m_YOffset = m_Ascend ? 1 : (m_Descend ? -1 : 0); float x = Mathf.Lerp(offset.x, m_XOffset * inertia.OffsetX, Time.deltaTime); float y = Mathf.Lerp(offset.y, m_YOffset * inertia.OffsetY, Time.deltaTime); float z = Mathf.Lerp(offset.z, m_ZOffset * inertia.OffsetZ, Time.deltaTime); rect.anchoredPosition3D = new Vector3(x, y, z); }
/// <summary> /// 更新惯性协程 /// </summary> /// <returns>IEnumerator</returns> private IEnumerator UpdateInertance() { RectTransform rect = GetTransform().GetComponent <RectTransform>(); while (true) { InertiaWithHud inertia = GetTransform().GetComponent <InertiaWithHud>(); if (inertia != null && inertia.isActiveAndEnabled) { if (inertia.mode == InertiaWithHud.InertiaMode.Input) { UpdateInertanceByInput(rect, inertia); } else if (inertia.mode == InertiaWithHud.InertiaMode.Rigbody) { UpdateInertanceByVelocity(rect, inertia); } } yield return(new WaitForEndOfFrame()); } }