__original_drawn_by_aono_ribbon__e9e6da4976f9daabaa68ad1330b45c45.jpg
上一篇:


第四节



我们开始定义城市内容,Scripts文件夹下创建一个City 脚本,挂载到空物体city上,接下来思考需要定义的具体信息

jobceiling=factories*10//岗位天花板,上限
jobsCurrent = min(currentPopulation,jobceiling) //当前工作人数取当前人口和工作岗位两者较小值
Currentfood +=farms*5//定义当前食物量每回合增加农场数x5,也就是1间农场每回合提供5食物
populationCeling=houses*5//人口上限为住房x5,每间住房提供5人口上限。
If currentfood>=cpop&&cpop<popceiling//如果当前食物量大于当前人口数并且当前人口数未满
    Food -=cpop*2.0f  //每个人口每局消耗2份食物
    Cpop = min(cpop+=food*.20f,popceiling) //当前人口取当前人口增长后数量与上限较小值,
    当前人口增长量受食物量影响,食物缺乏后,人口每回合减少,系数0.2。
    Cash+=currentJobs*20 //收入每个岗位每局提供20块

创建prop 按tab两次自动填充属性,tab键切换需要修改的信息,比如int或者命名为Cash,属性都是大写开头,和字段不一样。对应后方定义一个同字母小写的字段cash(比如private int cash;),属性封装字段,虽然这里对get set封装规则并没有定义,不妨碍后期项目需求,对属性读取写入进行规则限定,一些常见限定规则比如age年龄录入,我们添加 age>0&&age<150之类的,就可以起到一定的规范和保护字段作用。Cash属性充当交换对话窗口的意思,实际信息存储在小写的private隐藏字段cash里。这里略去
我们继续prop一个 int Day,一个 float CurrentPopulation,一个 PopulationCeiling,人口增加根据我们讨论的,0.2系数,是可能会有小数的,所以定义为float ,方便精确计算数值,后期再取整显示到UI里面,更合适一些。
一个 int CurrentJobsint Jobsceiling ,float Food,因为food也参加计算到cpop里面,所以设为float,相同数据类型,方便统一计算。
这些属性都是公共的,方便我们从外部UI类调用显示,或者其他脚本读取相关数据进行计算。

创建一个array数组,存储各种建筑信息。每放置一个建筑,我们在array里面记录数目,方便统计和调取。
我们计算城市信息时,道路虽然暂时不需要计算进来,但是后期面板控制建造新的建筑时候,道路也要参加计算,所以,一个良好的习惯就是,即使将道路位置留空,也别省略,否则后期添加进来后,这个index要全部重新排序,工作量先不说,还容易出错遗漏。所以这个array我们定义全部4种建筑,(道路,住宅,农场,工厂)

Public int[] buildingCounts = new int [4];初始化一个数组

Start()里面设置初始属性

Cash =2000;
Food=20;
JobsCeiling=10;

我们在end每一局的时候,统一计算各种数据,于是我们先设定一个EndTurn方法

Public void EndTurn()
{

//这里不断填充各种方法

Day++;
Debug.Log("一天结束了!");
}

好了,我们开始从简单的计算做起
计算工作岗位(跟住房相关)

Void CalculateJobs()
{
        JobsCeiling = buildingCounts[2] * 10;
        CurrentJobs = Mathf.Min((int)CurrentPopulation,JobsCeiling);

//方便显示实际总工作岗位。取较小值,可以做到即使人口30,工作岗位只有20个的时候,也显示20/20工作中,这样会科学合理一些。
添加进EndTurn;
计算资金

Void CalculateCash()
{
Cash +=JobsCurrent*20;
}

添加进EndTurn;
计算食物(跟农场相关)

Void CalculateFood()
{
Food +=buildingCounts[3]*5f;
}

添加进EndTurn;
最后计算出最复杂的人口计算

Void CalculatePopulation()
{
PopulationCeiling = buildingCounts[2]*5;//一个住宅提供5人口上限
If(Food>=PopulationCurrent&&PopulationCurrent<PopulationCeiling)//首先做食物足够且人口未达到上限情况下的判断,此时人口是肯定可以增长的,做一个增长后人口与天花板对比较小值,作为新一局currentPopulation人数。
{
Food -=CurrentPopulation*2.0f;
PopulationCurrent = Mathf.Min(PoplationCurrent +=Food*.20f,PopulationCeiling);
}

当食物不足时候

Else if (Food<PopulationCurrent)
{
PopulationCurrent -=(PopulationCurrent -Food)*.5f;
}

添加进EndTurn;
EndTurn里面同时加一个

Debug.LogFormat("岗位:{0}/{1},资产:{2},人口:{3}/{4},食物:{5}",
CurrentJobs,JobsCeiling,Cash,CurrentPopulation,PopulationCeiling,Food);

可以进游戏测试了
先把Canvas里面点击EndTurn 按钮,右下角添加一个add on event,选择city里面endturn方法。查看log日志。
对了,需要设置一些建筑。

Void Start(){
      buildingCounts[0] = 1;
        buildingCounts[1] = 8;
        buildingCounts[2] = 4;
        buildingCounts[3] = 2;

再进游戏测试。
我们发现,后期人口剧减,但是工作中的人和实际人数不一致,看来还要改进一下:

CalculateJobs();

应该在

CalculateFood();
CalculatePopulation();

后,先计算食物,从而获得能供应的人口数,人口数和人口天花板影响工作人数,最后计算工作人数,这样就没问题了。
城市设定基本雏形完毕
下一篇:

Last modification:August 12, 2020
If you think my article is useful to you, please feel free to appreciate