土鍋で雑多煮

UnityでXR・ゲーム開発をしています。学んだことや備忘録、趣味の記録などを書いていきます。

MENU

UnityECSで都市開発シミュレーションゲームを作る【その3】~経済を回す~

はじめに

どうも、土鍋です。

都市開発シミュレーションゲームを作るシリーズ三回目は住民がお金を稼いでそのお金を使うという流れを生み出します。

経済を回す

これを知ったので、コードを書き換えました。

donabenabe.hatenablog.com

住民がものを買う

青が店、緑が住民の家。

住民がお金を稼ぐ

黄色い建物はOfficeに設定した建物。

黄色い建物でお金を稼いで、青い建物でお金を使っている。

現状、市民に全部のコードを書いてるのでどうにかしたいなー

System間の参照の仕方とか、建物の種類ごとの処理の切り分けの部分がECSのにおいてよく分からない。

コードは長いので下に

void Execute(ref CitizenBase citizen, ref LocalTransform transform) // Queryの代わり。クエリ条件から合致するEntityを探して実行
{
    float minDistanceSq = float.MaxValue;

    citizen.IncreaseRandomDesire();

    if (!citizen.isNowMove)
    {
        if (IsAlreadyArrived(transform.Position,citizen.home))
        {
            if (citizen.appetite<500 || citizen.pocketMoney<500)
            {
                foreach (var buildingEntity in BuildingEntities)
                {
                    if (BuildingLookup[buildingEntity].buildingType == BuildingType.Office)
                    {
                        float distanceSq = math.distancesq(BuildingPosLookup[buildingEntity].Position, transform.Position);

                        if (distanceSq < minDistanceSq)
                        {
                            minDistanceSq = distanceSq;
                            closestBuildingEntity = buildingEntity;
                            citizen.destinationEntity = closestBuildingEntity;
                        }
                    }
                }
                citizen.destination = BuildingPosLookup[closestBuildingEntity].Position;
            }
            else
            {
                foreach (var buildingEntity in BuildingEntities)
                {
                    if (BuildingLookup[buildingEntity].buildingType == BuildingType.Food)
                    {
                        float distanceSq = math.distancesq(BuildingPosLookup[buildingEntity].Position, transform.Position);

                        if (distanceSq < minDistanceSq)
                        {
                            minDistanceSq = distanceSq;
                            closestBuildingEntity = buildingEntity;
                            citizen.destinationEntity = closestBuildingEntity;
                        }
                    }
                }

                citizen.destination = BuildingPosLookup[closestBuildingEntity].Position;
            }
        }
        else if (IsAlreadyArrived(transform.Position,citizen.destination))
        {
            if (citizen.destinationEntity==Entity.Null)
            {
                citizen.destination = citizen.home;
            }
            else
            {
                if (BuildingLookup[citizen.destinationEntity].buildingType == BuildingType.Food)
                {
                    citizen.destination = citizen.home;
                    citizen.appetite = 0;
                    citizen.pocketMoney -= 500;
                }
                else if (BuildingLookup[citizen.destinationEntity].buildingType == BuildingType.Office)
                {
                    citizen.destination = citizen.home;
                    citizen.pocketMoney += 500;
                }
            }
        }
    }
    
    Move(ref citizen, ref transform);
}