/// <summary> /// 获取行为构建器 /// </summary> /// <returns>构建完成的单个行为</returns> public override IFormula GetFormula(FormulaParamsPacker paramsPacker) { // 验证数据正确, 如果有问题直接抛错误 string errorMsg = null; if (paramsPacker == null) { errorMsg = "调用参数 paramsPacker 为空."; } if (!string.IsNullOrEmpty(errorMsg)) { throw new Exception(errorMsg); } // 替换替换符数据 ReplaceData(paramsPacker); // 数据本地化 var myFormulaType = FormulaType; var myTargetPos = TargetPos; var myUnitType = UnitType; var myUnitID = UnitID; var myLevel = Level; IFormula result = new Formula((callback, scope) => { var pos = GetPosByType(myTargetPos, paramsPacker, scope); DisplayOwner display; try { display = FightUnitFactory.CreateUnit(myUnitType, new CreateActorParam(pos.x, pos.z, myLevel) { SoldierID = myUnitID * 1000 + myLevel }); display.ClusterData.Begin(); display.ClusterData.ContinueMove(); } catch (Exception e) { Debug.LogError(e); throw; } callback(); }, myFormulaType); return(result); }
static int DeleteUnit(IntPtr L) { try { ToLua.CheckArgsCount(L, 1); VOBase arg0 = (VOBase)ToLua.CheckObject(L, 1, typeof(VOBase)); FightUnitFactory.DeleteUnit(arg0); return(0); } catch (Exception e) { return(LuaDLL.toluaL_exception(L, e)); } }
static int CreateUnit(IntPtr L) { try { ToLua.CheckArgsCount(L, 2); int arg0 = (int)LuaDLL.luaL_checknumber(L, 1); CreateActorParam arg1 = (CreateActorParam)ToLua.CheckObject(L, 2, typeof(CreateActorParam)); DisplayOwner o = FightUnitFactory.CreateUnit(arg0, arg1); ToLua.PushObject(L, o); return(1); } catch (Exception e) { return(LuaDLL.toluaL_exception(L, e)); } }
static int _CreateFightUnitFactory(IntPtr L) { try { int count = LuaDLL.lua_gettop(L); if (count == 0) { FightUnitFactory obj = new FightUnitFactory(); ToLua.PushObject(L, obj); return(1); } else { return(LuaDLL.luaL_throw(L, "invalid arguments to ctor method: FightUnitFactory.New")); } } catch (Exception e) { return(LuaDLL.toluaL_exception(L, e)); } }
/// <summary> /// 确认操作 /// </summary> /// <param name="msgOp">被确认操作消息</param> /// <param name="isLocal">是否本地创建</param> private void ComfirmOptional(MsgOptional msgOp, bool isLocal = false) { // 下兵操作 // 解析Params // TODO 模型动画相关参数不全 var kvDic = GetParams(msgOp.OpParams); var objectId = Convert.ToInt32(kvDic["ObjectId"]); var unitType = Convert.ToInt32(kvDic["UnitType"]); var uniqueId = Convert.ToInt32(kvDic["UniqueId"]); //var cmName = kvDic["CmName"]; var level = Convert.ToInt32(kvDic["Level"]); string meshPackname = null; string texturePackname = null; if (kvDic.ContainsKey("MeshPackName")) { meshPackname = kvDic["MeshPackName"]; } if (kvDic.ContainsKey("TexturePackName")) { texturePackname = kvDic["TexturePackName"]; } // 如果本地缓存了DisplayOwner不创建 DisplayOwner memberDisplay = null; if (isLocal) { // 获取本地DisplayOwner memberDisplay = DisplayerManager.Single.GetElementById((ObjectID.ObjectType)unitType, objectId); // 设置起始位置 memberDisplay.GameObj.transform.position = new Vector3(msgOp.OpPosX, msgOp.OpPosY, msgOp.OpPosZ); } else { // 映射类型 if (enemyTypeList.ContainsKey(unitType)) { unitType = enemyTypeList[unitType]; } // 映射位置 // 地图绝对宽度 //var mapAbsoluteWidth = LoadMap.Single.MapWidth*LoadMap.Single.UnitWidth; //var setPosX = mapAbsoluteWidth - msgOp.OpPosX; var mapingPos = LoadMap.Single.MapItemToEnemy(new Vector3(msgOp.OpPosX, msgOp.OpPosY, msgOp.OpPosZ)); // 创建单位 memberDisplay = FightUnitFactory.CreateUnit(unitType, new CreateActorParam(mapingPos.x, mapingPos.z, level) { //ColorMat = true, //CardID = 0, //MeshPackName = meshPackname, //TexturePackName = texturePackname, SoldierID = uniqueId, }); memberDisplay.ClusterData.Begin(); } // 本地操作结束callback opSendCallbackDic[msgOp.OpUniqueNum](); // 激活单位 memberDisplay.GameObj.SetActive(true); // 开始移动 memberDisplay.RanderControl.Begin(); }
/// <summary> /// 解析建筑地图 /// </summary> /// <param name="mapData">地图数据</param> /// <param name="packer">数据包装</param> public void AnalysisMap(int[][] mapData, MapDataParamsPacker packer = null) { // 获取基地位置 for (var row = 0; row < mapData.Length; row++) { var line = mapData[row]; for (var col = 0; col < line.Length; col++) { var cell = line[col]; switch (cell) { case Utils.Accessibility: // 无障碍 break; case Utils.Obstacle: { // 障碍物 var paramObj = new CreateActorParam(col, row); FightUnitFactory.CreateUnit((int)ObjectID.ObjectType.NPCObstacle, paramObj).ClusterData.Begin(); } break; case Utils.MyBaseId: { // 我方基地 var pos = Utils.NumToPosition(LoadMap.Single.transform.position, new Vector2(col, row), ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight); var paramObj = new CreateActorParam(pos.x, pos.z, packer.BaseLevel); FightUnitFactory.CreateUnit((int)ObjectID.ObjectType.MyJiDi, paramObj).ClusterData.Begin(); } break; case Utils.MyTurretId: { // 我方防御塔 var pos = Utils.NumToPosition(LoadMap.Single.transform.position, new Vector2(col, row), ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight); var paramObj = new CreateActorParam(pos.x, pos.z, packer.TurretLevel); FightUnitFactory.CreateUnit((int)ObjectID.ObjectType.MyTower, paramObj).ClusterData.Begin(); } break; case Utils.EnemyBaseId: { // 敌方基地 var pos = Utils.NumToPosition(LoadMap.Single.transform.position, new Vector2(col, row), ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight); var paramObj = new CreateActorParam(pos.x, pos.z, packer.EnemyBaseLevel); FightUnitFactory.CreateUnit((int)ObjectID.ObjectType.EnemyJiDi, paramObj).ClusterData.Begin(); } break; case Utils.EnemyTurretId: { // 敌方防御塔 var pos = Utils.NumToPosition(LoadMap.Single.transform.position, new Vector2(col, row), ClusterManager.Single.UnitWidth, ClusterManager.Single.MapWidth, ClusterManager.Single.MapHeight); var paramObj = new CreateActorParam(pos.x, pos.z, packer.TurretLevel); var turret = FightUnitFactory.CreateUnit((int)ObjectID.ObjectType.EnemyTower, paramObj); turret.ClusterData.Begin(); } break; } } } }
public override void DoBeforeEntering(SoldierFSMSystem fsm) { base.DoBeforeEntering(fsm); // 释放死亡时技能 var allData = fsm.Display.ClusterData.AllData; var memberType = FightManager.MemberType.Soldier; // 判断死亡单位类型 switch (allData.MemberData.ArmyType) { // 人族 case Utils.HumanArmyType: // 兽族 case Utils.OrcArmyType: // 机械 case Utils.MechanicArmyType: break; // 基地 case Utils.BaseArmyType: { // 一方胜利 Debug.Log("一方基地被摧毁,战斗结束."); memberType = FightManager.MemberType.Base; // 向外层抛出失败事件 FightManager.Single.DoEndGameAction(allData.MemberData.Camp); } break; // 防御塔 case Utils.TurretArmyType: { Debug.Log("一方防御塔被摧毁,可拖兵范围变更."); memberType = FightManager.MemberType.Turret; } break; } // 向外层抛出单位死亡事件 FightManager.Single.DoMemberDeadAction(fsm.Display.GameObj, allData.MemberData.Camp, memberType); // 死亡时检测技能 if (allData.SkillInfoList != null) { // 抛出死亡事件 SkillManager.Single.SetTriggerData(new TriggerData() { ReleaseMember = fsm.Display, ReceiveMember = fsm.Display, TypeLevel1 = TriggerLevel1.Fight, TypeLevel2 = TriggerLevel2.Death }); } // 统计死亡数量 FightDataStatistical.Single.AddBeKillCount("" + allData.MemberData.ObjID.ID, 1, allData.MemberData.Camp, allData.MemberData.ArmyType, allData.MemberData.GeneralType); // 清除费用统计 FightDataStatistical.Single.DelCostData(allData.ArmyTypeData); // 删除单位 //DisplayerManager.Single.DelDisplay(fsm.Display); FightUnitFactory.DeleteUnit(fsm.Display.ClusterData.AllData.MemberData); }