本文参考 博主大大的文章,非常感谢!
因为任务需要做一个unity的红绿灯,对于小白的我来说就想去搜一个教程,后来发现博主大大们的教程多少还是需要一些基础的,所以我就想做一个更加详细的版本,来帮助新手村的同伴,嘻嘻!
好的,接下来就是正式的部分了。
首先我们先来看看这个模型的最终模样吧!
通过观察图片,就可以发现这个红绿灯模型需要两个方块,两个圆柱体和四个球形,以及一块板作为路面。
这是完整的模型,所需要的组件。Trafficonal Light(父)和GameObject(子)都是Create Empty组件,二者是具有层级的从属关系的。紧接着在GameObject下还有Cube(1)、Cube、Sphere、Cylinder(1)、Cylinder组件,这些构成了红绿灯的大体框架,接下来与GameObject同级的ball1(绿)ball2(黄)ball3(红)分别是三个灯,这三个灯实际是三个球形,接下来与Trafficonal Light同级的plane是路面。
那么如何来找到他们呢?
在Hierarchy面板里空白的地方→鼠标左键会出现
就可以找到Greate Empty了,需要大家为它重新命名为Trafficonal Light,然后将鼠标放在Hierarchy面板里Trafficonal Light上→左键→Greate Empty→命名为GameObject,这样第一步就完成了。
继续按照同样的道理,Hierarchy面板→Trafficonal Light→3D Object就会出现
点击Sphere→命名为ball1,依次操作三次,分别命名为ball1,ball2,ball3,这就是三个灯球。
继续按照刚才的操作Hierarchy面板→Trafficonal Light→GameObject→3D Object→[ Cube(1)、Cube、Sphere、Cylinder(1)、Cylinder],到这里前期的准备工作就完成了!
现在就可以开始将模块进行排列组装啦!
用这些工具↑↑↑
组装完成之后呢,需要给它们创建材质。
步骤:Project界面→Assets→鼠标左键→Create→Material
相信根据颜色大家就能知道前两个是为谁准备的材质,第三个gray材质是给圆柱体的,剩下的material,material1,material2则是给三个灯球的,这三个材质需要在Inspector界面设置Shader
步骤:点击材质球—>Inspector界面—>Shader—>Legacy Shaders—>Transparent—>Diffuse
(注意三个灯球的材质都需要这样设置哦)
设置好材质后需要将材质拖给对应的组件。
接下来也就是最重要的一部就是创建C#脚本,并将脚本命名为Trafficonal Lights Controller拖拽给Trafficonal Light组件,并给脚本加入代码,然后将三个小球ball1ball2ball3分别拖拽到B1B2B3框框中。
最后的重头戏代码,请大家尽情取用!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TrafficLightsController : MonoBehaviour
{
// 修改:将 Rigidbody 改为 GameObject(除非你确实需要物理组件)
public GameObject b1, b2, b3;
private float alltime = 10f;
void Start()
{
// 初始化所有灯为白色
SetLightColor(b1, Color.white);
SetLightColor(b2, Color.white);
SetLightColor(b3, Color.white);
// 设置定时器
InvokeRepeating("TurnGreen", 0f, alltime);
InvokeRepeating("TurnBlack_b1", 4f, alltime);
InvokeRepeating("TurnYellow", 4f, alltime);
InvokeRepeating("TurnBlack_b2", 6f, alltime);
InvokeRepeating("TurnRed", 6f, alltime);
InvokeRepeating("TurnBlack_b3", 10f, alltime);
}
// 通用方法:设置灯光颜色
private void SetLightColor(GameObject lightObj, Color color)
{
Material material = new Material(Shader.Find("Legacy Shaders/Transparent/Diffuse"));
material.color = color;
lightObj.GetComponent<MeshRenderer>().material = material;
}
// 各状态方法
void TurnGreen() => SetLightColor(b1, Color.green);
void TurnYellow() => SetLightColor(b2, Color.yellow);
void TurnRed() => SetLightColor(b3, Color.red);
void TurnBlack_b1() => SetLightColor(b1, Color.white);
void TurnBlack_b2() => SetLightColor(b2, Color.white);
void TurnBlack_b3() => SetLightColor(b3, Color.white);
}