///<summary> /// 副本内怪物构建流程 /// 单人副本通过Scene配置来产生怪物 /// 多人副本通过服务器推送消息产生怪物 /// </summary> //TODO: 多人副本怪物产生机制 public void CreateMonster(UnitData unitData, SpawnTrigger spawn) { if (WorldManager.worldManager.station == WorldManager.WorldStation.Enter) { Log.Sys("UnityDataIs " + unitData.ID); if (unitData.Config == null) { Debug.LogError("NotFoundMonster " + unitData.ID); return; } Log.Sys("Create Monster Unit " + unitData.name); var Resource = Resources.Load <GameObject>(unitData.ModelName); //本地怪兽不需要Player信息 GameObject g = Instantiate(Resource) as GameObject; NpcAttribute npc = NGUITools.AddMissingComponent <NpcAttribute>(g); npc.spawnTrigger = spawn.gameObject; var type = Type.GetType("MyLib." + unitData.AITemplate); var t = typeof(NGUITools); var m = t.GetMethod("AddMissingComponent"); Log.AI("Monster Create Certain AI " + unitData.AITemplate + " " + type); var geMethod = m.MakeGenericMethod(type); //var petAI = geMethod.Invoke(null, new object[] { g });// as AIBase; g.transform.parent = transform; g.tag = GameTag.Enemy; g.layer = (int)GameLayer.Npc; spawn.FirstMonster = g; var netView = g.GetComponent <KBEngine.KBNetworkView>(); netView.SetID(new KBEngine.KBViewID(-1, myPlayer)); netView.IsPlayer = false; npc.SetObjUnitData(unitData); AddObject(netView.GetServerID(), netView); float angle = UnityEngine.Random.Range(0, 360); Vector3 v = Vector3.forward; v = Quaternion.Euler(new Vector3(0, angle, 0)) * v; float rg = UnityEngine.Random.Range(0, spawn.Radius); npc.transform.position = spawn.transform.position + v * rg; if (unitData.IsElite) { npc.transform.localScale = new Vector3(2, 2, 2); } BattleManager.battleManager.AddEnemy(npc.gameObject); npc.SetDeadDelegate = BattleManager.battleManager.EnemyDead; //npc.Level = spawn.Level; } else { cacheMonster.Add(new MonsterInit(unitData, spawn)); } }
public void CreateNpc(UnitData unitData, GameObject spawn) { if (WorldManager.worldManager.station == WorldManager.WorldStation.Enter) { var Resource = Resources.Load <GameObject>(unitData.ModelName); GameObject g = Instantiate(Resource) as GameObject; if (g.GetComponent <CharacterController>() == null) { var c = g.AddComponent <CharacterController>(); c.center = new Vector3(0, 0.7f, 0); c.height = 1.6f; } NpcAttribute npc = NGUITools.AddMissingComponent <NpcAttribute>(g); var type = Type.GetType("MyLib." + unitData.AITemplate); var t = typeof(NGUITools); var m = t.GetMethod("AddMissingComponent"); Log.AI("Monster Create Certain AI " + unitData.AITemplate + " " + type); var geMethod = m.MakeGenericMethod(type); geMethod.Invoke(null, new object[] { g });// as AIBase; g.transform.parent = transform; g.tag = GameTag.Npc; //Player Or Npc g.layer = (int)GameLayer.IgnoreCollision; //Register Unique Id To Npc var netView = g.GetComponent <KBEngine.KBNetworkView>(); netView.SetID(new KBEngine.KBViewID(-1, myPlayer)); netView.IsPlayer = false; npc.SetObjUnitData(unitData); AddObject(netView.GetServerID(), netView); npc.transform.position = spawn.transform.position; var rotY = spawn.transform.localRotation.eulerAngles.y; npc.transform.localRotation = Quaternion.Euler(new Vector3(0, rotY, 0)); NpcManager.Instance.RegNpc(unitData.name, g); } else { cacheNpc.Add(new MonsterInit(unitData, spawn)); } }
public override void NetworkAttribute(GCPlayerCmd cmd) { var info = cmd.AvatarInfo; if (attr == null) { attr = GetComponent <NpcAttribute>(); } Log.Net("OtherSync: " + info); if (info == null) { Debug.LogError("NetMatchInfo is Null "); return; } NetworkMove(info); //服务器通知瞬间传送位置 if (info.ResetPos) { if (aiBase != null) { aiBase.GetAI().ChangeState(AIStateEnum.IDLE); } var netPos = MobaUtil.FloatPos(info); transform.position = netPos; positions.Clear(); } if (info.HasTeamColor) { attr.SetTeamColorNet(info.TeamColor); curInfo.TeamColor = info.TeamColor; } if (info.HasIsMaster) { attr.SetIsMasterNet(info.IsMaster); curInfo.IsMaster = info.IsMaster; } var dataChanged = false; var skillCount = curInfo.KillCount; if (info.HasKillCount) { skillCount = info.KillCount; curInfo.KillCount = info.KillCount; dataChanged = true; } var deadCount = curInfo.DeadCount; if (info.HasDeadCount) { deadCount = info.DeadCount; curInfo.DeadCount = info.DeadCount; dataChanged = true; } var secondaryAttackCount = curInfo.SecondaryAttackCount; if (info.HasSecondaryAttackCount) { secondaryAttackCount = info.SecondaryAttackCount; curInfo.SecondaryAttackCount = info.SecondaryAttackCount; dataChanged = true; } if (info.HasScore) { curInfo.Score = info.Score; dataChanged = true; } if (dataChanged) { var sid = attr.GetNetView().GetServerID(); ScoreManager.Instance.NetSyncScore(sid, curInfo.Score, sid, skillCount, deadCount, secondaryAttackCount); } if (info.HasContinueKilled) { curInfo.ContinueKilled = info.ContinueKilled; if (curInfo.ContinueKilled > 0) { } } if (info.HasPlayerModelInGame && curInfo.PlayerModelInGame != info.PlayerModelInGame) { curInfo.PlayerModelInGame = info.PlayerModelInGame; GetComponent <MobaModelLoader>().LoadModel(curInfo.PlayerModelInGame); var unitData = Util.GetUnitData(true, curInfo.PlayerModelInGame, 0); attr.SetObjUnitData(unitData); //SkillDataController.skillDataController.InitSkillShotAfterSelectSkill(curInfo.PlayerModelInGame); } if (info.HasHP) { curInfo.HP = info.HP; attr.SetHPNet(info.HP); } if (info.HasLevel) { curInfo.Level = info.Level; attr.ChangeLevel(info.Level); } if (info.HasState) { curInfo.State = info.State; } }
/* * public void CreateNpc(UnitData unitData, GameObject spawn) * { * if (WorldManager.worldManager.station == WorldManager.WorldStation.Enter) * { * var Resource = Resources.Load<GameObject>(unitData.ModelName); * GameObject g = Instantiate(Resource) as GameObject; * if (g.GetComponent<CharacterController>() == null) * { * var c = g.AddComponent<CharacterController>(); * c.center = new Vector3(0, 0.7f, 0); * c.height = 1.6f; * } * * NpcAttribute npc = NGUITools.AddMissingComponent<NpcAttribute>(g); * * var type = Type.GetType("MyLib." + unitData.AITemplate); * var t = typeof(NGUITools); * var m = t.GetMethod("AddMissingComponent"); * Log.AI("Monster Create Certain AI " + unitData.AITemplate + " " + type); * var geMethod = m.MakeGenericMethod(type); * geMethod.Invoke(null, new object[]{ g });// as AIBase; * * g.transform.parent = transform; * g.tag = GameTag.Npc; //Player Or Npc * g.layer = (int)GameLayer.IgnoreCollision; * * //Register Unique Id To Npc * var netView = g.GetComponent<KBEngine.KBNetworkView>(); * netView.SetServerID(Util.NotInitServerID); * netView.IsPlayer = false; * * npc.SetObjUnitData(unitData); * AddObject(netView.GetServerID(), netView); * * npc.transform.position = spawn.transform.position; * var rotY = spawn.transform.localRotation.eulerAngles.y; * npc.transform.localRotation = Quaternion.Euler(new Vector3(0, rotY, 0)); * * NpcManager.Instance.RegNpc(unitData.name, g); * } else * { * cacheNpc.Add(new MonsterInit(unitData, spawn)); * } * } */ /// <summary> /// 伤害区域 /// Moba中的移动小兵 /// </summary> /// <param name="unitData"></param> /// <param name="spawn"></param> /// <param name="info"></param> public void CreateSpawnZoneEntity(UnitData unitData, SpawnZone spawn, EntityInfo info) { Log.Sys("CreateSpawnZoneEntity: " + unitData + spawn + " info " + info); //TODO: 这里可能有BUG if (info != null) { var oldMon = ObjectManager.objectManager.GetPlayer(info.Id); if (oldMon != null) { var nv = oldMon.GetComponent <KBEngine.KBNetworkView>(); if (nv != null) { ObjectManager.objectManager.DestroyByLocalId(nv.GetLocalId()); } } } var Resource = Resources.Load <GameObject>(unitData.ModelName); GameObject g = Instantiate(Resource) as GameObject; NpcAttribute npc = NGUITools.AddMissingComponent <NpcAttribute>(g); //npc.spawnTrigger = spawn.gameObject; g.transform.parent = transform; g.tag = GameTag.Enemy; g.layer = (int)GameLayer.Npc; if (info != null) { g.name += "_" + info.Id; } var type = Type.GetType("MyLib." + unitData.AITemplate); var t = typeof(NGUITools); var m = t.GetMethod("AddMissingComponent"); Log.AI("Monster Create Certain AI " + unitData.AITemplate + " " + type); var geMethod = m.MakeGenericMethod(type); geMethod.Invoke(null, new object[] { g });// as AIBase; var netView = g.GetComponent <KBEngine.KBNetworkView>(); //服务器返回的ViewId //Owner 客户端怪物 服务器怪物 //Id ViewId if (info != null) { netView.SetServerID(info.Id); } else { netView.SetServerID(Util.NotInitServerID); } netView.IsPlayer = false; npc.SetObjUnitData(unitData); AddObject(netView.GetServerID(), netView); //不算怪物允许不去打 if (info != null) { npc.transform.position = NetworkUtil.FloatPos(info.X, info.Y, info.Z); } else { //npc.transform.position = spawn.transform.position; } //BattleManager.battleManager.AddEnemy(npc.gameObject); //npc.SetDeadDelegate = BattleManager.battleManager.EnemyDead; var sync = npc.GetComponent <MonsterSync>(); if (sync != null) { sync.SyncAttribute(info); } }
public void CreatePet(int monsterId, GameObject owner, Affix affix, Vector3 pos) { Log.Sys("Create Pet " + monsterId + " " + owner + " " + pos); if (owner == null) { Debug.LogError("Own NotExist Pet Not Born"); return; } var unitData = Util.GetUnitData(false, monsterId, 1); var Resource = Resources.Load <GameObject>(unitData.ModelName); GameObject g = Instantiate(Resource) as GameObject; NpcAttribute npc = NGUITools.AddMissingComponent <NpcAttribute>(g); var type = Type.GetType("MyLib." + unitData.AITemplate); var t = typeof(NGUITools); var m = t.GetMethod("AddMissingComponent"); Log.AI("Create Certain AI " + unitData.AITemplate + " " + type); var geMethod = m.MakeGenericMethod(type); //var petAI = geMethod.Invoke(null, new object[] { g });// as AIBase; //var petAI = //NGUITools.AddMissingComponent<type> (g); g.transform.parent = transform; g.tag = owner.tag; g.layer = (int)GameLayer.Npc; npc.SetOwnerId(owner.GetComponent <KBEngine.KBNetworkView>().GetLocalId()); npc.spawnTrigger = owner.GetComponent <NpcAttribute>().spawnTrigger; //不可移动Buff //持续时间Buff //无敌不可被攻击Buff //火焰陷阱的特点 特点组合 g.GetComponent <BuffComponent>().AddBuff(affix); var netView = NGUITools.AddMissingComponent <KBEngine.KBNetworkView>(g); netView.SetID(new KBEngine.KBViewID(-1, myPlayer)); netView.IsPlayer = false; //owner.GetComponent<NpcAttribute>().AddSummon(netView.gameObject); npc.SetObjUnitData(unitData); AddObject(netView.GetServerID(), netView); npc.transform.position = pos; if (unitData.IsElite) { npc.transform.localScale = new Vector3(2, 2, 2); } if (npc.tag == GameTag.Enemy) { BattleManager.battleManager.AddEnemy(npc.gameObject); npc.SetDeadDelegate = BattleManager.battleManager.EnemyDead; } }
public void CreateChestFromNetwork(UnitData unitData, SpawnChest spawn, EntityInfo info = null) { Log.Sys("Create Chest Unit " + unitData.name); var Resource = Resources.Load <GameObject>(unitData.ModelName); GameObject g = Instantiate(Resource) as GameObject; NpcAttribute npc = NGUITools.AddMissingComponent <NpcAttribute>(g); npc.spawnTrigger = spawn.gameObject; g.transform.parent = transform; g.tag = GameTag.Enemy; g.layer = (int)GameLayer.Npc; var type = Type.GetType("MyLib." + unitData.AITemplate); var t = typeof(NGUITools); var m = t.GetMethod("AddMissingComponent"); Log.AI("Monster Create Certain AI " + unitData.AITemplate + " " + type); var geMethod = m.MakeGenericMethod(type); geMethod.Invoke(null, new object[] { g });// as AIBase; var netView = g.GetComponent <KBEngine.KBNetworkView>(); //服务器返回的ViewId //Owner 客户端怪物 服务器怪物 //Id ViewId if (info != null) { netView.SetID(new KBEngine.KBViewID(info.Id, myPlayer)); } else { netView.SetID(new KBEngine.KBViewID(-1, myPlayer)); } netView.IsPlayer = false; npc.SetObjUnitData(unitData); AddObject(netView.GetServerID(), netView); //不算怪物允许不去打 if (info != null) { npc.transform.position = NetworkUtil.FloatPos(info.X, info.Y, info.Z); } else { npc.transform.position = spawn.transform.position; } BattleManager.battleManager.AddEnemy(npc.gameObject); npc.SetDeadDelegate = BattleManager.battleManager.EnemyDead; var sync = npc.GetComponent <MonsterSync>(); if (sync != null) { sync.SyncAttribute(info); } }