/// <summary> /// 通知Hud /// </summary> private void MessageToHudCrosShairSize() { Camera cam = CameraManager.GetInstance()?.GetMainCamereComponent()?.GetCamera(); if (cam != null) { MsgPlayerWeaponCrosshair_ShotGun crosshair = new MsgPlayerWeaponCrosshair_ShotGun(); float horFOV = cam.fieldOfView * cam.aspect; float verFOV = cam.fieldOfView; crosshair.SubAimAreaRelativeHeight.Clear(); crosshair.SubAimAreaScreenPosition.Clear(); for (int i = 0; i < m_AimAreaList.Count; i++) { AimArea aimArea = m_AimAreaList[i]; if (aimArea.IsSon) { //子区域 crosshair.SubAimAreaRelativeHeight.Add(new Vector2(aimArea.GetCoverAngle() / horFOV, aimArea.GetCoverAngle() / verFOV)); crosshair.SubAimAreaScreenPosition.Add(cam.WorldToScreenPoint(cam.transform.position + aimArea.GetCentralRay())); } } crosshair.RemainingRestoreDuration = Mathf.Clamp(m_TimeOfStartFire + m_RestoreDuration - Time.time, 0, float.MaxValue); GameFacade.Instance.SendNotification(NotificationName.PlayerWeaponCrosshairScale_ShotGun, crosshair); } }
//protected override void MessageToTheChangeOfCrosShairSize(float delta) //{ // //空继承,防止 父类 update ,给覆盖 // //改为鼠标按下时,通知hud ,此时各个区域情况,由Hud 自己循环区域动画 //} protected override MsgPlayerWeaponCrosshair GetRelativeHeightOfReticle() { MsgPlayerWeaponCrosshair crosshair = new MsgPlayerWeaponCrosshair(); Camera cam = CameraManager.GetInstance()?.GetMainCamereComponent()?.GetCamera(); if (cam != null) { float horFOV = cam.fieldOfView * cam.aspect; float verFOV = cam.fieldOfView; for (int i = 0; i < m_AimAreaList.Count; i++) { AimArea aimArea = m_AimAreaList[i]; if (!aimArea.IsSon) { //主区域 crosshair.HorizontalRelativeHeight = aimArea.GetCoverAngle() / horFOV; crosshair.VerticalRelativeHeight = aimArea.GetCoverAngle() / verFOV; } } return(crosshair); } else { return(base.GetRelativeHeightOfReticle()); } }
public BattleWeapon_Shotgun(IWeapon weapon) : base(weapon) { m_MainAimArea = new AimArea(); m_WeaponFireData = m_CfgEternityProxy.GetWeaponDataOfShotgun(m_WeaponConfig.TypeDateSheetld); TranslateUniformParamToWeaponParam(); }
public override void ResetWeaponRuntimeData() { for (int iAim = 0; iAim < m_SubAimAreas.Count; iAim++) { AimArea aimArea = m_SubAimAreas[iAim]; aimArea.SpreadAngle = 0; aimArea.RollAngle = 360 / m_SubAimAreas.Count * iAim; } }
protected override void OnUpdate_First(float delta) { #if UNITY_EDITOR for (int i = 0; i < m_AimAreaList.Count; i++) { AimArea aimArea = m_AimAreaList[i]; aimArea.DrawRay(); } #endif }
public override List <CCrossSightLoic.Target> GetTargets() { m_Targets.Clear(); for (int i = 0; i < m_AimAreaList.Count; i++) { AimArea aimArea = m_AimAreaList[i]; m_Targets.AddRange(aimArea.GetTargets()); } return(m_Targets); }
private void TranslateUniformParamToWeaponParam() { float accuracy = m_MainPlayer.GetWeaponAttribute(m_WeaponItem.GetUID(), crucis.attributepipeline.attribenum.AttributeName.kWeaponAccuracy); float stability = m_MainPlayer.GetWeaponAttribute(m_WeaponItem.GetUID(), crucis.attributepipeline.attribenum.AttributeName.kWeaponStability); // 影响武器运作的每一条属性, 都有一个计算公式. 计算公式中使用的变量的值来自于 weapon_xxx表 // 公式来自于: 王洪波 // 霰弹枪武器属性表: weapon_shotgun m_AimAreaMaxSpreadAngle = m_WeaponFireData.SonDiffusionAngle - accuracy * m_WeaponFireData.SonDiffusionAngleCoefficient; m_MainAreaCoverAngle = m_WeaponFireData.CoreDiameterAngle - accuracy * m_WeaponFireData.CoreDiameterAngleCoefficient; m_SubAimAreaCoverAngle = m_WeaponFireData.SonDiameterAngle - accuracy * m_WeaponFireData.SonDiameterAngleCoefficient; // 表里的恢复时间的单位是毫秒 m_RestoreDuration = (m_WeaponFireData.RecoveryTime - stability * m_WeaponFireData.RecoveryTimeCoefficient) / 1000f; m_SubAimAreaCount = (int)m_WeaponFireData.SonNumber; m_MainAreaRayCount = (int)m_WeaponFireData.CoreRadialNumber; m_SubAimAreaRayCount = (int)m_WeaponFireData.SonRadialNumber; m_MainAimArea.RollAngle = 0f; m_MainAimArea.SpreadAngle = 0f; m_MainAimArea.RayCount = m_MainAreaRayCount; m_MainAimArea.CoverAngle = m_MainAreaRayCount; // 根据子区域数量重新计算当前每个子区域的偏移位置 if (m_SubAimAreas == null) { m_SubAimAreas = new List <AimArea>(); } if (m_SubAimAreas.Count != m_SubAimAreaCount) { m_SubAimAreas.Clear(); for (int iArea = 0; iArea < m_SubAimAreaCount; iArea++) { m_SubAimAreas.Add(new AimArea()); } for (int iAim = 0; iAim < m_SubAimAreas.Count; iAim++) { AimArea aimArea = m_SubAimAreas[iAim]; aimArea.SpreadAngle = 0; aimArea.RollAngle = 360 / m_SubAimAreas.Count * iAim; aimArea.RayCount = m_SubAimAreaRayCount; aimArea.CoverAngle = m_SubAimAreaCoverAngle; } } for (int iAim = 0; iAim < m_SubAimAreas.Count; iAim++) { AimArea aimArea = m_SubAimAreas[iAim]; aimArea.RayCount = m_SubAimAreaRayCount; aimArea.CoverAngle = m_SubAimAreaCoverAngle; } }
public override void OnRelease() { base.OnRelease(); for (int i = 0; i < m_AimAreaList.Count; i++) { AimArea aimArea = m_AimAreaList[i]; aimArea.OnRelease(); } m_AimAreaList.Clear(); }
/// <summary> /// 设置各个区域 /// </summary> private void SetAreas() { Vector3 direction = CameraManager.GetInstance().GetMainCamereComponent().GetForward(); float rollAngleOffset = Random.Range(0, 360); for (int i = 0; i < m_AimAreaList.Count; i++) { AimArea aimArea = m_AimAreaList[i]; aimArea.CalculateTheCentralRay(direction, i, rollAngleOffset); } }
/// <summary> /// 随时间恢复子区域的扩散位置 /// </summary> /// <param name="delta"></param> public override void OnUpdate(float delta) { base.OnUpdate(delta); TranslateUniformParamToWeaponParam(); float spreadRestoreSpeed = m_AimAreaMaxSpreadAngle / m_RestoreDuration; for (int iAim = 0; iAim < m_SubAimAreas.Count; iAim++) { AimArea aimArea = m_SubAimAreas[iAim]; aimArea.SpreadAngle = Mathf.Clamp(aimArea.SpreadAngle - spreadRestoreSpeed * delta, 0, float.MaxValue); } #if UNITY_EDITOR DrawGizmo(); DrawBoxOnGUI(); #endif }
private void DrawBoxOnGUI() { MainCameraComponent mainCam = CameraManager.GetInstance().GetMainCamereComponent(); if (mainCam == null) { return; } for (int iAim = 0; iAim < m_SubAimAreas.Count; iAim++) { AimArea aimArea = m_SubAimAreas[iAim]; m_SubAimAreas[iAim].UpdateBaseRay(GetViewRay().direction); Vector3 aimDir = m_SubAimAreas[iAim].GetBaseRay(); Vector3 pos = mainCam.GetPosition() + aimDir; Vector3 screenPos = mainCam.GetCamera().WorldToScreenPoint(pos); GizmosHelper.GetInstance().DrawGUIBox(screenPos, 100); } }
public override void OnWeaponSkillFinished(bool success) { if (success) { // 每次武器射击以后: // Spread角扩散到最大 // roll角加一个固定偏移 float rollAngleOffset = Random.Range(0, 360); for (int iAim = 0; iAim < m_SubAimAreas.Count; iAim++) { AimArea aimArea = m_SubAimAreas[iAim]; aimArea.SpreadAngle = m_AimAreaMaxSpreadAngle; aimArea.RollAngle = (360 / m_SubAimAreas.Count * iAim + rollAngleOffset) % 360; } m_LastFireTime = Time.time; NotifyHUDCrosshair(); } }
public override void Init() { base.Init(); m_WeaponFireData = m_CfgEternityProxy.GetWeaponDataOfShotgun(m_WeaponTable.TypeDateSheetld); float accuracy = m_MainPlayer.GetWeaponAttribute(m_UId, crucis.attributepipeline.attribenum.AttributeName.kWeaponAccuracy); //精准度 float stability = m_MainPlayer.GetWeaponAttribute(m_UId, crucis.attributepipeline.attribenum.AttributeName.kWeaponStability); //稳定性 float m_SonMaxSpreadAngle = m_WeaponFireData.SonDiffusionAngle - accuracy * m_WeaponFireData.SonDiffusionAngleCoefficient; //子区域偏移最大角度 m_RestoreDuration = (m_WeaponFireData.RecoveryTime - stability * m_WeaponFireData.RecoveryTimeCoefficient) / 1000f; int sonCount = (int)m_WeaponFireData.SonNumber; AimArea mainAimArea = new AimArea(); // 中心区域覆盖角度 float MainAreaCoverAngle = m_WeaponFireData.CoreDiameterAngle - accuracy * m_WeaponFireData.CoreDiameterAngleCoefficient; int mainRayCount = m_WeaponFireData.CoreRadialNumber; mainAimArea.Init(false, 0, MainAreaCoverAngle, mainRayCount, m_SkillMaxDistance, sonCount); m_AimAreaList.Add(mainAimArea); //子区域 for (int i = 0; i < sonCount; i++) { AimArea sonAimArea = new AimArea(); // 子区域覆盖角度 float SubAimAreaCoverAngle = m_WeaponFireData.SonDiameterAngle - accuracy * m_WeaponFireData.SonDiameterAngleCoefficient; int sonRayCount = m_WeaponFireData.SonRadialNumber; sonAimArea.Init(true, m_SonMaxSpreadAngle, SubAimAreaCoverAngle, sonRayCount, m_SkillMaxDistance, sonCount); m_AimAreaList.Add(sonAimArea); } m_FireInterval = WeaponAndCrossSightFactory.CalculateFireInterval(m_MainPlayer, m_WeaponTable.TypeDateSheetld, m_UId, WeaponAndCrossSight.WeaponAndCrossSightTypes.ShotGun); }