Unity-根据时间开灯与关灯
声明:本人只是学生,并且只是自学Unity,如有大神,不喜勿喷,不足之处,请指出!
本项目使用了UniStorm 3.0(天气)插件,时间也是调用它本身的API,实际并不影响,用系统的时间的是也是可以的
打开自己建立的Unity项目
找个灯的模型拖到场景中去
给灯模型添加Component,搜索Light
这种Light添加方式默认就是居中的,我觉得不适合这种长的灯管,其他加Light方式在下面
另种Add Light方式
这种方式就比较好,可以调整灯泡的位置
脚本出场了
建立一个C#脚本,我就随便加在模型的文件夹里,演示我就随便加了,该规范还是要规范,不规范很难找到文件的,命名为MyLight,双击MyLight脚本打开VS(可能有的人的代码编辑器不一样,实际差不多)
代码-变量
既然要做时间,那么就得考虑开灯与关灯,什么时候开灯什么时候关灯,所以声明了OpenLightTime 与
OffLightTime变量,根据小时(24小时)来判断,所以变量我就用了Int类型,其余的float类型,
public开头 就可以在Unity里面调整参数了
我为什么不写在Update里面而是写在FixedUpdate里呢?网上的大神已经说的很明白了,我就不说了
//开灯时间 public int OpenLightTime = 18; //关灯时间 public int OffLightTime = 6; //开灯后最大亮度 public float LightIntensity = 5f; //开灯与关灯速度 public float OpenAndOffSpeed = 0.01f;
代码-判断
UniStormSystem.Instance.Hour 是UiSotrm插件返回当前时间的一段代码,不用插件的话可以调用系统时间来做
if(gameObject.GetComponent<Light>()) { //如果挂载脚本的游戏对象有Light组件就执行这里的方法 if (UniStormSystem.Instance.Hour >= OffLightTime && UniStormSystem.Instance.Hour <= OpenLightTime - 1) { //判断时间是否处于关灯的时间内 if (gameObject.GetComponent<Light>().intensity >= 0) { //判断Light亮度是否小于等于0 gameObject.GetComponent<Light>().intensity -= OpenAndOffSpeed; //这里-=OpenAndOffSpeed 作用是让灯有过渡的亮度,不会一下子就关 } } else { //如果时间不处于关灯的时间段,则执行这里的方法 if (gameObject.GetComponent<Light>().intensity < LightIntensity) { //判断组件亮度是否小于LightIntensity,小于就执行这里的方法 gameObject.GetComponent<Light>().intensity += OpenAndOffSpeed; //这里+=OpenAndOffSpeed 作用是让灯有过渡的亮度,不会一下子就开 } } }else if(gameObject.transform.Find("Point Light1") || !gameObject.transform.Find("Point Light2") || !gameObject.transform.Find("Point Light3")) //否则判断游戏对象的子节点是否含有Point Light名称,如有则执行这里的方法,和上面的逻辑一样,就不重复解释了 { if (UniStormSystem.Instance.Hour >= OffLightTime && UniStormSystem.Instance.Hour <= OpenLightTime - 1) { if (gameObject.transform.Find("Point Light1").GetComponent<Light>().intensity >= 0) { gameObject.transform.Find("Point Light1").GetComponent<Light>().intensity -= OpenAndOffSpeed; gameObject.transform.Find("Point Light2").GetComponent<Light>().intensity -= OpenAndOffSpeed; gameObject.transform.Find("Point Light3").GetComponent<Light>().intensity -= OpenAndOffSpeed; } } else { if (gameObject.transform.Find("Point Light1").GetComponent<Light>().intensity < LightIntensity) { gameObject.transform.Find("Point Light1").GetComponent<Light>().intensity += OpenAndOffSpeed; gameObject.transform.Find("Point Light2").GetComponent<Light>().intensity += OpenAndOffSpeed; gameObject.transform.Find("Point Light3").GetComponent<Light>().intensity += OpenAndOffSpeed; } } }
Unity-运行场景效果
早上6点关灯
晚上18点开灯
完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TimeToLight : MonoBehaviour { public int OpenLightTime = 18; public int OffLightTime = 6; public float LightIntensity = 5f; public float OpenAndOffSpeed = 0.01f; private void FixedUpdate() { if(gameObject.GetComponent<Light>()) { if (UniStormSystem.Instance.Hour >= OffLightTime && UniStormSystem.Instance.Hour <= OpenLightTime - 1) { if (gameObject.GetComponent<Light>().intensity >= 0) { gameObject.GetComponent<Light>().intensity -= OpenAndOffSpeed; } } else { if (gameObject.GetComponent<Light>().intensity < LightIntensity) { gameObject.GetComponent<Light>().intensity += OpenAndOffSpeed; } } }else if(gameObject.transform.Find("Point Light1") || !gameObject.transform.Find("Point Light2") || !gameObject.transform.Find("Point Light3")) { if (UniStormSystem.Instance.Hour >= OffLightTime && UniStormSystem.Instance.Hour <= OpenLightTime - 1) { if (gameObject.transform.Find("Point Light1").GetComponent<Light>().intensity >= 0) { gameObject.transform.Find("Point Light1").GetComponent<Light>().intensity -= OpenAndOffSpeed; gameObject.transform.Find("Point Light2").GetComponent<Light>().intensity -= OpenAndOffSpeed; gameObject.transform.Find("Point Light3").GetComponent<Light>().intensity -= OpenAndOffSpeed; } } else { if (gameObject.transform.Find("Point Light1").GetComponent<Light>().intensity < LightIntensity) { gameObject.transform.Find("Point Light1").GetComponent<Light>().intensity += OpenAndOffSpeed; gameObject.transform.Find("Point Light2").GetComponent<Light>().intensity += OpenAndOffSpeed; gameObject.transform.Find("Point Light3").GetComponent<Light>().intensity += OpenAndOffSpeed; } } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南