【Unity】简易版环境灯光控制模拟环境现实太阳

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[XLua.Hotfix]
public class SkyLightController : MonoBehaviour
{
    [Range(0, 180)]
    public float perXAngleChangedDir = 40;
    [Range(0, 360)]
    public float perYAngleChangedDir = 40;
    [Range(0, 360)]
    public float perZAngleChangedDir = 40;

    [Range(0, 360)]
    public float xSpeedRandomMin;
    [Range(0, 360)]
    public float xSpeedRandomMax;

    [Range(0, 360)]
    public float ySpeedRandomMin;
    [Range(0, 360)]
    public float ySpeedRandomMax;

    [Range(0, 360)]
    public float zSpeedRandomMin;
    [Range(0, 360)]
    public float zSpeedRandomMax;

    private Light m_Light;
    private float rawXAngle;
    private float rawYAngle;
    private float rawZAngle;

    private float dynamicXAngle;
    private float dynamicYAngle;
    private float dynamicZAngle;

    static Vector3 v3Angle;

    float xSpeed;
    float ySpeed;
    float zSpeed;

    int xDir;
    int yDir;
    int zDir;

    float recordLastChangeDirXAngle;
    float recordLastChangeDirYAngle;
    float recordLastChangeDirZAngle;

    static int[] dirs = { -1, 1 };

    private void Awake()
    {
        m_Light = GetComponent<Light>();
        var localEulerAgnles = this.transform.localEulerAngles;
        rawXAngle = localEulerAgnles.x;
        rawYAngle = localEulerAgnles.y;
        rawZAngle = localEulerAgnles.z;

        dynamicXAngle = rawXAngle;
        dynamicYAngle = rawYAngle;
        dynamicZAngle = rawZAngle;

        xSpeed = Random.Range(xSpeedRandomMin, xSpeedRandomMax);
        ySpeed = Random.Range(ySpeedRandomMin, ySpeedRandomMax);
        zSpeed = Random.Range(zSpeedRandomMin, zSpeedRandomMax);

        xDir = 1;
        yDir = 1;
        zDir = 1;

        recordLastChangeDirXAngle = 0;
        recordLastChangeDirYAngle = 0;
        recordLastChangeDirZAngle = 0;
    }

    private void Update()
    {
        dynamicXAngle += (Time.deltaTime * xSpeed) * xDir;
        if (Mathf.Abs(recordLastChangeDirXAngle - dynamicXAngle) >= perXAngleChangedDir)
        {
            recordLastChangeDirXAngle = dynamicXAngle;
            xSpeed = Random.Range(xSpeedRandomMin, xSpeedRandomMax);
            xDir = dirs[Random.Range(0, 1)];
        }
        if (dynamicXAngle <= 0 || dynamicXAngle >= 180)
        {
            recordLastChangeDirXAngle = dynamicXAngle;
            xSpeed = Random.Range(xSpeedRandomMin, xSpeedRandomMax);
            if (dynamicXAngle <= 0)
                xDir = 1;
            else
                xDir = -1;
        }
        dynamicXAngle = dynamicXAngle % 180;

        dynamicYAngle += (Time.deltaTime * ySpeed) * yDir;
        if (Mathf.Abs(recordLastChangeDirYAngle - dynamicYAngle) >= perYAngleChangedDir)
        {
            recordLastChangeDirYAngle = dynamicYAngle;
            ySpeed = Random.Range(ySpeedRandomMin, ySpeedRandomMax);
            yDir = dirs[Random.Range(0, 1)];
        }
        dynamicYAngle = dynamicYAngle % 360;

        dynamicZAngle += (Time.deltaTime * zSpeed) * zDir;
        if (Mathf.Abs(recordLastChangeDirZAngle - dynamicZAngle) >= perZAngleChangedDir)
        {
            recordLastChangeDirZAngle = dynamicZAngle;
            zSpeed = Random.Range(zSpeedRandomMin, zSpeedRandomMax);
            zDir = dirs[Random.Range(0, 1)];
        }
        dynamicZAngle = dynamicZAngle % 360;

        v3Angle.Set(dynamicXAngle, dynamicYAngle, dynamicZAngle);
        this.transform.localEulerAngles = v3Angle;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39574690/article/details/117136059