unity3dC#⼩⽩上⼿简单易懂(⼀)制作红绿灯【超简易版】红绿灯的闪烁
Unity3d的C#语⾔编程脚本
刚刚接触Unity差不多⼀个星期,慢腾腾地摸索出了⼀些东西,我把这些作为我的学习笔记记录下来。我⽤的unity版本是最新的2019.2.12,C#是在下载unity时⾃动帮我下载的Visual Studio上写的。
模型的创建
⾸先是在unity中⽤Hierarchy的正⽅体,球体等模型画出⼀个红绿灯。过程不赘述,效果如图:
脚本编辑
碎碎念
其实我在刚开始做这个脚本的时候真的很头疼,虽然之前学过Java,但是对Unity和C#⼀点也没有接触过,刚开始学的时候去学校借了⼀⼤堆书,没看出个所以然来,后来还是在B站上看了⼀个视频,跟着up做了⼀个Roll A Ball,才感觉稍微好了⼀点。我做的这个红绿灯主要功能就是先亮绿灯,然后黄灯,接着红灯,然后循环……功能很简单,但我也憋了好久。。。最近脑壳不太灵光。
初试
刚开始写这个功能的时候我⾸先考虑的是如何让这个灯亮起来,要让这个灯亮起来的意思就是让这个球体模型变成 绿⾊。但是我们不能在unity的inspector上直接给他改颜⾊,我们现在做好的模型是默认的没有颜⾊,像图中灰灰的⼀样。为了虚拟仿真,游戏开始的时候这三个灯应该都是⿊⾊的。所以我们要使他在游戏开始的时候是⿊⾊,亮绿灯,⼏秒过后⼜变⿊,然后再亮起来……这就涉及到了⼀个给unity中的物体修改材料的⽅法,代码如下:
Material material =new Material(Shader.Find("Transparent/Diffuse"));
GetComponent<Renderer>().material = material;
刚开始的时候我想着红绿灯要计时,所以我必须有个计时器,于是我在⽹上搜了⼀⼤堆关于C#计时器的代码,然⽽并没有什么卵⽤……最后我到了这⼀段代码:
public class GreenController : MonoBehaviour
{
private float lastTime;//计时器
private float curTime;
void Start()
{
Material material =new Material(Shader.Find("Transparent/Diffuse"));
GetComponent<Renderer>().material = material;
lastTime = Time.time;
}
void Update()
{
小白学java有前途吗curTime = Time.time;
if(curTime - lastTime >=3)//时间差⼤于3秒过后
{
Material material =new Material(Shader.Find("Transparent/Diffuse"));
GetComponent<Renderer>().material = material;
}
}
}
这段代码是我看了以后写的。代码不难懂,最后在unity⾥⾯也运⾏出来了,但是!问题来了:curTime是每⼀帧都在更新的,这样写可以让我的绿灯第⼀次亮起时正常,但亮了3秒以后他就会永远变⿊,再也亮不起来,怎么办呢?
改进
我的红绿灯有三个灯泡,也就是说⼀个球体控制⼀个灯,每个球体要么亮起颜⾊,要么变⿊,⽽且都是每隔⼀段固定的时间变⾊,⽽在c#中有这么⼀个神奇的函数:
InvokeRepeating("wow", startime, waitime);//startime秒后调⽤wow() 函数,之后每waitime秒调⽤⼀次
这个函数是⽤在start⽅法⾥⾯的,看到这个⽅法是不是豁然开朗了很多!
所以最后我的绿灯脚本是这样的:
float gtime =4;//绿灯亮4秒,从第零秒开始
float darktime =4;//从第四秒变⿊
float alltime =10;//黄灯2秒,⼀轮总共10秒
void start(){
Material material =new Material(Shader.Find("Transparent/Diffuse"));
GetComponent<Renderer>().material = material;//开始时将灯设置为⿊⾊
InvokeRepeating("GreenTurn",0f, alltime);//0秒后调⽤GreenTurn() 函数,之后每10秒调⽤⼀次InvokeRepeating("TurnBlack", darktime, alltime);//绿灯灭
}
void update(){}
void GreenTurn(){
Material material1 =new Material(Shader.Find("Transparent/Diffuse"));
GetComponent<Renderer>().material = material1;
}
void TurnBlack(){
Material material2 =new Material(Shader.Find("Transparent/Diffuse"));
GetComponent<Renderer>().material = material2;
}
运⾏
红灯和黄灯都是⼀样的,最后我的运⾏结果是这样的:
这个红绿灯还有很多可以完善的地⽅,以后还会修改升级,请⼤家多多关注我的博客啦,有什么错误的或者不妥当的地⽅欢迎各位批评指,技术⼩菜求之不得,感谢各位的观看!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论