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;
                }
            }
        }
         
        

    }
}

原文地址:https://www.cnblogs.com/LRolinx/p/13850387.html