public override void Init() { base.Init(); m_WeaponFireData = m_CfgEternityProxy.GetWeaponDataOfMachineGun(m_WeaponTable.TypeDateSheetld); m_CrossSightInfo = new CrossSightInfo(); m_CrossSightInfo.m_MaxRayDistance = m_SkillMaxDistance; m_CrossSightInfo.m_CrossSightShape = CrossSightShape.ConeSquare; m_CrossSightInfo.m_ConeSquareInfo.detectionMode = DetectionMode.All; m_CrossSightLoic = new CCrossSightLoic(); m_CrossSightLoic = new CrossSightLoic_Improve_ConeSquare(m_CrossSightLoic); m_CrossSightLoic.SetCrossSightInfo(m_CrossSightInfo); m_CrossSightLoic.SetBallisticOffsetFunc(BallisticOffsetFunc, null); m_CurrentBulletCount = 0; //子弹数 m_Accuracy = m_MainPlayer.GetWeaponAttribute(m_UId, crucis.attributepipeline.attribenum.AttributeName.kWeaponAccuracy); //精准度 m_Stability = m_MainPlayer.GetWeaponAttribute(m_UId, crucis.attributepipeline.attribenum.AttributeName.kWeaponStability); //稳定性 m_Aspect = m_WeaponFireData.AngleRatio; m_CurrentHorizontalAngle = GetHorizontalAngle_Before(); m_CurrentVerticalAngle = m_Aspect == 0 ? m_CurrentHorizontalAngle : m_CurrentHorizontalAngle / m_Aspect; m_CrossSightLoic.ChangeVirtualCameraAttribute(m_CurrentHorizontalAngle, m_Aspect); m_FireInterval = WeaponAndCrossSightFactory.CalculateFireInterval(m_MainPlayer, m_WeaponTable.TypeDateSheetld, m_UId, WeaponAndCrossSight.WeaponAndCrossSightTypes.MachineGun); }
/// <summary> /// 计算中轴线,跟 区域检测的射线向量,并给准星检测逻辑设置检测基准方向 /// </summary> public void CalculateTheCentralRay(Vector3 camerForward, int index, float rollAngleOffset) { reyList.Clear(); //开枪前计算中轴线,此时当前中轴线偏移度设置到最大偏移度上 m_SpreadAngle = m_MaxSpreadAngle; if (!IsSon) { m_CentralRay = camerForward; } else { m_RollAngle = m_SonCount == 0 ? 0 : (360 / m_SonCount * index + rollAngleOffset) % 360; m_CentralRay = MathUtility.PitchAndRoll(camerForward, m_SpreadAngle / 2, m_RollAngle); } //射线计算 float rayRollAngleOffset = Random.Range(0, 360); /// 每条射线的pitch角为最大spread角的 1/4 - 3/4 /// 每条射线的roll角为 随机偏移角度 + 360 / 射线数量 * 当前射线索引 for (int i = 0; i < m_RayCount; i++) { float raySpreadAngle = Random.Range(0.25f, 0.75f) * m_CoverAngle / 2; float rayRollAngle = (360 / m_RayCount * i + rayRollAngleOffset) % 360; Vector3 rayDirection = MathUtility.PitchAndRoll(m_CentralRay, raySpreadAngle, rayRollAngle); //检测逻辑设置检测方向 CCrossSightLoic crossSightLoic = m_CCrossSightLoicList[i]; crossSightLoic.SetCheckDirection(rayDirection); reyList.Add(rayDirection); } }
public override void Init() { base.Init(); m_WeaponFireData = m_CfgEternityProxy.GetWeaponDataOfMissile(m_WeaponTable.TypeDateSheetld); m_CrossSightInfo = new CrossSightInfo(); m_CrossSightInfo.m_MaxRayDistance = m_SkillMaxDistance; m_CrossSightInfo.m_CrossSightShape = CrossSightShape.ConeSquare; m_CrossSightLoic = new CCrossSightLoic(); m_CrossSightLoic = new CrossSightLoic_Improve_ConeSquare(m_CrossSightLoic); m_CrossSightLoic.SetCrossSightInfo(m_CrossSightInfo); float accuracy = m_MainPlayer.GetWeaponAttribute(m_UId, crucis.attributepipeline.attribenum.AttributeName.kWeaponAccuracy); //精准度 float stability = m_MainPlayer.GetWeaponAttribute(m_UId, crucis.attributepipeline.attribenum.AttributeName.kWeaponStability); //稳定性 // 表里配置的时间是毫秒 m_LockonTimeParam = (m_WeaponFireData.LockTime - accuracy * m_WeaponFireData.TimeCoefficient) / 1000f; m_MaxMissileCountInOneShotParam = (int)(m_WeaponFireData.MagazineNumber + stability * m_WeaponFireData.MagazineQuantityCoefficient); m_ReticleHorizontalFOVParam = m_WeaponFireData.AimingSize; m_ReticleAspect = m_WeaponFireData.AngleRange; if (m_ReticleAspect == 0) { Debug.LogWarning(string.Format("--------------------> 导弹类武器表 ID= {0},AngleRange = 0,策划确认下对吗? ", m_WeaponTable.TypeDateSheetld)); } float fieldOfView = m_ReticleAspect == 0 ? 60 : m_ReticleHorizontalFOVParam / m_ReticleAspect; m_CrossSightLoic.ChangeVirtualCameraAttribute(fieldOfView, m_ReticleAspect); m_FireInterval = WeaponAndCrossSightFactory.CalculateFireInterval(m_MainPlayer, m_WeaponTable.TypeDateSheetld, m_UId, WeaponAndCrossSight.WeaponAndCrossSightTypes.Missile); }
public override void Init() { base.Init(); m_CrossSightInfo = new CrossSightInfo(); m_CrossSightInfo.m_MaxRayDistance = m_SkillMaxDistance; m_CrossSightInfo.m_CrossSightShape = CrossSightShape.CrossLine; m_CrossSightLoic = new CCrossSightLoic(); m_CrossSightLoic = new CrossSightLoic_Improve_line(m_CrossSightLoic); m_CrossSightLoic.SetCrossSightInfo(m_CrossSightInfo); }
/// <summary> /// 释放数据 /// </summary> public void OnRelease() { for (int i = 0; i < m_CCrossSightLoicList.Count; i++) { CCrossSightLoic crossSightLoic = m_CCrossSightLoicList[i]; if (crossSightLoic != null) { crossSightLoic.Release(); } } m_Targets.Clear(); }
//获取目标列表 public List <Target> GetTargets() { m_Targets.Clear(); for (int i = 0; i < m_CCrossSightLoicList.Count; i++) { CCrossSightLoic crossSightLoic = m_CCrossSightLoicList[i]; if (crossSightLoic != null) { m_Targets.AddRange(crossSightLoic.GetTarget()); } } return(m_Targets); }
public override void Init() { base.Init(); m_WeaponFireData = m_CfgEternityProxy.GetWeaponDataOfMining(m_WeaponTable.TypeDateSheetld); m_CrossSightInfo = new CrossSightInfo(); m_CrossSightInfo.m_MaxRayDistance = m_SkillMaxDistance; m_CrossSightInfo.m_CrossSightShape = CrossSightShape.CrossLine; m_CrossSightInfo.m_LineInfo.detectionMode = DetectionMode.All; m_CrossSightLoic = new CCrossSightLoic(); m_CrossSightLoic = new CrossSightLoic_Improve_line(m_CrossSightLoic); m_CrossSightLoic.SetCrossSightInfo(m_CrossSightInfo); m_FireInterval = WeaponAndCrossSightFactory.CalculateFireInterval(m_MainPlayer, m_WeaponTable.TypeDateSheetld, m_UId, WeaponAndCrossSight.WeaponAndCrossSightTypes.Mining); }
/// <summary> /// 改善的,获取目标列表 /// </summary> /// <returns></returns> protected override List <Target> ImproveGetTarget() { List <Target> targets = base.ImproveGetTarget(); Vector3 pos = CameraManager.GetInstance().GetMainCamereComponent().GetPosition(); Vector3 direction = IsChangCheckDirection ? m_CheckDirection : CameraManager.GetInstance().GetMainCamereComponent().GetForward(); Collider[] colliders = Physics.OverlapSphere(pos, m_crosssightinfo.m_MaxRayDistance, LayerUtil.GetLayersIntersectWithSkillProjectile(true) /*LayerMask.GetMask("Enemy")*/); Plane[] planes = null; // 更新虚拟相机的方向和位置 if (m_virtualCamera != null) { m_virtualCamera.transform.position = pos; m_virtualCamera.transform.rotation = CameraManager.GetInstance().GetMainCamereComponent().GetRotation(); planes = GeometryUtility.CalculateFrustumPlanes(m_virtualCamera); } for (int i = 0; i < colliders.Length; i++) { if (planes == null) { break; } if (GeometryUtility.TestPlanesAABB(planes, colliders[i].bounds)) { BaseEntity entity = colliders[i].attachedRigidbody?.GetComponent <BaseEntity>(); if (entity != null && CCrossSightLoic.IsAdd(targets, entity.EntityId())) { Target target = new Target(); target.target_entityId = entity.EntityId(); target.target_pos = entity.transform.position; targets.Add(target); GizmosHelper.GetInstance().DrawLine(pos, target.target_pos, Color.red); } } } return(targets); }
/// <summary> /// 初始化 /// </summary> /// <param name="coverAngle">锥体检测范围角度</param> /// <param name="rayCount">检测目标所用的射线数量</param> /// <param name="skillMaxDistance">技能的最大检测距离</param> public void Init(bool isSon, float maxSpreadAngle, float coverAngle, float rayCount, float skillMaxDistance, int SonCount) { IsSon = isSon; m_MaxSpreadAngle = maxSpreadAngle; m_CoverAngle = coverAngle; m_RayCount = rayCount; m_SonCount = SonCount; m_CCrossSightLoicList.Clear(); for (int i = 0; i < m_RayCount; i++) { CrossSightInfo crossSightInfo = new CrossSightInfo(); crossSightInfo.m_MaxRayDistance = skillMaxDistance; crossSightInfo.m_CrossSightShape = CrossSightShape.CrossLine; crossSightInfo.m_LineInfo.detectionMode = DetectionMode.All; CCrossSightLoic crossSightLoic = new CCrossSightLoic(); crossSightLoic = new CrossSightLoic_Improve_line(crossSightLoic); crossSightLoic.SetCrossSightInfo(crossSightInfo); m_CCrossSightLoicList.Add(crossSightLoic); } }
/// <summary> /// 改善的,获取目标列表 /// </summary> /// <returns></returns> protected override List <Target> ImproveGetTarget() { List <Target> targets = base.ImproveGetTarget(); Vector3 pos = CameraManager.GetInstance().GetMainCamereComponent().GetPosition(); Vector3 direction = IsChangCheckDirection ? m_CheckDirection : CameraManager.GetInstance().GetMainCamereComponent().GetForward(); Collider[] colliders = Physics.OverlapSphere(pos, m_crosssightinfo.m_MaxRayDistance, LayerUtil.GetLayersIntersectWithSkillProjectile(true) /*LayerMask.GetMask("Enemy")*/); for (int i = 0; i < colliders.Length; i++) { Vector3 colliderPos = colliders[i].transform.position; //检测单位位置 if (Vector3.Angle(direction, colliderPos - pos) <= m_crosssightinfo.m_ConeInfo.angle * 0.5f) //单位跟摄像机正方向夹角是否在 1/2角度内 { RaycastHit hit = new RaycastHit(); int layermask = LayerUtil.GetLayersIntersectWithSkillProjectile(true); // LayerMask.GetMask("Enemy"/*, "Obstacles"*/); //指定射线碰撞的对象 Physics.Raycast(pos, colliderPos - pos, out hit, m_crosssightinfo.m_MaxRayDistance, layermask); //检测障碍 if (hit.collider == colliders[i]) //如果途中无其他障碍物,那么射线就会碰撞到敌人 { if (hit.rigidbody != null) { BaseEntity entity = hit.rigidbody?.GetComponent <BaseEntity>(); if (entity != null && CCrossSightLoic.IsAdd(targets, entity.EntityId())) { Target target = new Target(); target.target_entityId = entity.EntityId(); target.target_pos = hit.point; targets.Add(target); GizmosHelper.GetInstance().DrawLine(pos, hit.point, Color.red); } } } } } return(targets); }
public CrossSightLoic_Improve_Cone(CCrossSightLoic baseCCrossSightLoic) : base(baseCCrossSightLoic) { }
/// <summary> /// 改善的,获取目标列表 /// </summary> /// <returns></returns> protected override List <Target> ImproveGetTarget() { List <Target> targets = base.ImproveGetTarget(); Vector3 pos = CameraManager.GetInstance().GetMainCamereComponent().GetPosition(); Vector3 direction = IsChangCheckDirection ? m_CheckDirection : CameraManager.GetInstance().GetMainCamereComponent().GetForward(); if (m_crosssightinfo.m_RoundInfo.detectionMode == DetectionMode.One) { RaycastHit hitInfo = new RaycastHit(); if (Physics.SphereCast(pos, //起始点 m_crosssightinfo.m_RoundInfo.radius, //半径 direction, //方向 out hitInfo, m_crosssightinfo.m_MaxRayDistance, //最大距离 //LayerMask.GetMask("Enemy"))) //层 LayerUtil.GetLayersIntersectWithSkillProjectile(true))) { if (hitInfo.rigidbody != null) { BaseEntity entity = hitInfo.rigidbody?.GetComponent <BaseEntity>(); if (entity != null && CCrossSightLoic.IsAdd(targets, entity.EntityId())) { Target target = new Target(); target.target_entityId = entity.EntityId(); target.target_pos = hitInfo.point; targets.Add(target); GizmosHelper.GetInstance().DrawLine(pos, hitInfo.point, Color.red); GizmosHelper.GetInstance().DrawSphere(hitInfo.point, m_crosssightinfo.m_RoundInfo.radius, Color.red); } } } } else if (m_crosssightinfo.m_RoundInfo.detectionMode == DetectionMode.All) { RaycastHit[] hits = Physics.SphereCastAll(pos, //起始点 m_crosssightinfo.m_RoundInfo.radius, //半径 direction, //方向 m_crosssightinfo.m_MaxRayDistance, //最大距离 // LayerMask.GetMask("Enemy")); //层 LayerUtil.GetLayersIntersectWithSkillProjectile(true)); for (int i = 0; i < hits.Length; i++) { RaycastHit hit = hits[i]; if (hit.rigidbody != null) { BaseEntity entity = hit.rigidbody?.GetComponent <BaseEntity>(); if (entity != null && CCrossSightLoic.IsAdd(targets, entity.EntityId())) { Target target = new Target(); target.target_entityId = entity.EntityId(); target.target_pos = hit.point; targets.Add(target); GizmosHelper.GetInstance().DrawLine(pos, hit.point, Color.red); } } } } return(targets); }
public CrossSightLoic_Improve_Round(CCrossSightLoic baseCCrossSightLoic) : base(baseCCrossSightLoic) { }
/// <summary> /// 获取弹道上的目标,并返回弹道方向 /// </summary> public override void GetBallisticTargetAndOutDirection(out List <Target> targets, out Vector3 direction, params object[] args) { Vector3 CamerPos = CameraManager.GetInstance().GetMainCamereComponent().GetPosition();// Camera.main.transform.position; base.GetBallisticTargetAndOutDirection(out targets, out direction, args); if (m_virtualCamera != null) { float offx = 0.0f; //范围 0--0.5 float offy = 0.0f; m_ballisticOffsetFunc?.Invoke(out offx, out offy, m_ballisticOffsetFunc_args); float offz = 500; //到摄像机近视窗平面距离 Vector3 viewPos = new Vector3(offx, offy, offz); //(0.5f + offx, 0.5f + offy, offz); Vector3 worldPos = m_virtualCamera.ViewportToWorldPoint(viewPos); direction = (worldPos - CamerPos).normalized; //验证 // GameObject ga = new GameObject("ddddd"); // ga.transform.position = worldPos; // ga.AddComponent<BoxCollider>().size = Vector3.one; if (m_crosssightinfo.m_ConeSquareInfo.detectionMode == DetectionMode.One) { //射线检测目标 RaycastHit hit = new RaycastHit(); int layermask = LayerUtil.GetLayersIntersectWithSkillProjectile(true); // LayerMask.GetMask("Enemy"/*, "Obstacles"*/); //指定射线碰撞的对象 Physics.Raycast(CamerPos, worldPos - CamerPos, out hit, offz, layermask); //检测障碍 if (hit.rigidbody != null) { BaseEntity entity = hit.rigidbody?.GetComponent <BaseEntity>(); if (entity != null && CCrossSightLoic.IsAdd(targets, entity.EntityId())) { Target target = new Target(); target.target_entityId = entity.EntityId(); target.target_pos = hit.point; targets.Add(target); } } } else if (m_crosssightinfo.m_ConeSquareInfo.detectionMode == DetectionMode.All) { int layermask = LayerUtil.GetLayersIntersectWithSkillProjectile(true); // LayerMask.GetMask("Enemy"/*, "Obstacles"*/); //指定射线碰撞的对象 RaycastHit[] hits = Physics.RaycastAll(CamerPos, //起始点 worldPos - CamerPos, //方向 m_crosssightinfo.m_MaxRayDistance, //最大距离 layermask); for (int tt = 0; tt < hits.Length; tt++) { RaycastHit hitt = hits[tt]; if (hitt.rigidbody != null) { BaseEntity entity = hitt.rigidbody?.GetComponent <BaseEntity>(); if (entity != null && CCrossSightLoic.IsAdd(targets, entity.EntityId())) { Target target = new Target(); target.target_entityId = entity.EntityId(); target.target_pos = hitt.point; targets.Add(target); GizmosHelper.GetInstance().DrawLine(CamerPos, hitt.point, Color.red); } } } } } }
public CrossSightLoic_Improve(CCrossSightLoic baseCCrossSightLoic) { m_CCrossSightLoic = baseCCrossSightLoic; }
public CrossSightLoic_Improve_Square(CCrossSightLoic baseCCrossSightLoic) : base(baseCCrossSightLoic) { }