public Monster CreateMonster(int id, Vector3 position, Vector3 dir, int dataId) { MonsterPO po = MonsterData.Instance.GetMonsterPO(dataId); if (po == null) { return(null); } Monster prefab = GetPrefab(po.ShapeName); if (prefab == null) { return(null); } Monster go = GameObject.Instantiate(prefab, position, Quaternion.AngleAxis(180, Vector3.up)) as Monster; go.Init(id, po); go.name = go.name + "_" + id; return(go); }
public void Init(int id, MonsterPO dataPO) { // 基础数据 this.twHit = null; this.twHitInterval = 0.0f; this.moveType = (MoveType)dataPO.MoveType; this.destroy = false; this.fixedTargetIndex = 0; this.idleTimer = dataPO.MoveCool; this.skillTimer = dataPO.AttackCool; this.disappearTimer = (float)dataPO.DisappearTime / 1000.0f; this.disappearAlpha = false; this.id = id; this.state = StateType.Idle; this.dataPO = dataPO; this.hp = dataPO.Hp; this.mp = 0; this.score = 0; this.goHead = transform.Find("Head").gameObject; this.lockRescued = false; this.damageWater = false; this.tipsCount = 0; this.randRotateTime = 3.0f; this.lastPlayer = null; // 固定点移动配置 if (dataPO.FixPoint.Length % 3 == 0) { fixedTargetPosition = new Vector3[dataPO.FixPoint.Length / 3]; for (int index = 0, count = 0; index < dataPO.FixPoint.Length; ++count) { Vector3 pos = new Vector3(dataPO.FixPoint[index++], dataPO.FixPoint[index++], dataPO.FixPoint[index++]); fixedTargetPosition[count] = pos; } } // 随机移动距离 if (dataPO.MoveDistance.Length % 2 == 0) { canMoveDistance = new MoveDistance(); canMoveDistance.min = dataPO.MoveDistance[0]; canMoveDistance.max = dataPO.MoveDistance[1]; } //// 动画系统 animator = GetComponent <Animator>(); //// 移动系统 //if (moveType == MoveType.Walk) //{ // mvAgent = GetComponent<NavMeshAgent>(); // mvAgent.speed = MoveSpeed; // mvAgent.SetDestination(transform.position); //} //else //{ // GetComponent<NavMeshAgent>().enabled = false; //} // 技能与Buffer系统 skillComponent = gameObject.AddComponent <SkillComponent>(); bufferComponent = gameObject.AddComponent <BufferComponent>(); List <int> skillList = new List <int>(); skillList.Add(dataPO.SkillID1); skillList.Add(dataPO.SkillID2); skillList.Add(dataPO.SkillID3); skillComponent.Init(skillList); bufferComponent.Init(); // 特效数据 AddBornEffect(); // 添加头顶UI AppendHeadUI(); // 武器图标 AppendWeaponUI(); // 救援图标 AppendRescueHintUI(); // 暂时特殊处理(BOSS 朝向镜头) //if ((MonsterType)dataPO.MonsterType == MonsterType.Boss) //{ FaceTo(Camera.main.transform.position, 0.0f); //} // Hitting Act hittingPartDic = new Dictionary <string, HittingPart>(); bulletTime = 0.0f; invincible = false; // 刷新音效 if (dataPO.BirthSound.Length == 2) { string sound = dataPO.BirthSound[0]; int percent = dataPO.BirthSound[1].ToInt(); int seed = Random.Range(1, 10000); if (seed > percent) { return; } Main.SoundController.FireEvent(sound); } }
/// <summary> /// 怪物刷新 /// </summary> void OnRefresh() { while (true) { int refreshId; if ((int)sceneId != 3) { refreshId = ((int)sceneId * 10000000) + 10000 + refreshIndex; } else { refreshId = ((int)sceneId * 10000000) + (GameConfig.GAME_CONFIG_DIFFICULTY * 10001) + refreshIndex - 1; } MonsterRefreshPO refreshPO = MonsterRefreshData.Instance.GetMonsterRefreshPO(refreshId); if (refreshPO == null) { return; } MonsterPO monsterPO = MonsterData.Instance.GetMonsterPO(refreshPO.MonsterId); if (monsterPO == null) { return; } if (Main.GameMode.CheckPoint < refreshPO.CheckPoint) { return; } if (Main.GameMode.CheckPoint > refreshPO.CheckPoint) { ++refreshIndex; continue; } // 判断时间 float refreshTime = (float)refreshPO.AppeareTime / 1000.0f; if (refreshTime > Main.GameMode.GameTime) { return; } // 针对有限数量的刷新 if (refreshPO.MonsterNumber > 0) { for (int index = 0; index < refreshPO.MonsterNumber; ++index) { // 马上刷出 if (refreshPO.SeparateTime == 0) { if (monsterPO.FireCarId > 0 && !Main.PlayerManager.getPlayer(monsterPO.FireCarId - 1).IsPlaying()) { return; } if (refreshPO.WindowName.Length > 0 && !DoorManager.instance.OpenDoor(refreshPO.WindowName)) { return; } Monster go = CreateMonster(refreshPO); CarManager.instance.Help(go.CarId, go); } // 延迟刷出 else { DelayRefresh delay = new DelayRefresh(); delay.refreshId = refreshId; delay.refreshTime = Main.GameMode.GameTime + ((float)refreshPO.SeparateTime / 1000.0f) * index; //delayRefreshDict.Add(delayId++, delay); delayRefreshDict.Add(delay); } } } // 如果要循环刷新,这两个值必须有规定 else if (refreshPO.MonsterNumber == -1 && refreshPO.SeparateTime > 0) { bool createFlag = true; if (monsterPO.FireCarId > 0 && !Main.PlayerManager.getPlayer(monsterPO.FireCarId - 1).IsPlaying()) { createFlag = false; } if (createFlag) { if (refreshPO.WindowName.Length > 0 && !DoorManager.instance.OpenDoor(refreshPO.WindowName)) { return; } Monster go = CreateMonster(refreshPO); CarManager.instance.Help(go.CarId, go); } DelayRefresh delay = new DelayRefresh(); delay.refreshId = refreshId; delay.refreshTime = Main.GameMode.GameTime + ((float)refreshPO.SeparateTime / 1000.0f); //delayRefreshDict.Add(delayId++, delay); delayRefreshDict.Add(delay); } ++refreshIndex; } }
/// <summary> /// 怪物延迟刷新 /// </summary> void OnDelayRefresh() { // 按照策划的要求,延迟队列必须是每次全部执行,保证所有怪物的刷新时间能够得到有效的判断 //List<int> deleteList = new List<int>(); //foreach(KeyValuePair<int, DelayRefresh> element in delayRefreshDict) for (int index = 0; index < delayRefreshDict.Count; ++index) { DelayRefresh element = delayRefreshDict[index]; MonsterRefreshPO refreshPO = MonsterRefreshData.Instance.GetMonsterRefreshPO(element.refreshId); if (refreshPO == null) { continue; } MonsterPO monsterPO = MonsterData.Instance.GetMonsterPO(refreshPO.MonsterId); if (monsterPO == null) { return; } if (Main.GameMode.CheckPoint != refreshPO.CheckPoint) { //deleteList.Add(element.Key); delayRefreshDict.RemoveAt(index); return; } if (element.refreshTime >= Main.GameMode.GameTime) { continue; } bool createFlag = true; if (monsterPO.FireCarId > 0 && !Main.PlayerManager.getPlayer(monsterPO.FireCarId - 1).IsPlaying()) { createFlag = false; } if (createFlag) { if (refreshPO.WindowName.Length > 0 && !DoorManager.instance.OpenDoor(refreshPO.WindowName)) { continue; } Monster go = CreateMonster(refreshPO); CarManager.instance.Help(go.CarId, go); } if (refreshPO.MonsterNumber == -1) { element.refreshTime = Main.GameMode.GameTime + ((float)refreshPO.SeparateTime / 1000.0f); delayRefreshDict[index] = element; continue; } //deleteList.Add(element.Key); delayRefreshDict.RemoveAt(index); return; } //for (int index = 0; index < deleteList.Count; ++index) //{ // delayRefreshDict.Remove(deleteList[index]); //} }