Hello.World

之前电脑坏了,博客没有备份。重新写又懒得弄,现在摘取点重点

  • 去掉disqus内置comments字样,在’source/_layouts’下
1
<!--<h1 class="title">Comments</h1>-->
  • BVW Round0 的笔记

被设置为trigger的collider是不会有物理碰撞效果的。

Debug.Log(GameObject.name); 常用Debug

Object 之间通过sendMessage来启用别人script里的方法

Time.realtimeSince… 会keep recording, 而Time.timeSinceLeveLoad 只会更新本level的时间

注意拖拽进来的位置要reset

  • 还有谷歌CEO的coroutine教程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
* Tim Shen

每开一个coroutine,就相当于多开了一个main
那句yield waitforseconds你可以看成简单的“延时若干秒,然后继续执行”
你操作系统宗平教的?

* Fan You

IEnumerator Occur_rocks()
这个就是coroutine?
恩,老宗上课太甩了
他老喜欢拟人。。不讲术语,,

* Tim Shen

对,每调用一次这个函数返回一个新的coroutine
每调用一次就多开一个main的感觉
这个返回值被unity拿去用了,怎么用你暂时可以不用管

* Fan You

那我为啥还得写while才能不停调用

* Tim Shen

这个返回值你可以看成一个coroutine对象,我假象这个对象有close方法,可以用来关闭coroutine等等
因为你这个coroutine要不断的跑啊,不断生成rocks

* Fan You

也就是说返回值我不用管

* Tim Shen

注意coroutine里没有return
嗯,coroutine的返回值是c#帮你搞定的,不是你return的

* Fan You

也就是我要开多个IEnumerator才能实现各种包裹的分离

* Tim Shen

那样也比较清楚

* Fan You

yield 就直接当成刻个让他等待的方法用么

* Tim Shen
yield本身不是。那个wait for才是
yield也有别的用法

* Fan You

yield 是那个什么相当于代码块的占位符

* Tim Shen

啥?

* Fan You

还是哥哥语言yield 都不一样

* Tim Shen

各个语言yield是一个意思。你想知道是什么意思么?

* Fan You

ruby 有yield 就表示占空,然后别的地方代码块可以塞到yield那里执行

* Tim Shen

coroutine和函数不一样。普通函数return之后函数执行就结束了
coroutine的yield后面和return一样,应该跟上一个“返回值”,这个返回值可以供调用者(unity)使用,但是coroutine没有结束,只是被挂在那,不会继续执行
直到unity下次再次调用该coroutine(仿佛调用一个函数一样),该coroutine会从上次yield的那个地方继续执行,仿佛没有中断过
所以coroutine外面(unity)用起来和函数一样,里面是一段代码连续不断在跑。
你说的ruby里其实一回事,yield出一个东西,给外面的block用
若yield nothing,只不过和return nothing类似罢了
所以coroutine刚刚说多线程其实不对,代码执行的顺序是:执行外面代码,某处调用coroutine,跳到coroutine代码,某处yield,跳回外面从调用处继续,某处外面再调用该coroutine,跳进coroutine代码的yield处继续,这样循环。
两片代码都是连续执行,但是来回跳

* Fan You

unity的main方法在哪,它每个script不就是创建了个class嘛

* Tim Shen

Main
被藏起来了

* Fan You

图形化界面的物体发生事件的时候,他回生成这个class的一个实例并执行那些方法?

* Tim Shen

基本是on开头的方法
都是unity规定好的
我觉得class的实例是在初始化的时候就生成了

* Fan You

回到coroutine,一步一步执行,到yield,return 了一个new WaitSecond
这WaitSecond是方法么

* Tim Shen

new啊

* Fan You

它执行了wait几秒这个动作

* Tim Shen

new后面自然是个类

* Fan You

类?就是Class?

* Tim Shen

所以yield出去一个WaitSecond类的实例
这个实例包含一个数字,表示要睡的秒数

* Fan You

然后就跳到WaitSecond执行?
完了再跳回来?

* Tim Shen

new的时候跑去执行wait second的构造函数

* Fan You

那和直接的方法调用区别在哪

* Tim Shen

这不是new嘛

* Fan You

soga

* Tim Shen

new出来一个对象并yield出去
unity看到一个wait second对象
然后会执行wait的动作

* Fan You

那不能直接写new 然后再写个调用嘛

* Tim Shen

关键是怎么让这个coroutine wait

* Fan You

soga

* Tim Shen

unity肯定跑着一个调度器
那个调度器负责谁在什么时候执行
unity也是要告诉那个调度器,让某某coroutine休息一段时间
如果coroutine自己有这个调度器,那也能自己休息自己
但是调度器还是不要暴露给程序员的好
我估计那个调度器是c#自带的,还不是unity的

End

顺便贴个Markdown的doc链接.