public override void FixedUpdate(int deltaTime) { List <EntityBase> list = GetEntityList(); for (int i = 0; i < list.Count; i++) { CommandComponent cc = (CommandComponent)list[i].GetComp("CommandComponent"); SkillStatusComponent ssc = (SkillStatusComponent)list[i].GetComp("SkillStatusComponent"); PlayerComponent pc = (PlayerComponent)list[i].GetComp("PlayerComponent"); MoveComponent mc = (MoveComponent)list[i].GetComp("MoveComponent"); LifeComponent lc = (LifeComponent)list[i].GetComp("LifeComponent"); //CD for (int j = 0; j < ssc.m_skillList.Count; j++) { ssc.m_CDList[j] -= deltaTime; } if (ssc.skillDirCache.ToVector() != Vector3.zero && cc.isFire && !pc.GetIsDizziness() && lc.Life > 0 && cc.skillDir.ToVector() == Vector3.zero ) { string skillID = SkillUtils.GetSkillName(cc); SkillData data = ssc.GetSkillData(skillID); if (ssc.GetSkillCDFinsih(skillID)) { //Debug.Log("FIRE!!! --> " + skillID); ssc.m_skillTime = 0; ssc.m_skillStstus = SkillStatusEnum.Before; ssc.m_isTriggerSkill = false; ssc.m_currentSkillData = data; ssc.m_currentSkillData.UpdateInfo(); ssc.SetSkillCD(skillID, data.CDSpace); ssc.skillDir = ssc.skillDirCache.DeepCopy(); AreaDataGenerate areaData = DataGenerateManager <AreaDataGenerate> .GetData(ssc.m_currentSkillData.SkillInfo.m_EffectArea); float distance = ssc.skillDir.ToVector().magnitude; distance = areaData.m_SkewDistance + Mathf.Clamp(distance, 0, areaData.m_distance); Vector3 aimPos = mc.pos.ToVector() + ssc.skillDir.ToVector().normalized *distance; if (areaData.m_Shape != AreaType.Rectangle) { ssc.skillPos.FromVector(aimPos); } else { ssc.skillPos.FromVector(mc.pos.ToVector() + ssc.skillDir.ToVector().normalized *(areaData.m_SkewDistance - areaData.m_Length / 2)); } } } ssc.skillDirCache = cc.skillDir.DeepCopy(); } }
public static Vector3 GetAreaDir(Area area, AreaDataGenerate areaData, EntityBase skiller, EntityBase aim = null) { MoveComponent smc = skiller.GetComp <MoveComponent>(); PlayerComponent pc = skiller.GetComp <PlayerComponent>(); Vector3 l_dir = Vector3.zero; if (aim == null) { switch (areaData.m_SkewDirection) { case DirectionEnum.Forward: l_dir = pc.faceDir.ToVector(); break; case DirectionEnum.Backward: l_dir = pc.faceDir.ToVector() * -1; break; case DirectionEnum.Close: Debug.LogError("没有aim,不能使用" + areaData.m_SkewDirection + "方向,修正为forward"); l_dir = pc.faceDir.ToVector(); break; case DirectionEnum.Leave: Debug.LogError("没有aim,不能使用" + areaData.m_SkewDirection + "方向,修正为Backward"); l_dir = pc.faceDir.ToVector() * -1; break; default: Debug.LogError("没有aim,不能使用" + areaData.m_SkewDirection + "方向"); break; } } if (aim != null) { MoveComponent amc = aim.GetComp <MoveComponent>(); switch (areaData.m_SkewDirection) { case DirectionEnum.Forward: l_dir = pc.faceDir.ToVector(); break; case DirectionEnum.Backward: l_dir = pc.faceDir.ToVector() * -1; break; case DirectionEnum.Leave: l_dir = amc.pos.ToVector() - smc.pos.ToVector(); break; case DirectionEnum.Close: l_dir = smc.pos.ToVector() - amc.pos.ToVector(); break; } } return(l_dir); }
public static void UpdateArea(Area area, string areaID, EntityBase skiller, EntityBase aim = null) { MoveComponent smc = skiller.GetComp <MoveComponent>(); AreaDataGenerate areaData = DataGenerateManager <AreaDataGenerate> .GetData(areaID); Vector3 dir = GetAreaDir(area, areaData, skiller, aim); area.areaType = areaData.m_Shape; area.length = areaData.m_Length; area.Width = areaData.m_Width; area.angle = areaData.m_Angle; area.radius = areaData.m_Radius; area.direction = dir.normalized; area.position = smc.pos.ToVector() + area.direction * areaData.m_SkewDistance; //Debug.Log( "skiller forward"+skiller.transform.forward); }
public void SetMesh(EntityBase entity, string areaID, bool isEnemy, string textureID) { MoveComponent mc = entity.GetComp <MoveComponent>(); AreaDataGenerate areaData = DataGenerateManager <AreaDataGenerate> .GetData(areaID); Area Area = new Area(); Vector3 AreaDir = SkillUtils.GetAreaDir(Area, areaData, entity, null); //Debug.Log("areaData.m_SkewDistance " + areaData.m_SkewDistance); Vector3 pos = mc.pos.ToVector(); pos.y += 0.1f; transform.position = pos + AreaDir * areaData.m_SkewDistance; if (areaData.m_Shape == AreaType.Rectangle) { transform.position = pos + AreaDir * areaData.m_SkewDistance - AreaDir * areaData.m_Length / 2; } transform.right = AreaDir.normalized; //轴向不同,RangeTip 的前方为x轴,而player的为Z轴 shapeType = areaData.m_Shape; radius = areaData.m_Radius; angleDegree = areaData.m_Angle; segments = 40; high = (int)Math.Ceiling(areaData.m_Length); width = (int)Math.Ceiling(areaData.m_Width); isMonster = isEnemy; side = 0.5f; SetTexture(textureID); creator.verticesTmp = null; creator.uvsTmp = null; creator.trianglesTmp = null; }
List <CreatPostionInfo> GetCreatePostionInfos(SkillDataGenerate skillData, EntityBase skiller, int Length) { MoveComponent mc = skiller.GetComp <MoveComponent>(); PlayerComponent pc = skiller.GetComp <PlayerComponent>(); List <CreatPostionInfo> result = new List <CreatPostionInfo>(); result.Clear(); if (Length == 0) { return(result); } HardPointEnum l_FXCreatPoint = skillData.m_FlyCreatPoint; Vector3 forward = pc.faceDir.ToVector(); Vector3 dir = forward; Vector3 pos = Vector3.zero; //获取散射区域 Area skillArea = UpdatSkillArea(areaCache, skillData, skiller, null); //TODO 寻敌方法 //CharacterBase enemy = GetRecentlyEnemy(skillArea, skiller.m_camp, false); //CharacterBase enemy = null; MoveComponent emc = null; if (l_FXCreatPoint != HardPointEnum.enemy) { pos = mc.pos.ToVector(); } else { if (emc == null) { return(result); } else { pos = emc.pos.ToVector(); } } Vector3 leftBorder = Vector3.zero; Vector3 leftDir = Vector3.zero; Vector3 leftPos = Vector3.zero; float sectorStep = 0; float rectangleStep = 0; AreaDataGenerate area = DataGenerateManager <AreaDataGenerate> .GetData(skillData.m_FlyObjectArea); switch (area.m_SkewDirection) { case DirectionEnum.Forward: break; case DirectionEnum.Backward: forward *= -1; break; case DirectionEnum.Close: forward = (emc.pos.ToVector() - mc.pos.ToVector()).normalized; break; case DirectionEnum.Leave: forward = (mc.pos.ToVector() - emc.pos.ToVector()).normalized; break; } switch (area.m_Shape) { case AreaType.Circle: leftBorder = forward.Vector3RotateInXZ(360 * 0.5f); sectorStep = 360 / (Length + 1); break; case AreaType.Sector: leftBorder = forward.Vector3RotateInXZ(area.m_Angle * 0.5f); sectorStep = area.m_Angle / (Length + 1); break; case AreaType.Rectangle: leftDir = forward.Vector3RotateInXZ(90); leftPos = pos + leftDir * area.m_Width * 0.5f; rectangleStep = area.m_Width / (Length + 1); break; } for (int i = 0; i < Length; i++) { switch (area.m_Shape) { case AreaType.Circle: case AreaType.Sector: dir = leftBorder.Vector3RotateInXZ2((i + 1) * sectorStep); pos = pos + forward * area.m_SkewDistance; break; case AreaType.Rectangle: pos = leftPos - leftDir * rectangleStep * (i + 1); break; } CreatPostionInfo cpi = new CreatPostionInfo(); cpi.m_pos = pos; cpi.m_dir = dir; result.Add(cpi); } return(result); }
List <CreatPostionInfo> GetCreatePostionInfos(SkillDataGenerate skillData, EntityBase skiller, int Length) { MoveComponent mc = skiller.GetComp <MoveComponent>(); SkillStatusComponent ssc = skiller.GetComp <SkillStatusComponent>(); List <CreatPostionInfo> result = new List <CreatPostionInfo>(); //result.Clear(); if (Length == 0) { return(result); } HardPointEnum l_FXCreatPoint = skillData.m_FlyCreatPoint; SyncVector3 forward = new SyncVector3().FromVector(ssc.skillDir.ToVector().normalized); SyncVector3 dir = forward; SyncVector3 pos = mc.pos; SyncVector3 leftBorder = new SyncVector3(); SyncVector3 leftDir = new SyncVector3(); SyncVector3 leftPos = new SyncVector3(); float sectorStep = 0; float rectangleStep = 0; AreaDataGenerate area = DataGenerateManager <AreaDataGenerate> .GetData(skillData.m_FlyObjectArea); switch (area.m_SkewDirection) { case DirectionEnum.Forward: break; case DirectionEnum.Backward: forward *= -1; break; //case DirectionEnum.Close: forward = (emc.pos - mc.pos); break; //case DirectionEnum.Leave: forward = (mc.pos - emc.pos); break; } switch (area.m_Shape) { case AreaType.Circle: leftBorder = forward.RotateInXZ(360 * 0.5f); sectorStep = 360 / (Length + 1); break; case AreaType.Sector: leftBorder = forward.RotateInXZ(area.m_Angle * 0.5f); sectorStep = area.m_Angle / (Length + 1); pos = pos + forward * area.m_SkewDistance; break; case AreaType.Rectangle: leftDir = forward.RotateInXZ(90); leftPos = pos + leftDir * area.m_Width * 0.5f; rectangleStep = area.m_Width / (Length + 1); break; } for (int i = 0; i < Length; i++) { switch (area.m_Shape) { case AreaType.Circle: case AreaType.Sector: dir = leftBorder.RotateInXZ2((i + 1) * sectorStep); break; case AreaType.Rectangle: pos = leftPos - leftDir * rectangleStep * (i + 1); break; } CreatPostionInfo cpi = new CreatPostionInfo(); pos.y = 0; dir.y = 0; cpi.m_pos = pos; cpi.m_dir = dir; result.Add(cpi); //CreatPostionInfo cpi = new CreatPostionInfo(); //cpi.m_pos = mc.pos.DeepCopy(); //cpi.m_dir.FromVector( ssc.skillDir.DeepCopy().ToVector().normalized); //result.Add(cpi); } return(result); }