yande.re 482812 sample animal_ears bunny_ears dress gochuumon_wa_usagi_desu_ka_ heels hoto_cocoa kafuu_chino shiratama shiratamaco thighhighs.jpg
上一篇:


第五节 UI显示设定



创建UIController 脚本
我们要在每一局更新左上角的Day.text和右下角的CityData.text信息,
进入UIController,我们首先要获得city物体上的各种属性信息,先实例化一个city类

private City city;

Void Start()里面首先找到需要的city

City =FindObjectOFType<City>();

或者city=GetComponent<City>;//如果我们当前脚本挂载在city物体上,就可以用这个,直接获取当前的City组件,如果不确定挂载位置,就采用上面的全局搜索City物体,占用资源会略高一些。这里目前采用第一种方式
然后获取text信息,我们需要调用UnityEngine.UI下面 的Text功能,从而对UI界面的Text组件进行修改信息。

private UnityEngine.UI.Text;

或者直接在命名空间处调用

Using UnityEngine.UI;

这样就可以直接使用Text类了:

//[SerializeField]
private Text dayText;
//[SerializeField]
private Text cityDataText;

目前这些获取的信息全是private,并没有serialized 序列化exposed展示 在面板上,因此我们采用SerializedField对需要展示的信息进行序列化展示。这样我们可以展示出来需要的属性,而且又不需要公开它们,只允许UI界面调用读取这些数据,达到展示出来同时又保护了数据。
目前UIController基本功能差不多有了,我们挂载到City物体上看看
既然确定挂载在City物体上,我们的City组件也在这个物体上,可以直接对脚本内寻找City组件的方式可以改为搜索范围更小的,直接在当前物体上搜索City组件方式,
City =FindObjectOFType<City>();

City=GetComponent<City>;

我们每局结束EndTurn执行时,对于城市数据计算方面,上一节做的比较完整了,包括人工,资产,粮食,岗位等数据会进行统一计算,那么对于这节UI部分,需要调用两个方法进行UI信息的更新,一个是左上角Day数据,一个右下角CityData数据,首先来实现

UpdateDayCount():
Public void UpdateDayCount()
{
    dayText.text="今天是第“+city.Day.ToString()+“天”;
}

由于我们每次计算的Day.text只统计了Day++,也就是只显示1,2,3,单独数字,故而补充成上面的样子,如果嫌这样难看,可以标准化输出。为什么使用public,因为我们要在city脚本里最后EndTurn每日结算需要调用UIController组件里面几个关于ui的这几个update方法,在这个类下面的两个update daycount和citydata方法,需要外部调用,因此方法设为public
dayText.text=string.Format("今天是第{0}天“,city.Day);
通过占位符和属性分别列出,规范显示。
接下来做CityData数据更新:
CityData数据我们在上一节已经有了一些示例模板,可以从Debug.Log显示复制过来稍加修改格式

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

稍加修改:改debug为string,加n换行符,改属性路径为city.组件内,

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

最后成品,最前方加上cityDataText.text=,这样就可以输出较为理想的右下角城市data数据了
接下来,我们进入city脚本,我们需要在start方法里实例化咱们的UIController:
先在main函数里定义一个

private UIController uiController;

start方法里实例化:

uiController=GetComponent<UIController>();

接下来我们可以在EndTurn方法里call咱们UIController组件下的两个update方法了:

uiController.UpdateCityData();
uiController.UpdateDayCount();

好了,差不多功能都完整部署了,我们从Hierarchy面板进City物体,将2个部分text组件拖到咱们的UIController脚本上挂载,开始游戏看看显示效果。
人口和食物是float浮点显示,我们考虑转为整数显示,可以有不少方法,比如计算后直接强制转换为整数,或者仅仅在显示的时候转换显示效果,不影响计算过程。直接在UIController脚本里updatecitydata方法里,将 city.populationCurrent,city.populationCeilingcity.food前加 (int),搞定,
再做点小美化,比如资产:{2}后面加一个¥人民币符号,最后运行游戏再查看下效果。
我们最后还想给每一局显示结束当前局,您将获得多少金钱收益,因此在资产后加上 (+{6}¥),后面的属性最后一个补上相应数据,即:city.CurrentJobs*20,这就是标准化输出占位符规则,占位符顺序可以打乱,实际调用的属性为后面依次排序的属性,6代表第七个属性。而不是0126这种顺序,并不是第四个。
这是简单显示每局数据的方法,复杂点的,你可以在每个calculate方法中,return 对应value,然后在endturn展示对应返回的value,这样也可以达到显示效果。
最后这节功能也差不多实现完毕,我们的UI基本功能已经可以实现,再次回到endturn里面,仔细推敲下各个calculate的顺序,资产计算到底放在最后还是最前面比较合适呢?
我们知道,这里是用来显示下一局信息,放在最前,执行的是当前局未改变信息的数据,所有在当前局新建的房屋,农场,工厂,产生的效果并不会计算显示在下一局开头
如果放在最后计算,则数据已经是将这些刚部署的新建筑产生的数据影响计算进来,在下一局刚开始就已经获得一次新建筑产生的收益了
我们在这里,希望的是当前一局部署新建筑,使之在下一局开始之后产生收益,而不希望新部署的建筑这局就生效,直接下一局刚开始就结算一次收益了,所以还是放在最前计算资产,比较符合我们的预期。
这个思考本身没什么卵用,不过如果你以后的项目数据较多,就需要养成思考,之前我们提到的先计算食物和人口,再计算工作中的人员,也是这个道理,小细节,大差别,这不是编程要学的,但是却很重要
下一篇:

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