/// <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); }
protected override void Update() { if (!m_Content) { return; } if (!m_Content.gameObject.activeSelf) { return; } GameplayProxy proxy = Facade.RetrieveProxy(ProxyName.GameplayProxy) as GameplayProxy; SpacecraftEntity main = proxy.GetEntityById <SpacecraftEntity>(proxy.GetMainPlayerUID()); 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 upSpeed = velocity.y; float upSpeedMax = cruiseMotion.LineVelocityMax.y; float upSpeedPercent = Mathf.Clamp01(Mathf.Abs(upSpeed) / Mathf.Abs(upSpeedMax)); float dir = upSpeedPercent * (upSpeed > 0 ? 1 : -1); m_Content.SetBool("Opened", upSpeed != 0); m_AltitudeRule.FillAmount = 0.5f - upSpeedPercent * dir * 0.5f; m_AltitudeArrow.FillAmount = 0.5f + upSpeedPercent * dir * 0.5f; //Debug.LogError(string.Format("{0:N2}/{1:N2} = {2:N3}", upSpeed, upSpeedMax, upSpeedPercent)); }
/// <summary> /// 初始化移动属性 /// </summary> /// <param name="property"></param> private void InitializeMovionAttribute() { /// 战斗状态 m_FightModeMotionInfo = new SpacecraftMotionInfo() { LineVelocityMax = new Vector3( GetAttribute(AttributeName.kFightRightSpeedMax), GetAttribute(AttributeName.kFightUpSpeedMax), GetAttribute(AttributeName.kFightFrontSpeedMax) ), ReverseLineVelocityMax = new Vector3( GetAttribute(AttributeName.kFightLeftSpeedMax), GetAttribute(AttributeName.kFightDownSpeedMax), GetAttribute(AttributeName.kFightBackSpeedMax) ), LineAcceleration = new Vector3( GetAttribute(AttributeName.kFightRightSpeedAccelerate), GetAttribute(AttributeName.kFightUpSpeedAccelerate), GetAttribute(AttributeName.kFightFrontSpeedAccelerate) ), ReverseLineAcceleration = new Vector3( GetAttribute(AttributeName.kFightLeftSpeedAccelerate), GetAttribute(AttributeName.kFightDownSpeedAccelerate), GetAttribute(AttributeName.kFightBackSpeedAccelerate) ), ResistanceLineAcceleration = new Vector3( GetAttribute(AttributeName.kFightLeftRightSpeedDecelerate), GetAttribute(AttributeName.kFightUpDownSpeedDecelerate), GetAttribute(AttributeName.kFightFrontBackSpeedDecelerate) ), AngularVelocityMax = new Vector3( GetAttribute(AttributeName.kFightXMaxAngleSpeed), GetAttribute(AttributeName.kFightYMaxAngleSpeed), GetAttribute(AttributeName.kFightZMaxAngleSpeed) ), AngularAcceleration = new Vector3( GetAttribute(AttributeName.kFightXAngleSpeedAccelerate), GetAttribute(AttributeName.kFightYAngleSpeedAccelerate), GetAttribute(AttributeName.kFightZAngleSpeedAccelerate) ), ResistanceAngularAcceleration = new Vector3( GetAttribute(AttributeName.kFightXAngleSpeedDecelerate), GetAttribute(AttributeName.kFightYAngleSpeedDecelerate), GetAttribute(AttributeName.kFightZAngleSpeedDecelerate) ), MimesisData = new SpacecraftMotionInfo.MimesisInfo() { AngularAcceleration = new Vector3( GetAttribute(AttributeName.kXFightMimicryAngleSpeedAccelerate), GetAttribute(AttributeName.kYFightMimicryAngleSpeedAccelerate), GetAttribute(AttributeName.kZFightMimicryAngleSpeedAccelerate) ), MaxAngular = new Vector3( GetAttribute(AttributeName.kXFightMimicryAngle), GetAttribute(AttributeName.kYFightMimicryAngle), GetAttribute(AttributeName.kZFightMimicryAngle) ) } }; /// 巡航状态 m_CruiseModeMotionInfo = new SpacecraftMotionInfo() { LineVelocityMax = new Vector3( GetAttribute(AttributeName.kRightSpeedMax), GetAttribute(AttributeName.kUpSpeedMax), GetAttribute(AttributeName.kFrontSpeedMax) ), ReverseLineVelocityMax = new Vector3( GetAttribute(AttributeName.kLeftSpeedMax), GetAttribute(AttributeName.kDownSpeedMax), GetAttribute(AttributeName.kBackSpeedMax) ), LineAcceleration = new Vector3( GetAttribute(AttributeName.kRightSpeedAccelerate), GetAttribute(AttributeName.kUpSpeedAccelerate), GetAttribute(AttributeName.kFrontSpeedAccelerate) ), ReverseLineAcceleration = new Vector3( GetAttribute(AttributeName.kLeftSpeedAccelerate), GetAttribute(AttributeName.kDownSpeedAccelerate), GetAttribute(AttributeName.kBackSpeedAccelerate) ), ResistanceLineAcceleration = new Vector3( GetAttribute(AttributeName.kLeftRightSpeedDecelerate), GetAttribute(AttributeName.kUpDownSpeedDecelerate), GetAttribute(AttributeName.kFrontBackSpeedDecelerate) ), AngularVelocityMax = new Vector3( GetAttribute(AttributeName.kXAngleSpeedMax), GetAttribute(AttributeName.kYAngleSpeedMax), GetAttribute(AttributeName.kZAngleSpeedMax) ), AngularAcceleration = new Vector3( GetAttribute(AttributeName.kXAngleSpeedAccelerate), GetAttribute(AttributeName.kYAngleSpeedAccelerate), GetAttribute(AttributeName.kZAngleSpeedAccelerate) ), ResistanceAngularAcceleration = new Vector3( GetAttribute(AttributeName.kXAngleSpeedDecelerate), GetAttribute(AttributeName.kYAngleSpeedDecelerate), GetAttribute(AttributeName.kZAngleSpeedDecelerate) ), CruiseLeapAcceleration = GetAttribute(AttributeName.kJumpSpeedAccelerate), CruiseLeapReverseAcceleration = GetAttribute(AttributeName.kJumpSpeedDecelerate), MimesisData = new SpacecraftMotionInfo.MimesisInfo() { AngularAcceleration = new Vector3( GetAttribute(AttributeName.kXMimicryMaxAngleAccelerate), GetAttribute(AttributeName.kYMimicryMaxAngleAccelerate), GetAttribute(AttributeName.kZMimicryMaxAngleAccelerate) ), MaxAngular = new Vector3( GetAttribute(AttributeName.kXMimicryMaxAngle), GetAttribute(AttributeName.kYMimicryMaxAngle), GetAttribute(AttributeName.kZMimicryMaxAngle) ) } }; /// 过载状态 m_OverloadModeMotionInfo = new SpacecraftMotionInfo() { LineVelocityMax = new Vector3( GetAttribute(AttributeName.kOverloadRightSpeedMax), GetAttribute(AttributeName.kOverloadUpSpeedMax), GetAttribute(AttributeName.kOverloadFrontSpeedMax) ), ReverseLineVelocityMax = new Vector3( GetAttribute(AttributeName.kOverloadLeftSpeedMax), GetAttribute(AttributeName.kOverloadDownSpeedMax), GetAttribute(AttributeName.kOverloadBackSpeedMax) ), LineAcceleration = new Vector3( GetAttribute(AttributeName.kOverloadRightSpeedAccelerate), GetAttribute(AttributeName.kOverloadUpSpeedAccelerate), GetAttribute(AttributeName.kOverloadFrontSpeedAccelerate) ), ReverseLineAcceleration = new Vector3( GetAttribute(AttributeName.kOverloadLeftSpeedAccelerate), GetAttribute(AttributeName.kOverloadDownSpeedAccelerate), GetAttribute(AttributeName.kOverloadBackSpeedAccelerate) ), ResistanceLineAcceleration = new Vector3( GetAttribute(AttributeName.kOverloadLeftRightSpeedDecelerate), GetAttribute(AttributeName.kOverloadUpDownSpeedDecelerate), GetAttribute(AttributeName.kOverloadFrontBackSpeedDecelerate) ), AngularVelocityMax = new Vector3( GetAttribute(AttributeName.kXOverloadAngleSpeedMax), GetAttribute(AttributeName.kYOverloadAngleSpeedMax), GetAttribute(AttributeName.kZOverloadAngleSpeedMax) ), AngularAcceleration = new Vector3( GetAttribute(AttributeName.kXOverloadAngleSpeedAccelerate), GetAttribute(AttributeName.kYOverloadAngleSpeedAccelerate), GetAttribute(AttributeName.kZOverloadAngleSpeedAccelerate) ), ResistanceAngularAcceleration = new Vector3( GetAttribute(AttributeName.kXOverloadAngleSpeedDecelerate), GetAttribute(AttributeName.kYOverloadAngleSpeedDecelerate), GetAttribute(AttributeName.kZOverloadAngleSpeedDecelerate) ), MimesisData = new SpacecraftMotionInfo.MimesisInfo() { AngularAcceleration = new Vector3( GetAttribute(AttributeName.kXOverloadMimicryAngleSpeedAccelerate), GetAttribute(AttributeName.kYOverloadMimicryAngleSpeedAccelerate), GetAttribute(AttributeName.kZOverloadMimicryAngleSpeedAccelerate) ), MaxAngular = new Vector3( GetAttribute(AttributeName.kXOverloadMimicryMaxAngle), GetAttribute(AttributeName.kYOverloadMimicryMaxAngle), GetAttribute(AttributeName.kZOverloadMimicryMaxAngle) ) } }; }
private void RefreshSpacecraftMotionState(ChangeProperty changeProperty = null) { InitializeMovionAttribute(); if (m_Property.GetCurrentState().IsHasSubState(EnumSubState.Overload)) { m_CurrentMotionInfo = m_OverloadModeMotionInfo; } else if (m_Property.GetCurrentState().GetMainState() == EnumMainState.Fight) { m_CurrentMotionInfo = m_FightModeMotionInfo; } else { m_CurrentMotionInfo = m_CruiseModeMotionInfo; } /// 6dof运动类型使用过载运动参数 if (m_Property.GetMotionType() == MotionType.Dof6) { m_CurrentMotionInfo = m_OverloadModeMotionInfo; } SendEvent(ComponentEventName.RefreshSpacecraftMimesisData, new RefreshSpacecraftMimesisDataEvent() { MimesisData = m_CurrentMotionInfo.MimesisData }); if (changeProperty != null) { m_CurrentMotionInfo = changeProperty.SpacecraftMotionInfo; } m_Property.SetCurrentSpacecraftMotionInfo(m_CurrentMotionInfo); m_BehaviorController.InitBehaviorAbility( m_CurrentMotionInfo.LineAcceleration, m_CurrentMotionInfo.ReverseLineAcceleration, m_CurrentMotionInfo.ResistanceLineAcceleration, m_CurrentMotionInfo.LineVelocityMax, m_CurrentMotionInfo.ReverseLineVelocityMax, m_CurrentMotionInfo.AngularAcceleration, m_CurrentMotionInfo.ResistanceAngularAcceleration, m_CurrentMotionInfo.AngularVelocityMax, m_CurrentMotionInfo.CruiseLeapAcceleration, m_CurrentMotionInfo.CruiseLeapReverseAcceleration ); if (m_Property.GetHeroType() == KHeroType.htPlayer) { switch (m_Property.GetMotionType()) { case MotionType.Mmo: if (m_BehaviorController.HasBehaviorType(BehaviorController.BehaviorType.BT_WorldForceCtlMove)) { m_BehaviorController.WorldForceControlMove(m_EngineAxis, m_cameraRotate); } break; case MotionType.Dof4: if (m_BehaviorController.HasBehaviorType(BehaviorController.BehaviorType.BT_4DOFForwardMove)) { m_BehaviorController.DOF4ForwardMove(m_EngineAxis, m_cameraRotate); } break; case MotionType.Dof6: if (m_BehaviorController.HasBehaviorType(BehaviorController.BehaviorType.BT_6DOFForwardMove)) { m_BehaviorController.DOF6ForwardMove(m_EngineAxis, m_cameraRotate); } break; default: break; } } }
public void SetCurrentSpacecraftMotionInfo(SpacecraftMotionInfo spacecraftMotionInfo) { m_CurrentSpacecraftMotionInfo = spacecraftMotionInfo; }
/// <summary> /// 更新 /// </summary> protected override void Update() { 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 motionComponent = main.GetEntityComponent <SpacecraftMotionComponent>(); if (motionComponent == null) { return; } Vector3 shipVelocity = rigidbody.transform.InverseTransformDirection(rigidbody.velocity); SpacecraftMotionInfo shipMotionInfo = motionComponent.GetCruiseModeMotionInfo(); bool isBattle = IsBattling(); bool isOverload = IsOverload(); float hp = (float)main.GetAttribute(AttributeName.kHP); float hpMax = (float)main.GetAttribute(AttributeName.kHPMax); float hpPercent = Mathf.Clamp01(hpMax > 0 ? hp / hpMax : 0); float sp = (float)main.GetAttribute(AttributeName.kShieldValue); float spMax = (float)main.GetAttribute(AttributeName.kShieldMax); float spPercent = Mathf.Clamp01(spMax > 0 ? sp / spMax : 0); float electric = (float)main.GetAttribute(AttributeName.kPowerValue); float electricMax = (float)main.GetAttribute(AttributeName.kPowerMax); float electricPercent = Mathf.Clamp01(electricMax > 0 ? electric / electricMax : 0); float velocityForward = shipVelocity.z; float velocityForwardMax = shipMotionInfo.LineVelocityMax.z; float velocityForwardPercent = velocityForwardMax > 0 ? Mathf.Clamp01(Mathf.Abs(velocityForward) / Mathf.Abs(velocityForwardMax)) : 0; float velocityUp = shipVelocity.y; float velocityUpMax = shipMotionInfo.LineVelocityMax.y; float velocityUpPercent = velocityUpMax > 0 ? Mathf.Clamp01(Mathf.Abs(velocityUp) / Mathf.Abs(velocityUpMax)) : 0; m_HpImage.fillAmount = Mathf.Lerp(0.171f, 0.329f, hpPercent); m_HpLabelBox.localEulerAngles = Vector3.forward * Mathf.Lerp(31.8f, -26.0f, hpPercent); m_HpLabel.text = string.Format("{0}%", Mathf.FloorToInt(hpPercent * 100)); m_SpImage.fillAmount = Mathf.Lerp(0.181f, 0.319f, spPercent); m_SpLabel.gameObject.SetActive(Mathf.Approximately(spPercent, 1.0f)); m_ElectricImage.fillAmount = Mathf.Lerp(0.181f, 0.319f, electricPercent); m_ElectricText.text = string.Format("{0}/{1}", Mathf.CeilToInt(electric), Mathf.FloorToInt(electricMax)); m_OverloadBox.localEulerAngles = Vector3.forward * Mathf.Lerp(-21.86f, 26.0f, electricPercent); m_SpeedImage1.fillAmount = Mathf.Lerp(0.171f, 0.248f, Mathf.Clamp01(velocityForwardPercent / 0.5f)); m_SpeedImage2.fillAmount = Mathf.Lerp(0.252f, 0.328f, Mathf.Clamp01((velocityForwardPercent - 0.5f) / 0.5f)); velocityForward *= GameConstant.METRE_PER_UNIT; m_SpeedText.gameObject.SetActive(velocityForward > 0); if (m_SpeedText.gameObject.activeSelf) { if (velocityForward < 1000) { m_SpeedText.text = string.Format("{0}M", (int)velocityForward); } else { m_SpeedText.text = string.Format("{0:N2}KM", velocityForward / 1000.0f); } } float overloadProgress = main.GetOverloadProgress(); m_OverloadBar.gameObject.SetActive(isBattle && overloadProgress > 0 && overloadProgress < 1.0f); if (m_OverloadBar.gameObject.activeSelf) { m_OverloadBar.fillAmount = overloadProgress; m_OverloadArrow.anchorMin = new Vector2(m_OverloadArrow.anchorMin.x, 1 - overloadProgress); m_OverloadArrow.anchorMax = new Vector2(m_OverloadArrow.anchorMax.x, 1 - overloadProgress); } /* * float upSpeedPercent = Mathf.Clamp(velocityUp / velocityUpMax, -1, 1); * m_HeightRule.uvRect = new Rect(0, m_HeightRule.uvRect.y + upSpeedPercent * 0.01f, 1, 1); * if (Mathf.Abs(upSpeedPercent) > 0.01f) * { * m_HeightBox.gameObject.SetActive(true); * m_HeightArrow.anchorMax = m_HeightArrow.anchorMin = new Vector2(m_HeightArrow.anchorMin.x, 0.5f + upSpeedPercent * 0.5f); * } * else * { * if (Mathf.Abs(m_HeightArrow.anchorMin.y - 0.5f) < 0.01f) * { * m_HeightBox.gameObject.SetActive(false); * } * else * { * m_HeightBox.gameObject.SetActive(true); * m_HeightArrow.anchorMax = m_HeightArrow.anchorMin = new Vector2(m_HeightArrow.anchorMin.x, Mathf.Lerp(m_HeightArrow.anchorMin.y, 0.5f, Time.deltaTime * 3.0f)); * } * } */ }