前言

记录在使用Unity的过程中的一点心得,不能说是什么正儿八经的经验,只是一点个人使用感悟。

正文

For循环

for 循环中的临时变量 i 不可靠,需要用到时建议使用一个局部变量来代替

1
2
3
4
5
6
7
8
for(int i = 0; i < 10 ; i++)
{
//用局部变量 index 代替
int index = i;

...

}

对象变量在委托回调中的使用

在 c# 中,如果变量在多个委托回调中使用,因为回调的时序未知,很容易出现已经保存在集合中的数据再次异常更改。因为保存的是对象的引用地址,因此对应的对象在某个未可控的委托回调中会被再次修改。(C#委托语法糖的弊端所在)
例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
MyItem myItem = new MyItem();
List<MyItem> itemList = new List<MyItem>();
Button SetButton = transform.Find("SetButton").GetComponent<Button>();
SetButton.onClick.RemoveAllListeners();
SetButton.onClick.AddListener(delegate{
myItem.age = 18;
});

Dropdown dropdown = transform.Find("Dropdown").GetComponent<Dropdown>();
dropdown.onValueChanged.RemoveAllListeners();
dropdown.onValueChanged.AddListener((bool isOn) =>{
//重新选择下拉选择,进行数据清理
myItem.age = 0;
});

Button SubmitButton = transform.Find("SubmitButton").GetComponent<Button>();
SubmitButton.onClick.RemoveAllListeners();
SubmitButton.onClick.AddListener(delegate{
//此时添加的数据不可控,因为可能会因为在某个委托回调中被修改
itemList.Add(myItem);
});

建议修改成这样:

1
2
3
4
5
6
7
Button SubmitButton = transform.Find("SubmitButton").GetComponent<Button>();
SubmitButton.onClick.RemoveAllListeners();
SubmitButton.onClick.AddListener(delegate{
MyItem myItemTemp = new MyItem();
myItemTemp.age = myItem.age;
itemList.Add(myItemTemp);
});

C#中字符串前面加@

加@表示无视转义符的存在。比如@”\n” 不是表示换行,而是表是\和n

1
@"{""Input"":""stone"", ""Output"":""gold""}"

1
"{\"Input\":\"stone\", \"Output\":\"gold\"}"

是等效的——用于转义双引号中的双引号


to be continued…