/// <summary>
        /// 获取当前主摄像机注视,所选技能最远处的,四元数旋转值
        /// </summary>
        /// <param name="mainCamComponent">主摄像机组件</param>
        /// <param name="d">最远距离</param>
        /// <returns></returns>
        private Crucis.Protocol.Vec4 GetCameraQuaternion(MainCameraComponent mainCamComponent, Vector3 direction, float d)
        {
            if (mainCamComponent == null)
            {
                Leyoutech.Utility.DebugUtility.LogError("目标方向", " 上下文没有摄像机数据");
                return(null);
            }

            //最远点
            Vector3 distantPoint   = Vector3.zero;
            Vector3 playerPosition = m_ISpacecraftSkillProperty.GetRootTransform().position;     //玩家位置
            Vector3 CamPosition    = mainCamComponent.GetPosition();                             //摄像机位置

            Vector3 cameDir       = direction; /*mainCamComponent.GetForward()*/                 //摄像机方向向量
            Vector3 camera2Player = playerPosition - CamPosition;                                //摄像机到玩家的向量
            Vector3 verticalPos   = CamPosition + Vector3.Dot(camera2Player, cameDir) * cameDir; //垂线坐标 = 摄像机坐标+ camera2Player在cameDir投影距离 * cameDir向量
            Vector3 Play2VerticaN = (verticalPos - playerPosition).normalized;                   //玩家到垂线点 的单位向量
            float   Play2VerticaD = Vector3.Distance(verticalPos, playerPosition);               //玩家跟垂线点的距离

            float MaxDis = d;

            if (MaxDis > Play2VerticaD)
            {
                distantPoint = Mathf.Sqrt(MaxDis * MaxDis - Play2VerticaD * Play2VerticaD) * cameDir + verticalPos; //最远点 = 三角函数求得垂线点到最远点向量+ 垂线点坐标
            }
            else
            {
                distantPoint = playerPosition + Play2VerticaN * MaxDis;//垂线上找到距离是 MaxDis 的坐标
            }


            Vector3    Spheredirection  = (distantPoint - m_ISpacecraftSkillProperty.GetRootTransform().position).normalized;        //船到最远处单位方向向量
            Quaternion cameraQuaternion = Quaternion.Euler(Quaternion.FromToRotation(Vector3.forward, Spheredirection).eulerAngles); //欧拉角-->四元数


            Crucis.Protocol.Vec4 vec4 = new Crucis.Protocol.Vec4();
            vec4.X = cameraQuaternion.x;
            vec4.Y = cameraQuaternion.y;
            vec4.Z = cameraQuaternion.z;
            vec4.W = cameraQuaternion.w;

            Vector3 tt = playerPosition + cameraQuaternion * Vector3.forward * d;

            Leyoutech.Utility.DebugUtility.LogWarning("目标方向", string.Format(" 摄像机注视方向射程最远点计算-----> 玩家自己entity = {0}, 玩家坐标:{1} , 计算得到方向 欧拉角 : {2} , 最大射程点坐标:{3}",
                                                                            m_ISpacecraftSkillProperty.EntityId(),
                                                                            playerPosition,
                                                                            cameraQuaternion,
                                                                            distantPoint));

            return(vec4);
        }
        /// <summary>
        /// 蓄力---->按下begin,抬起通信release,end
        /// </summary>
        /// <param name="skillData"></param>
        private void ToCastAccumulationSkill(SkillData skillData, bool isdown)
        {
            uint        entityId = (uint)m_ISpacecraftSkillProperty.EntityId();
            uint        skillId  = (uint)skillData.Id;
            SkillRPCNet skillRPC = m_Context.GetObject <SkillRPCNet>();

            if (skillRPC == null)
            {
                return;
            }

            if (isdown) //按下
            {
                Leyoutech.Utility.DebugUtility.Log("蓄力", " 按下");

                AccumulationSkill skillA = new AccumulationSkill();
                skillA.AccumulationSkillBegin          = new global::Crucis.Protocol.AccumulationSkillBegin();
                skillA.AccumulationSkillBegin.CasterId = entityId;
                skillA.AccumulationSkillBegin.SkillId  = skillId;
                skillRPC.CreatListenerCastAccumulationSkill(entityId, skillId);
                skillRPC.CastAccumulationSkillWright(entityId, skillId, skillA);
            }
            else //抬起
            {
                Leyoutech.Utility.DebugUtility.Log("蓄力", " 抬起");
                Vector3 direction = Vector3.zero;
                List <Crucis.Protocol.TargetInfo> targetList = m_ISpacecraftSkillProperty.GetPerceptronTarget().GetCurrentTargetInfos(false, out direction, true, skillData.BaseData.Value.TagercalculationType);
                AccumulationSkill skillA = new AccumulationSkill();
                skillA.AccumulationSkillEnd          = new global::Crucis.Protocol.SkillSelectTargetInfo();
                skillA.AccumulationSkillEnd.CasterId = (uint)m_ISpacecraftSkillProperty.EntityId();
                skillA.AccumulationSkillEnd.SkillId  = (uint)skillData.Id;
                skillA.AccumulationSkillEnd.TargetList.Add(targetList);

                MainCameraComponent mainCamComponent = m_Context.GetObject <MainCameraComponent>();
                float d = skillData.BaseData.Value.MaxDistance; //* SceneController.SKILL_PRECISION;
                Crucis.Protocol.Vec4 vec4 = GetCameraQuaternion(mainCamComponent, direction, d);
                skillA.AccumulationSkillEnd.Quat = vec4;

                skillRPC.CastAccumulationSkillWright(entityId, skillId, skillA);

                if (skillData.BaseData.Value.IsNeedTarget && (targetList == null || targetList.Count == 0))
                {
                    StageType = SkillStageType.None;
                }
            }
        }
        /// <summary>
        ///吟唱,前摇 ,验证目标,技能是否可继续释放
        /// </summary>
        private void ToCastSingSkill(SkillData skillData)
        {
            MainCameraComponent mainCamComponent = m_Context.GetObject <MainCameraComponent>();
            float d = skillData.BaseData.Value.MaxDistance;//* SceneController.SKILL_PRECISION;

            Vector3 direction = Vector3.zero;
            List <Crucis.Protocol.TargetInfo> targetInfos = m_ISpacecraftSkillProperty.GetPerceptronTarget().GetCurrentTargetInfos(true, out direction, true, skillData.BaseData.Value.TagercalculationType);
            SkillRPCNet skillRPC = m_Context.GetObject <SkillRPCNet>();

            if (skillRPC == null)
            {
                return;
            }

            Crucis.Protocol.Vec4 vec4 = GetCameraQuaternion(mainCamComponent, direction, d);

            skillRPC.CreatListenerCastSkill((uint)m_ISpacecraftSkillProperty.EntityId(), (uint)skillData.Id, targetInfos, vec4);
        }
        /// <summary>
        /// 释放引导技能 guidState : 1 按下,2 改变 ,3 抬起
        /// </summary>
        private void ToCastGuideSkill(SkillData skillData, int guidState)
        {
            SkillRPCNet skillRPC = m_Context.GetObject <SkillRPCNet>();

            if (skillData.ByteBuffer == null || skillRPC == null)
            {
                return;
            }

            uint entityId = (uint)m_ISpacecraftSkillProperty.EntityId();
            uint skillId  = (uint)skillData.Id;

            switch (guidState)
            {
            case 1:     //按下
            {
                Leyoutech.Utility.DebugUtility.Log("引导技能", " 按下");


                GuideSkill guideSkill = new GuideSkill();
                guideSkill.GuideSkill_          = new global::Crucis.Protocol.SkillSelectTargetInfo();
                guideSkill.GuideSkill_.CasterId = (uint)m_ISpacecraftSkillProperty.EntityId();
                guideSkill.GuideSkill_.SkillId  = (uint)skillData.Id;
                Vector3 direction = Vector3.zero;
                guideSkill.GuideSkill_.TargetList.Add(m_ISpacecraftSkillProperty.GetPerceptronTarget().GetCurrentTargetInfos(false, out direction, true, skillData.BaseData.Value.TagercalculationType));
                if (guideSkill.GuideSkill_.TargetList.Count == 0)
                {
                    Leyoutech.Utility.DebugUtility.Log(" 引导技能", "------%%%%%%%----按下 :Null ");
                }

                for (int i = 0; i < guideSkill.GuideSkill_.TargetList.Count; i++)
                {
                    Leyoutech.Utility.DebugUtility.Log(" 引导技能", "------%%%%%%%----按下 :" + guideSkill.GuideSkill_.TargetList[i].TargetId);
                }


                MainCameraComponent mainCamComponent = m_Context.GetObject <MainCameraComponent>();
                float d = skillData.BaseData.Value.MaxDistance;        // * SceneController.SKILL_PRECISION;
                Crucis.Protocol.Vec4 vec4 = GetCameraQuaternion(mainCamComponent, direction, d);
                guideSkill.GuideSkill_.Quat = vec4;
                skillRPC.CreatListenerCastGuideSkill(entityId, skillId);
                skillRPC.CastGuideSkillWright(entityId, skillId, guideSkill);
            }
            break;

            case 2:    //目标改变
            {
                Leyoutech.Utility.DebugUtility.Log(" 引导技能", "目标改变");

                GuideSkill guideSkill = new GuideSkill();
                guideSkill.ChangeTarget          = new global::Crucis.Protocol.ChangeGuideSkillTargetInfo();
                guideSkill.ChangeTarget.CasterId = (uint)m_ISpacecraftSkillProperty.EntityId();
                guideSkill.ChangeTarget.SkillId  = (uint)skillData.Id;
                Vector3 direction = Vector3.zero;
                guideSkill.ChangeTarget.TargetList.Add(m_ISpacecraftSkillProperty.GetPerceptronTarget().GetCurrentTargetInfos(false, out direction, false));

                if (guideSkill.ChangeTarget.TargetList.Count == 0)
                {
                    Leyoutech.Utility.DebugUtility.Log(" 引导技能", "------%%%%%%%----目标改变 :Null ");
                }

                for (int i = 0; i < guideSkill.ChangeTarget.TargetList.Count; i++)
                {
                    Leyoutech.Utility.DebugUtility.Log(" 引导技能", "------%%%%%%%----目标改变 :" + guideSkill.ChangeTarget.TargetList[i].TargetId);
                }


                MainCameraComponent mainCamComponent = m_Context.GetObject <MainCameraComponent>();
                float d = skillData.BaseData.Value.MaxDistance;        // * SceneController.SKILL_PRECISION;
                Crucis.Protocol.Vec4 vec4 = GetCameraQuaternion(mainCamComponent, direction, d);
                guideSkill.ChangeTarget.Quat = vec4;
                skillRPC.CastGuideSkillWright(entityId, skillId, guideSkill);
            }
            break;

            case 3:    //抬起
            {
                Leyoutech.Utility.DebugUtility.Log("引导技能", " 抬起");

                GuideSkill guideSkill = new GuideSkill();
                guideSkill.GuideEnd          = new global::Crucis.Protocol.GuideSkillEnd();
                guideSkill.GuideEnd.CasterId = (uint)m_ISpacecraftSkillProperty.EntityId();
                guideSkill.GuideEnd.SkillId  = (uint)skillData.Id;
                skillRPC.CastGuideSkillWright(entityId, skillId, guideSkill);
            }
            break;

            default:
                break;
            }
        }
Пример #5
0
    /// <summary>
    /// 请求释放前摇技能
    /// </summary>
    /// <param name="skill_id_">技能ID</param>
    /// <param name="targetlist_">目标信息</param>
    /// <param name="quat_">摄像机朝向</param>
    /// <returns></returns>
    public async void CreatListenerCastSkill(uint entityId, uint skill_id_, List <Crucis.Protocol.TargetInfo> targetlist_, Crucis.Protocol.Vec4 quat_)
    {
        m_CastSingSkillStream = new CastSingSkillStream(entityId, skill_id_, targetlist_, quat_);
        CastSingSkillResponse response;

        while ((response = await m_CastSingSkillStream.ReadAsync()) != null)
        {
            Run_CastSingSkillResponse(entityId, skill_id_, response);
        }
        Leyoutech.Utility.DebugUtility.Log("SkillRPCNet", "关闭" + this.GetHashCode());
        m_CastSingSkillStream = null;
        m_abortAction?.Invoke();
    }