上一篇:
第四节
我们开始定义城市内容,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 CurrentJobs
,int 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();
后,先计算食物,从而获得能供应的人口数,人口数和人口天花板影响工作人数,最后计算工作人数,这样就没问题了。
城市设定基本雏形完毕
下一篇: