예제 #1
0
    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);
            }
        }
예제 #3
0
    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);
    }
예제 #4
0
 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);
        }
예제 #7
0
    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);
    }
예제 #8
0
    /// <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);
            }
        }
예제 #10
0
    /// <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);
    }
예제 #11
0
 public CrossSightLoic_Improve_Cone(CCrossSightLoic baseCCrossSightLoic) : base(baseCCrossSightLoic)
 {
 }
예제 #12
0
    /// <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);
    }
예제 #13
0
 public CrossSightLoic_Improve_Round(CCrossSightLoic baseCCrossSightLoic) : base(baseCCrossSightLoic)
 {
 }
예제 #14
0
    /// <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);
                        }
                    }
                }
            }
        }
    }
예제 #15
0
 public CrossSightLoic_Improve(CCrossSightLoic baseCCrossSightLoic)
 {
     m_CCrossSightLoic = baseCCrossSightLoic;
 }
예제 #16
0
 public CrossSightLoic_Improve_Square(CCrossSightLoic baseCCrossSightLoic) : base(baseCCrossSightLoic)
 {
 }