第一周 新项目熟悉 UGUI mvvm框架、UIText本地化、csv表格转为json文件、从谷歌服务器下载csv表工具制作
一、UGUI Mvvm框架
第一次接触mvvm框架,首先不管是什么,先看看这个东西是怎么用的,之后再来分析一下。
首先需要再 canvas 节点上放置 Root Model View,这个脚本会在运行时最先被实例出来。
然后再Default Context中添加你自己写的控制脚本,这个脚本将会控制所有这个Canvas上的所有UI。接下来看看这个 Context 脚本该怎么写。
//首先脚本需要继承 MonoBehaviourContext 这样才可以挂载到Default Contexts上面去
public class ModelCtrl : MonoBehaviourContext
{
#region Property Text
//这里定义属性 Property 这里的泛型 string 对应了绑定的UI上的属性
private readonly Property<string> _privateTextProperty = new Property<string>();
public string Text
{
get {
return _privateTextProperty.GetValue(); }
set {
_privateTextProperty.SetValue(value); }
}
#endregion
//这里做一个测试效果 就是按下A然后 改变text的内容
private void Update()
{
if (Input.GetKey(KeyCode.A))
{
Text = "测试";
}
}
}
然后接下来我们来创建一个text
接下来看看,我们这个Text的属性时如何改变UI显示的。
我们需要在UI上挂一个 UGUI Text Binding 脚本,然后再Path中填写,在ModelCtrl中的属性名称。这样Text Binding会自动去Canvas的RootModelView中寻找Default Context,然后找到path的属性与其绑定,这样只需要修改Text字符串即可,免去了查找物体,获取组件,修改这些步骤,使得ui和逻辑分离。
如果要给一个button添加点击事件,只需要在ModelCtrl中添加点击函数
void OnButtonClick()
{
Debug.Log("按钮被点击");
}
然后再button上添加onclick绑定脚本,在Path中添加函数名即可。
如果要设置一个UI的Active,只需要设置一个bool的Property即可。
#region Property TextActive
private readonly Property<bool> _privateTextActiveProperty = new Property<bool>();
public bool TextActive
{
get {
return _privateTextActiveProperty.GetValue(); }
set {
_privateTextActiveProperty.SetValue(value); }
}
#endregion
这样就可以通过设置这个bool值来控制UI的Active了。这里面还有很多其他属性的绑定。其功能会在以后的博客中慢慢演示。
关于mvvm框架,主要分为Model、View、ViewMode。
- Model: 代表数据模型,数据和业务逻辑都在Model中定义,
- View:代表UI试图,负责数据的显示;
- ViewModel :负责监听model中数据的改变并控制试图更新,处理用户交互操作。
MVVM框架的实现原理,和其他绑定组件的用法,后面博客再详细分析,这次先简单说一下用法让大家简单感受一下使用的感觉。
二、关于文字的本地化
MVVM框架中集成了文字本地化的相关功能。
在Format中用 $ $引起来的内容,是可以在代码中加载输出的。例如
之后我们需要在Awake里将TextBinding的中的 I18NModifier 委托注册一个你自己实现的函数,那么此时当这个Text要显示的时候,会将NickName传递到委托函数中,你返回的值就是 $ $中间的内容。这样就可以将各国的语言存放到json表中,在 $ $中放入key,委托函数里面通过key去寻找对应的value返回,这样就可以做到文字的本地化。 这里做一个简单的演示。
private void Awake()
{
TextBinding.I18NModifier += key => {
return "별명"; };
}
private void Start()
{
Text = "abcd1234";
}
三、将CSV转换成json文件。
这里主要是因为,游戏中需要将多国的语言制作成csv表格,如果要做本地化,那么就要像之前说的,解析这些csv表格,转成json文件,然后再text中绑定key值,来寻找value实现文字的本地化功能。
这边工具还是比较简单的,直接上代码,需要注意的是再csv中,是用逗号作为分隔符,那么如果一个item中存在逗号的时候,这个item会被双引号引起来。如下图:
规律呢,就是一个item中引号的个数一定是双数的,如果你发现两个逗号中的元素引号是单数的,那么这个其中一定有一个逗号是,表中带有的,你需要拼接。
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Text;
public class ToolsMune
{
[MenuItem("Tools/Csv2Json")]
static void CsvToJson()
{
//Debug.Log(Application.dataPath + "/csvTable.csv");
string[] scvline = File.ReadAllLines(Application.dataPath + "/csvTable.csv");
string[] Language = scvline[0].Split(',');
for (int i = 1; i < Language.Length; i++)