/// <summary> /// 获取最远点 /// </summary> /// <param name="context"></param> /// <param name="selectionData"></param> /// <returns></returns> private static void GetFarthestPostionActionTarget(ref ActionTarget actionTarget, IContext context, Vector3 calculateDirection) { IBaseActionProperty baseActionProperty = context.GetObject <IBaseActionProperty>(); if (baseActionProperty.IsMain()) { SkillData skillData = context.GetObject <SkillData>(); MainCameraComponent mainCamComponent = context.GetObject <MainCameraComponent>(); if (mainCamComponent == null) { actionTarget = null; return; } //最远点 Vector3 distantPoint = Vector3.zero; Vector3 playerPosition = baseActionProperty.GetRootTransform().position; //玩家位置 Vector3 CamPosition = mainCamComponent.GetPosition(); //摄像机位置 Vector3 cameDir = calculateDirection; /*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 = skillData.BaseData.Value.MaxDistance; if (MaxDis > Play2VerticaD) { distantPoint = Mathf.Sqrt(MaxDis * MaxDis - Play2VerticaD * Play2VerticaD) * cameDir + verticalPos; //最远点 = 三角函数求得垂线点到最远点向量+ 垂线点坐标 } else { distantPoint = playerPosition + Play2VerticaN * MaxDis;//垂线上找到距离是 MaxDis 的坐标 } actionTarget.TargetType = ActionTargetType.Position; actionTarget.TargetPosition = distantPoint; } else { SkillData skillData = context.GetObject <SkillData>(); Vector3 playerPosition = baseActionProperty.GetRootTransform().position; float d = skillData.BaseData.Value.MaxDistance; Vector3 distantPoint = playerPosition + calculateDirection * d; actionTarget.TargetType = ActionTargetType.Position; actionTarget.TargetPosition = distantPoint; //Leyoutech.Utility.DebugUtility.LogError("第三方最远点方向", string.Format("计算最远点 ---->self = {0} , calculateDirection = {1}, PlayPos = {2} , distantPoint = {3}", // baseActionProperty.EntityId(), // calculateDirection, // playerPosition, // distantPoint // )); } }
internal static ActionTarget GetActionTarget(IContext context, TargetSelectionData selectionData) { ActionTarget actionTarget = new ActionTarget(); IBaseActionProperty baseActionProperty = context.GetObject <IBaseActionProperty>(); SkillData skillData = context.GetObject <SkillData>(); PerceptronTarget perceptron = context.GetObject <PerceptronTarget>(); Vector3 calculateDirection = Vector3.zero; LinkedList <CCrossSightLoic.Target> entities = null; if (!skillData.BaseData.Value.CanChangeTarget) { //不能切换 entities = perceptron.GetCurrQueue(out calculateDirection, false, skillData.BaseData.Value.TagercalculationType); } else { //能切换 entities = perceptron.GetCurrQueue(out calculateDirection, true, skillData.BaseData.Value.TagercalculationType); } // //阵营筛选,已经在技能释放前过滤过了,下面不进行 // if (entities.Count > 0) //有目标,目标单位为发射方向 // { CCrossSightLoic.Target cctarget = GetTargetEntity(context, entities, baseActionProperty.GetOwner(), selectionData); if (cctarget == null) { //没目标,最远点为发射方向 GetFarthestPostionActionTarget(ref actionTarget, context, calculateDirection); } else { BaseEntity entity = GameplayManager.Instance.GetEntityManager().GetEntityById <BaseEntity>((uint)cctarget.target_entityId); if (entity != null) { actionTarget.Entity = entity; actionTarget.TargetEntity = entity.GetRootTransform(); actionTarget.TargetEntityHitPositionOffet = cctarget.target_pos - entity.GetRootTransform().position; actionTarget.TargetType = ActionTargetType.Entity; } else { //没目标,最远点为发射方向 GetFarthestPostionActionTarget(ref actionTarget, context, calculateDirection); } } // } // else // {//没目标,最远点为发射方向 // // GetFarthestPostionActionTarget(ref actionTarget, context, calculateDirection); // } if (actionTarget.TargetType == ActionTargetType.None) { return(null); } else { return(actionTarget); } }