/// <summary> /// 仕事割り振り関数 /// </summary> /// <returns>新しく割り振る仕事のtype</returns> public void AssignJob(Ant ant) { InitAntCounter(); //理想値の取得 for (int i = 0; i < jobCount; i++) { if (antjobs[i].Name == "BuilderAntData") { idealrate[i] = ideal_Architect; } else if (antjobs[i].Name == "SoldierAntData") { idealrate[i] = ideal_Soilder; } else if (antjobs[i].Name == "ErgateAntData") { idealrate[i] = ideal_Mule; } else if (antjobs[i].Name == "UnemployedAntData") { idealrate[i] = ideal_Free; } } //diffに現在と理想の割合の差を保存 float[] diff = new float[jobCount]; int[] index = new int[jobCount]; List <int> current = new List <int>(antCounter.Values); for (int i = 0; i < idealrate.Length; i++) { diff[i] = 100.0f * current[i] / total - idealrate[i]; index[i] = i; } //diffを元にindexをソート Array.Sort(diff, index); //一番理想より少ない役職を取得 Type nextjob = antjobs[index[0]]; //別の仕事に割り振るのであれば場所だけコピーして元のアリは殺す if (nextjob.GetType() == ant.Data.GetType()) { return; } AntData newantdata = (AntData)Activator.CreateInstance(nextjob); var newant = NestSystem.Instance.InstantiateAnt(newantdata); newant.transform.position = ant.Data.Position; ant.Data.IsAlive = false; NestSystem.Instance.RemoveAnt(ant); Destroy(ant.gameObject); }
/// <summary> /// AntDataをもとに、対応するAntFactoryを用いてAntのインスタンスを生成する。 /// </summary> /// <param name="antData">生成に使用するAntData。</param> /// <param name="registerToGameContext">新たにGameContextに登録するかどうか。セーブデータからの生成などの際に限りfalseを指定する。</param> /// <returns>生成されたGameObjectのもつAntコンポーネント。</returns> public Ant InstantiateAnt(AntData antData, bool registerToGameContext = true) { //Debug.Log(antData.GetType()); var ant = antFactories.FirstOrDefault(f => f.DataType == antData.GetType())?.InstantiateAnt(antData); if (ant != null) { if (registerToGameContext) { Data.Ants.Add(antData); } spawnedAnts.Add(ant); } return(ant); }
/// <summary> /// AntDataをもとに、対応するAntFactoryを用いてAntのインスタンスを生成する。 /// </summary> /// <param name="antData">生成に使用するAntData。</param> /// <param name="registerToGameContext">新たにGameContextに登録するかどうか。セーブデータからの生成などの際に限りfalseを指定する。</param> /// <returns>生成されたGameObjectのもつAntコンポーネント。</returns> public Ant InstantiateAnt(AntData antData, bool registerToGameContext = true) { AntFactory matchedFactory = null; foreach (var f in antFactories) { if (f.DataType == antData.GetType()) { matchedFactory = f; break; } else if (matchedFactory == null && antData.GetType().IsSubclassOf(f.DataType)) { matchedFactory = f; } } if (!matchedFactory) { Debug.LogWarning($"NestSystem: {antData.GetType()} 用のAntFactoryは登録されていません。"); } var ant = matchedFactory?.InstantiateAnt(antData); if (ant != null) { if (registerToGameContext) { Data.Ants.Add(antData); } spawnedAnts.Add(ant); } return(ant); }
/// <summary> /// AntDataをもとに、シーン上にAntのGameObjectを生成します。 /// </summary> /// <param name="antData"></param> /// <returns></returns> public abstract Ant InstantiateAnt(AntData antData);