/// <summary> /// 计算技能移动 /// </summary> /// <param name="entity"></param> /// <param name="skillData"></param> private void CalcSkillMove(EntityBase entity, SkillCfg skillData) { List <int> skillMoveLst = skillData.skillMoveLst; int sum = 0; // 遍历所有的技能位移,一个技能可能会有多段位移 for (int i = 0; i < skillMoveLst.Count; i++) { SkillMoveCfg skillMoveCfg = resSvc.GetSkillMoveCfg(skillData.skillMoveLst[i]); float speed = skillMoveCfg.moveDis / (skillMoveCfg.moveTime / 1000f); sum += skillMoveCfg.delayTime; // 总的延迟时间 if (sum > 0) { int moveID = timeSvc.AddTimeTask((int tid) => { entity.SetSkillMoveState(true, speed); entity.RmvMoveCB(tid); // 移除技能位移的回调 ID }, sum); // 添加技能位移的回调 ID entity.skMoveCBLst.Add(moveID); } else { entity.SetSkillMoveState(true, speed); } sum += skillMoveCfg.moveTime; int stopID = timeSvc.AddTimeTask((int tid) => { entity.SetSkillMoveState(false); entity.RmvMoveCB(tid); // 移除技能位移的回调 ID }, sum); // 添加技能位移的回调 ID entity.skMoveCBLst.Add(stopID); } }
private void CalcSkillMove(EntityBase entity, SkillCfg skillData) { var skillMoveLst = skillData.skillMoveLst; int sum = 0; //多段位移 for (int i = 0; i < skillMoveLst.Count; i++) { SkillMoveCfg skillMoveCfg = resSvc.GetSkillMoveCfg(skillMoveLst[i]); float speed = skillMoveCfg.moveDis / (skillMoveCfg.moveTime / 1000f); sum += skillMoveCfg.delayTime; if (sum > 0) { int moveid = timerSvc.AddTimeTask((int tid) => { entity.SetSkillMoveState(true, speed); entity.RemoveMoveCB(tid); }, sum); entity.skMoveCBLst.Add(moveid); } else { entity.SetSkillMoveState(true, speed); } sum += skillMoveCfg.moveTime; int stopID = timerSvc.AddTimeTask((int tid) => { entity.SetSkillMoveState(false); entity.RemoveMoveCB(tid); }, sum); entity.skMoveCBLst.Add(stopID); } }
/// <summary> /// 设置技能移动,并添加回调编号 /// </summary> /// <param name="entity"></param> /// <param name="skillData"></param> private void CalcSkillMove(EntityBase entity, SkillCfg skillData) { List <int> skillMoveLst = skillData.skillMoveLst; int delay = 0; for (int i = 0; i < skillMoveLst.Count; i++) { SkillMoveCfg skillMoveCfg = GameEntry.Res.GetSkillMoveCfg(skillData.skillMoveLst[i]); float speed = skillMoveCfg.moveDis / (skillMoveCfg.moveTime / 1000f); delay += skillMoveCfg.delayTime; if (delay > 0) { int moveid = GameEntry.Timer.AddTimeTask((int tid) => { entity.SetSkillMoveState(true, speed); entity.RmvMoveCB(tid); //移除移动回调编号 }, delay); entity.SkMoveCBLst.Add(moveid); //添加移动回调编号 } else { entity.SetSkillMoveState(true, speed); } delay += skillMoveCfg.moveTime; int stopid = GameEntry.Timer.AddTimeTask((int tid) => { entity.SetSkillMoveState(false); entity.RmvMoveCB(tid); //移除回调编号 }, delay); entity.SkMoveCBLst.Add(stopid); //添加回调编号 } }
private void CalcSkillMove(EntityBase entity, SkillCfg skillCfg) { List <int> skillMoveLst = skillCfg.skillMoveLst; int sumTime = 0; for (int i = 0; i < skillMoveLst.Count; i++) { SkillMoveCfg skillMoveCfg = resSvc.GetSkillMoveCfg(skillCfg.skillMoveLst[i]); float speed = skillMoveCfg.moveDis / (skillMoveCfg.moveTime / 1000f); sumTime += skillMoveCfg.delayTime; if (sumTime > 0) { int moveid = timerSvc.AddTimeTask((tid) => { entity.SetSkillMoveState(true, speed); entity.RmvMoveCB(tid); }, sumTime); entity.skMoveCBLst.Add(moveid); } else { entity.SetSkillMoveState(true, speed); } sumTime += skillMoveCfg.moveTime; int stopid = timerSvc.AddTimeTask((tid) => { entity.SetSkillMoveState(false); entity.RmvMoveCB(tid); }, sumTime); entity.skMoveCBLst.Add(stopid); } }
private void CalcSkillMove(EntityBase entity, SkillCfg skillData) { List <int> skillMoveLst = skillData.skillMoveLst; int sum = 0; for (int i = 0; i < skillMoveLst.Count; i++) { SkillMoveCfg skillMoveCfg = resSvc.GetSkillMoveCfg(skillData.skillMoveLst[i]); float speed = skillMoveCfg.moveDis / (skillMoveCfg.moveTime / 1000f); sum += skillMoveCfg.delayTime; if (sum > 0) { timeSvc.AddTimeTask((int tid) => { entity.SetSkillMoveState(true, speed); }, sum); } else { entity.SetSkillMoveState(true, speed); } sum += skillMoveCfg.moveTime; timeSvc.AddTimeTask((int tid) => { entity.SetSkillMoveState(false); }, sum); } }
private void CalcSkillMove(EntityBase entity, SkillCfg skillCfg) { int tempDelay = 0; for (int i = 0; i < skillCfg.skillMove.Count; i++) { SkillMoveCfg skillMove = resSev.GetSkillMoveCfg(skillCfg.skillMove[i]); float speed = skillMove.moveDis / (skillMove.moveTime / 1000f); if (skillMove.delayTime > 0f) { IDPack pack_1 = timerSev.AddTimerTask((tid) => { entity.SetSkillMoveState(true, speed); entity.sklMoveCBSet.Remove(tid); }, tempDelay + skillMove.delayTime); entity.sklMoveCBSet.Add(pack_1.id); } else { entity.SetSkillMoveState(true, speed); } IDPack pack_2 = timerSev.AddTimerTask((ttid) => { entity.SetSkillMoveState(false); entity.sklMoveCBSet.Remove(ttid); }, tempDelay + skillMove.moveTime + skillMove.delayTime); entity.sklMoveCBSet.Add(pack_2.id); tempDelay += skillMove.delayTime + skillMove.moveTime; } }
public SkillMoveCfg GetSkillMoveCfg(int id) { SkillMoveCfg smc = null; skillMoveDic.TryGetValue(id, out smc); return(smc); }
private void InitSkillMoveCfgData(string xmlPath) { TextAsset xmlText = Resources.Load <TextAsset>(xmlPath); if (!xmlText) { CommonTools.Log("xml file: " + PathDefine.cPath_RandomNameCfg + "not exits!", LogType.LogType_Error); return; } //开始解析xml文件 XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlText.text); XmlNodeList nodeList = doc.SelectSingleNode("root").ChildNodes; for (int i = 0; i < nodeList.Count; i++) { XmlElement element = nodeList[i] as XmlElement; if (element.GetAttributeNode("ID") == null) { continue; } int id = Convert.ToInt32(element.GetAttributeNode("ID").InnerText); SkillMoveCfg skillData = new SkillMoveCfg { ID = id, }; #region 遍历解析 foreach (XmlElement elem in nodeList[i].ChildNodes) { switch (elem.Name) { case "moveTime": skillData.moveTime = int.Parse(elem.InnerText); break; case "moveDis": skillData.moveDistance = float.Parse(elem.InnerText); break; case "delayTime": skillData.delayTime = int.Parse(elem.InnerText); break; } } #endregion dictSkillMoveCfgData.Add(id, skillData); } }
public SkillMoveCfg GetSkillMoveCfg(int id) { SkillMoveCfg skillMoveCfg = null; if (skillMoveCfgDicts.TryGetValue(id, out skillMoveCfg)) { return(skillMoveCfg); } return(null); }
public SkillMoveCfg GetSkillMoveCfg(int id) { SkillMoveCfg smc = null; if (skillMoveDic.TryGetValue(id, out smc)) { return(smc); } return(null); }
public SkillMoveCfg GetSkillMoveCfgData(int id) { SkillMoveCfg agc = null; if (skillMoveCfgDic.TryGetValue(id, out agc)) { return(agc); } return(null); }
public SkillMoveCfg GetSkillMoveCfg(int id) { SkillMoveCfg skillData = null; if (dictSkillMoveCfgData.TryGetValue(id, out skillData)) { return(skillData); } return(null); }
public SkillMoveCfg GetSkillMoveCfg(int id) { SkillMoveCfg cfg = null; if (skillMoveCfgDic.TryGetValue(id, out cfg)) { return(cfg); } NETCommon.Log("获取 SkillMoveCfg 失败,ID:" + id); return(null); }
private void InitSkillMoveCfg(string path) { TextAsset xml = Resources.Load <TextAsset>(path); if (xml == false) { Debug.LogError(GetType() + "/InitTaskRewardCfg()/xml file:" + path + " not exist"); } else { XmlDocument doc = new XmlDocument(); doc.LoadXml(xml.text); XmlNodeList nodLst = doc.SelectSingleNode("root").ChildNodes; for (int i = 0; i < nodLst.Count; i++) { XmlElement ele = nodLst[i] as XmlElement; if (ele.GetAttributeNode("ID") == null) { continue; } int ID = Convert.ToInt32(ele.GetAttributeNode("ID").InnerText); SkillMoveCfg smc = new SkillMoveCfg { ID = ID }; foreach (XmlElement e in nodLst[i].ChildNodes) { switch (e.Name) { case "moveDis": smc.moveDis = float.Parse(e.InnerText); break; case "moveTime": smc.moveTime = int.Parse(e.InnerText); break; case "delayTime": smc.delayTime = int.Parse(e.InnerText); break; } } skillMoveDic.Add(ID, smc); } } }
private void InitSkillMoveCfg(string assetName, object asset, float duration, object userData) { TextAsset xml = asset as TextAsset; if (!xml) { PECommon.Log("xml file:" + assetName + " not exist", LogType.Error); } else { XmlDocument doc = new XmlDocument(); doc.LoadXml(xml.text); XmlNodeList nodLst = doc.SelectSingleNode("root").ChildNodes; for (int i = 0; i < nodLst.Count; i++) { XmlElement ele = nodLst[i] as XmlElement; if (ele.GetAttributeNode("ID") == null) { continue; } int ID = Convert.ToInt32(ele.GetAttributeNode("ID").InnerText); SkillMoveCfg smc = new SkillMoveCfg { ID = ID }; foreach (XmlElement e in nodLst[i].ChildNodes) { switch (e.Name) { case "delayTime": smc.delayTime = int.Parse(e.InnerText); break; case "moveTime": smc.moveTime = int.Parse(e.InnerText); break; case "moveDis": smc.moveDis = float.Parse(e.InnerText); break; } } skillMoveDic.Add(ID, smc); } } GameEntry.Resource.UnloadAsset(asset); }
private void InitSkillMoveCfg(string path) { //TextAsset xml = Resources.Load<TextAsset>(path); string streamingXML = Application.streamingAssetsPath + path; //if (!xml) //{ // PECommon.Log("指定文件不存在,路径:" + path, LogType.Error); //} //else //{ XmlDocument doc = new XmlDocument(); //doc.LoadXml(xml.text); doc.Load(streamingXML); //选中子节点集合 XmlNodeList nodList = doc.SelectSingleNode("root").ChildNodes; for (int i = 0; i < nodList.Count; i++) { XmlElement ele = nodList[i] as XmlElement; if (ele.GetAttributeNode("ID") == null) { //不包含ID的节点,直接跳到下一个遍历,安全校验 continue; } int ID = Convert.ToInt32(ele.GetAttributeNode("ID").InnerText); SkillMoveCfg SkillMoveCfgData = new SkillMoveCfg(); SkillMoveCfgData.ID = ID; foreach (XmlElement element in nodList[i].ChildNodes) { switch (element.Name) { case "moveTime": SkillMoveCfgData.moveTime = int.Parse(element.InnerText); break; case "moveDis": SkillMoveCfgData.moveDis = float.Parse(element.InnerText); break; } } skillMoveCfgDic.Add(ID, SkillMoveCfgData); } //} }
private void InitSkillMoveCfg(string path) { skillMoveDic.Clear(); XmlNodeList nodList = null; if (TryGetRootNodeList(path, out nodList)) { for (int i = 0; i < nodList.Count; i++) { XmlElement ele = nodList[i] as XmlElement; if (ele.GetAttributeNode("ID") == null) { continue; } int ID = Convert.ToInt32(ele.GetAttributeNode("ID").InnerText); SkillMoveCfg smc = new SkillMoveCfg() { ID = ID }; foreach (XmlElement e in nodList[i].ChildNodes) { switch (e.Name) { case "delayTime": smc.delayTime = int.Parse(e.InnerText); break; case "moveTime": smc.moveTime = int.Parse(e.InnerText); break; case "moveDis": smc.moveDis = float.Parse(e.InnerText); break; } } skillMoveDic.Add(ID, smc); } } }
public void InitSkillMoveCfgs(string path) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(path); XmlNode root = xmlDoc.SelectSingleNode("root"); XmlNodeList nodeList = root.ChildNodes; foreach (XmlNode node in nodeList) { int ID = int.Parse(node.Attributes["ID"].Value); SkillMoveCfg skillMoveCfg = new SkillMoveCfg { ID = ID, }; XmlNodeList fieldNodeList = node.ChildNodes; foreach (XmlNode fieldNode in fieldNodeList) { switch (fieldNode.Name) { case "delayTime": skillMoveCfg.delayTime = int.Parse(fieldNode.InnerText); break; case "moveTime": skillMoveCfg.moveTime = int.Parse(fieldNode.InnerText); break; case "moveDis": skillMoveCfg.moveDis = float.Parse(fieldNode.InnerText); break; } } if (!skillMoveCfgDicts.ContainsKey(ID)) { skillMoveCfgDicts.Add(ID, skillMoveCfg); } } }
private void InitSkillMoveCfg() { string xml = DeSerializeXML(PathDefine.SkillMoveCfg); XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); XmlNode root = doc.SelectSingleNode("root"); foreach (XmlElement item in root.ChildNodes) { if (item.GetAttributeNode("ID") == null) { continue; } int id = int.Parse(item.GetAttributeNode("ID").InnerText); SkillMoveCfg cfg = new SkillMoveCfg(); cfg.ID = id; foreach (XmlElement ele in item.ChildNodes) { string value = ele.InnerText; switch (ele.Name) { case "delayTime": cfg.delayTime = int.Parse(value); break; case "moveTime": cfg.moveTime = int.Parse(value); break; case "moveDis": cfg.moveDis = float.Parse(value); break; } } skillMoveCfgDic.Add(id, cfg); } }
private void skillMoveLogical(EntityBase entity, SkillDataCfg skillData) { int totalDelayTime = 0; List <int> skillMoveList = skillData.skillMoveList; for (int i = 0; i < skillMoveList.Count; i++) { SkillMoveCfg skillMoveCfg = resSvc.GetSkillMoveCfg(skillMoveList[i]); float spd = skillMoveCfg.moveDistance / (skillMoveCfg.moveTime / 1000.0f); totalDelayTime += skillMoveCfg.delayTime; if (totalDelayTime > 0) { int moveCallbackId = -1; moveCallbackId = timeSvc.AddTimeTask((int tid) => { entity.SetSkillMoveState(true, spd); entity.RemoveMoveCallbackID(moveCallbackId); }, totalDelayTime); entity._listSkillMoveCallback.Add(moveCallbackId); } else { entity.SetSkillMoveState(true, spd); } totalDelayTime += skillMoveCfg.moveTime; int stopSkillMoveCallbackID = -1; stopSkillMoveCallbackID = timeSvc.AddTimeTask((int tid) => { entity.SetSkillMoveState(false); entity.RemoveMoveCallbackID(stopSkillMoveCallbackID); }, totalDelayTime); entity._listSkillMoveCallback.Add(stopSkillMoveCallbackID); } }
public void CalcSkillMove(EntityBase entity, SkillCfg skillData) { List <int> skillMoveList = skillData.skillMoveList; //多阶段位移 int sumDelayTime = 0; for (int i = 0; i < skillMoveList.Count; i++) { SkillMoveCfg skillMoveData = resSvc.GetSkillMoveCfg(skillMoveList[i]); float speed = skillMoveData.moveDis / (skillMoveData.moveTime * 1.0f / 1000); sumDelayTime += skillMoveData.delayTime; if (sumDelayTime > 0) { int moveID = timeSvc.AddTimeTask((int tid) => { entity.SetSkillMoveState(true, speed); entity.RemoveMoveCB(tid); }, sumDelayTime); entity.skillMoveCBList.Add(moveID); } else { entity.SetSkillMoveState(true, speed); } sumDelayTime += skillMoveData.moveTime; int stopID = timeSvc.AddTimeTask((int tid) => { entity.SetSkillMoveState(false); entity.RemoveMoveCB(tid); }, sumDelayTime); entity.skillMoveCBList.Add(stopID); } }
//技能特效与位移 public void AttackEffect(EntityBase entity, int skillId) { //读取技能配置表 SkillCfg skillData = resSvc.GetSkillCfg(skillId); entity.curtSkillCfg = skillData; //判断是否忽略碰撞 if (!skillData.isCollide) { //忽略碰撞 Physics.IgnoreLayerCollision(9, 10); timerSvc.AddTimeTask((id) => { Physics.IgnoreLayerCollision(9, 10, false); }, skillData.skillTime); } if (skillData.isBreak == false) { //霸体状态 entity.entityState = EntityState.BtState; } if (entity.enitityType == EnitityType.Player) { //攻击和技能的智能方向锁定 if (entity.GetMoveDir() == Vector2.zero) { Vector2 dir = entity.CalcTargetDir(); //自动攻击最近怪物 if (dir != Vector2.zero) { entity.SetAtkDir(dir, false); } } else { entity.SetAtkDir(entity.GetMoveDir()); } } entity.SetAction(skillData.aniAction); //播放动画 entity.SetFx(skillData.fx, skillData.skillTime); //播放特效 List <int> skillMoveLst = skillData.skillMoveLst; //技能位移 long timeSum = 0; entity.SetSkillMove(true); entity.SetIsCtrl(false); for (int i = 0; i < skillMoveLst.Count; i++) { SkillMoveCfg skillMoveData = resSvc.GetSkillMoveCfg(skillMoveLst[i]); long delayTime = skillMoveData.delayTime; //延迟释放时间 float distance = skillMoveData.moveDis; //移动距离 long time = skillMoveData.moveTime; //消耗时间 float speed = distance / (time / 1000.0f); //计算 每秒速度 = 距离 / 时间 //计算延迟 //开始位移 timeSum += delayTime; int taskId_1 = timerSvc.AddTimeTask((id) => { entity.SetSkillMove(true, speed); entity.RemoveMoveTask(id); }, timeSum); entity.AddMoveTask(taskId_1); //计算延迟 //结束位移 timeSum += time; int taskId_2 = timerSvc.AddTimeTask((id) => { entity.SetSkillMove(true, 0); entity.RemoveMoveTask(id); }, timeSum); entity.AddMoveTask(taskId_2); } //等待技能释放完成回到Idle状态 entity.skillEndCb = timerSvc.AddTimeTask((taskID) => { entity.SetSkillMove(false); entity.SetIsCtrl(true); entity.Idle(); }, skillData.skillTime); }
/// <summary> /// 技能效果表现 /// </summary> /// <param name="entity">。。。</param> /// <param name="skillID"></param> public void AttackEffect(EntityBase entity, int skillID, Vector3 blackAirPos) { SkillCfg skillData = resSvc.GetSkillCfgData(skillID); //分技能类型调整角色行为 if (entity.entityType == EntityType.Player) { /*如果是指向技能,自动转向最近目标,如果是范围技能,朝向区域方向, *如果是辅助技能,方向不变,闪避技能被设定为指向技能,因为永远朝向 *目标并且背向移动*/ if (skillData.dmgType == DamageType.TargetSkill) { Vector2 dir = entity.CalculateTargetDir(); if (dir != Vector2.zero) { entity.SetAtkRotation(dir); } } else if (skillData.dmgType == DamageType.AreaSkill) { Vector2 dir = entity.AreaSkillTargetDir(); if (dir != Vector2.zero) { entity.SetAtkRotation(dir); } //如果是范围技能,且不是瞬移,在动画播放快结束的时候播放对应延迟特效,持续时间后消失。 if (skillData.ID != Constants.id_PlayerSkill_Blink) { entity.SetAreaSkillFX(skillData.targetFX, skillData.delayFXTime, skillData.delayCloseFXTime); } } else//辅助技能 { if (skillData.ID == Constants.id_PlayerSkill_Heal)//治疗技能 { entity.Hp += GameRoot.instance.Playerdata.hp / 3; if (entity.Hp > GameRoot.instance.Playerdata.hp) { entity.Hp = GameRoot.instance.Playerdata.hp; } } else if (skillData.ID == Constants.id_PlayerSkill_Buff)//状态技能,攻击力+50%,进入霸体状态 { entity.AttackValue += GameRoot.instance.Playerdata.attackValue / 2; entity.unBreakable = true; TimeService.instance.AddTimeTask((int tid) => { entity.AttackValue -= GameRoot.instance.Playerdata.attackValue / 2; entity.unBreakable = false; }, 15f); } } //这里分开的目的是,玩家的部分技能也有延迟时间,但是是另一种特效,不能统一显示 entity.SetFX(skillData.fx, skillData.skillFXTime); } else//不是玩家,实际上这部分代码指的是boss的技能表现 { if (skillData.dmgType == DamageType.AreaSkill) { entity.SetLoopSkill(skillData.fx, blackAirPos); } entity.SetFX(skillData.fx, skillData.skillFXTime, skillData.delayFXTime); } entity.SetAction(skillData.aniAction); if (skillData.cantStop) { entity.cantStop = true; } SkillMoveCfg skillMoveCfg = resSvc.GetSkillMoveCfgData(skillData.skillMove); float speed = 0; if (skillData.ID == Constants.id_PlayerSkill_Blink)//是瞬移技能,不是闪避 { float dis = Vector3.Distance(entity.GetPos(), BattleSys.Instance.playerCtrlWnd.pos); speed = dis / (skillMoveCfg.moveTime / 1000f); entity.SetSkillMoveState(true, false, false, speed); } else if (skillData.ID == Constants.id_PlayerSkill_Dodge) //闪避技能 { speed = skillMoveCfg.moveDis / (skillMoveCfg.moveTime / 1000f); //单位是毫秒 entity.SetSkillMoveState(true, true, false, speed); } else if (skillData.ID == Constants.id_BossSkill_bladeStorm) //剑刃风暴,理论上来说可以和闪避技能公用代码 { speed = skillMoveCfg.moveDis / (skillMoveCfg.moveTime / 1000f); //单位是毫秒 entity.SetSkillMoveState(true, true, false, speed); } else if (skillData.ID == Constants.id_BossSkill_sifangzhen)//四方斩技能要位移到场地中间 { float dis = Vector3.Distance(entity.GetPos(), Constants.sifangzhanPos); speed = dis / (skillMoveCfg.moveTime / 1000f); entity.SetSkillMoveState(true, false, true, speed); } timeSvc.AddTimeTask((int tid) => {//技能移动时间到就设置为不能移动 entity.SetSkillMoveState(false); }, skillMoveCfg.moveTime / 1000f); timeSvc.AddTimeTask((int tid) => { entity.Idle(); /*不能直接在这里修改action的值是因为,这个攻击可能会被打断,被打断以后不会进入这个状态 * 这样就无法设置action了,所以是在退出攻击状态的时候设置action*/ }, skillData.animationTime); }