示例#1
0
    /// <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);
        }
    }
示例#2
0
    //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;
     }
 }
示例#5
0
    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
    }
示例#6
0
 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;
        }
    }
示例#8
0
    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();
    }
示例#9
0
    /// <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();
        }
    }
示例#13
0
    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);
    }