/// <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; } }
/// <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(); }