搞过嵌入式开发的人应该都知道最简单的入门级程序就是流水灯,如果没见过的话,你可以看一下地铁门上方的站点LED灯,大概就是下图这个效果:
没错,不是“Hello world”,可能对于应用层程序而言,最简单的程序应该是“Hello World”,但是如果在单片机开发中要实现显示“Hello World”的效果,如果你用LED显示,你需要懂字库;如果用LCD显示,你可能需要了解LCD驱动程序,这都不是一个初学者所能掌握的,反而是这种只需要置0或1的电平操作要更简单一些。
然而在Unity中要实现流水灯,大概对于初学者有一定的难度,反正笔者在刚接触的Unity的时候试着写了一个流水灯类似的Unity程序,自然是Bug百出,然后百度搜也搜不到,一搜全是单片机的流水灯。所以写下这篇文章,为那些和我遇到同样问题,但又无处寻找答案的初学者提供思路,涉及的东西不太深,大神勿喷。
实现效果及思路
我这里用材质颜色代替灯光,为了效果更明显些,而且这种方式对新手也比较友好,你也可以用灯光组件强度来实现,效果都差不多,最终效果如下图:
这里分成两步:
- 循环定时回调
- 更改材质
对于定时回调提供五种思路:
- InvokeRepeating实现
- 协程加while(true)实现
- Plane大神的PETimer插件实现
- 声明定时变量实现
- 修改Time面板中的Fixed Timestep的值,并在FixedUpdate中实现
对于更改材质提供三种思路(参考嵌入式开发思路):
- 把所有情况都写出来,逐个更改材质
- 先把所有材质置白,指定的材质置红
- 使用变量记录上一次索引,发现这次的变量和上次不一样时更改材质,然后将上次索引改为这次的索引
下面对以上8个思路一一实现如下:
更改材质函数实现一(穷举)
代码实现如下:
private int index = 0;
public List<MeshRenderer> sphereList;
public void ChangeMat01(int tid){
switch (index){
case 0:
sphereList[4].material.color = Color.white;
sphereList[0].material.color = Color.red;
break;
case 1:
sphereList[0].material.color = Color.white;
sphereList[1].material.color = Color.red;
break;
case 2:
sphereList[1].material.color = Color.white;
sphereList[2].material.color = Color.red;
break;
case 3:
sphereList[2].material.color = Color.white;
sphereList[3].material.color = Color.red;
break;
case 4:
sphereList[3].material.color = Color.white;
sphereList[4].material.color = Color.red;
break;
}
index++;
index %=