/// <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);
        }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
 /// <summary>
 /// AntDataをもとに、シーン上にAntのGameObjectを生成します。
 /// </summary>
 /// <param name="antData"></param>
 /// <returns></returns>
 public abstract Ant InstantiateAnt(AntData antData);