Unity3D】【Unity灯光】unity灯光闪烁效果怎么实现?

2021-01-06 11:34发布

9条回答
思禹小姐姐y
2楼 · 2021-01-06 16:28

首先是给UI对象添加Canvas Group组件

通过控制Alpha改变其透明度来控制显示和隐藏(Alpha=0隐藏;Alpha=1显示)(Blocks Raycasts=true可以交互;Blocks Raycasts=false无法交互)然后敲代码就可以了哈。

aijingda
3楼 · 2021-01-06 18:57

将代码复制过去,放在物件上面,然后进行测试。


直接贴出代码:


using UnityEngine;
using System.Collections;
[RequireComponent( typeof( Light ) )]
public class flickeringLight : MonoBehaviour
{
// Flickering Styles
public enum flickerinLightStyles { CampFire = 0, Fluorescent = 1 };
public flickerinLightStyles flickeringLightStyle = flickerinLightStyles.CampFire;
// Campfire Methods
public enum campfireMethods { Intensity = 0, Range = 1, Both = 2 };
public campfireMethods campfireMethod = campfireMethods.Intensity;
// Intensity Styles
public enum campfireIntesityStyles { Sine = 0, Random = 1 };
public campfireIntesityStyles campfireIntesityStyle = campfireIntesityStyles.Random;
// Range Styles
public enum campfireRangeStyles { Sine = 0, Random = 1 };
public campfireRangeStyles campfireRangeStyle = campfireRangeStyles.Random;
// Base Intensity Value
public float CampfireIntensityBaseValue = 0.5f;
// Intensity Flickering Power
public float CampfireIntensityFlickerValue = 0.1f;
// Base Range Value
public float CampfireRangeBaseValue = 10.0f;
// Range Flickering Power
public float CampfireRangeFlickerValue = 2.0f;
// If Style is Sine
private float CampfireSineCycleIntensity = 0.0f;
private float CampfireSineCycleRange = 0.0f;
// "Glow" Speeds
public float CampfireSineCycleIntensitySpeed = 5.0f;
public float CampfireSineCycleRangeSpeed = 5.0f;
public float FluorescentFlickerMin = 0.4f;
public float FluorescentFlickerMax = 0.5f;
public float FluorescentFlicerPercent = 0.95f;
// NOT IMPLEMENTED YET !!!!
public bool FluorescentFlickerPlaySound = false;
public AudioClip FluorescentFlickerAudioClip;
// ------------------------
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
switch( flickeringLightStyle )
{
// If Flickering Style is Campfire
case flickerinLightStyles.CampFire:
// If campfire method is Intesity OR Both
if( campfireMethod == campfireMethods.Intensity || campfireMethod == campfireMethods.Both )
{
// If Intensity style is Sine
if( campfireIntesityStyle == campfireIntesityStyles.Sine )
{
// Cycle the Campfire angle
CampfireSineCycleIntensity += CampfireSineCycleIntensitySpeed;
if( CampfireSineCycleIntensity > 360.0f ) CampfireSineCycleIntensity = 0.0f;
// Base + Values
light.intensity = CampfireIntensityBaseValue + ( ( Mathf.Sin( CampfireSineCycleIntensity * Mathf.Deg2Rad ) * ( CampfireIntensityFlickerValue / 2.0f ) ) + ( CampfireIntensityFlickerValue / 2.0f ) );
}
else light.intensity = CampfireIntensityBaseValue + Random.Range( 0.0f, CampfireIntensityFlickerValue );
}
// If campfire method is Range OR Both
if( campfireMethod == campfireMethods.Range || campfireMethod == campfireMethods.Both )
{
// If Range style is Sine
if( campfireRangeStyle == campfireRangeStyles.Sine )
{
// Cycle the Campfire angle
CampfireSineCycleRange += CampfireSineCycleRangeSpeed;
if( CampfireSineCycleRange > 360.0f ) CampfireSineCycleRange = 0.0f;
// Base + Values
light.range = CampfireRangeBaseValue + ( ( Mathf.Sin( CampfireSineCycleRange * Mathf.Deg2Rad ) * ( CampfireSineCycleRange / 2.0f ) ) + ( CampfireSineCycleRange / 2.0f ) );
}
else light.range = CampfireRangeBaseValue + Random.Range( 0.0f, CampfireRangeFlickerValue );
}
break;
// If Flickering Style is Fluorescent
case flickerinLightStyles.Fluorescent:
if( Random.Range( 0.0f, 1.0f ) > FluorescentFlicerPercent )
{
light.intensity = FluorescentFlickerMin;
// Check Audio - NOT IMPLEMENTED YET
if( FluorescentFlickerPlaySound )
{
}
}
else light.intensity = FluorescentFlickerMax;
break;
default:
// You should not be here.
break;
}
}
}


OK,自己测试一下吧。


是开心果呀 - 热爱生活
4楼 · 2021-01-06 20:32

首先是给UI对象添加Canvas Group组件

通过控制Alpha改变其透明度来控制显示和隐藏(Alpha=0隐藏;Alpha=1显示)(Blocks Raycasts=true可以交互;Blocks Raycasts=false无法交互)

剩下的没什么特殊点,直接一套代码

挂在脚本

然后实现

IT学习
5楼 · 2021-01-07 09:39

原理比较简单,通过代码开启材质的自发光效果,然后不断地调整自发光的亮度即可。
首先要获取到材质对象实例 material,然后通过其进行其他操作:

  • 启用自发光效果的代码是 material.EnableKeyword("_EMISSION")

  • 关闭自发光效果的代码是 material.DisableKeyword("_EMISSION")

  • 设置自发光颜色和亮度的代码是 material.SetColor("_EmissionColor", Color.HSVToRGB(_h, _s, _v))

    • 其中的 _h、_s、_v参数分别代表颜色的色相、饱和度和亮度。

    • 获取颜色的色相、饱和度和亮度的代码为 Color.RGBToHSV(color, out _h, out _s, out _v)

  • 下面有完整的源代码

此方法实现的闪烁效果不能发出光晕,因为自发光的光晕必须经过烘焙才能生效,而烘焙是在运行前完成的,所以无法在运行时产生光晕效果;另外闪烁的最高亮度只能为1,不能像烘焙时那样将亮度设为大于1而产生HDR效果。

glinting

源代码

using System.Collections;using UnityEngine;public class Glinting : MonoBehaviour
{    /// 
    /// 闪烁颜色
    /// 
    public Color color = new Color(1, 0, 1, 1);    /// 
    /// 最低发光亮度,取值范围[0,1],需小于最高发光亮度。
    /// 
    [Range(0.0f, 1.0f)]    public float minBrightness = 0.0f;    /// 
    /// 最高发光亮度,取值范围[0,1],需大于最低发光亮度。
    /// 
    [Range(0.0f, 1)]    public float maxBrightness = 0.5f;    /// 
    /// 闪烁频率,取值范围[0.2,30.0]。
    /// 
    [Range(0.2f, 30.0f)]    public float rate = 1;

    [Tooltip("勾选此项则启动时自动开始闪烁")]
    [SerializeField]    private bool _autoStart = false;    private float _h, _s, _v;           // 色调,饱和度,亮度
    private float _deltaBrightness;     // 最低最高亮度差
    private Renderer _renderer;    private Material _material;    private readonly string _keyword = "_EMISSION";    private readonly string _colorName = "_EmissionColor";    private Coroutine _glinting;    private void Start()
    {
        _renderer = gameObject.GetComponent();
        _material = _renderer.material;        if (_autoStart)
        {
            StartGlinting();
        }
    }    /// 
    /// 校验数据,并保证运行时的修改能够得到应用。
    /// 该方法只在编辑器模式中生效!!!
    /// 
    private void OnValidate()
    {        // 限制亮度范围
        if (minBrightness < 0 || minBrightness > 1)
        {
            minBrightness = 0.0f;
            Debug.LogError("最低亮度超出取值范围[0, 1],已重置为0。");
        }        if (maxBrightness < 0 || maxBrightness > 1)
        {
            maxBrightness = 1.0f;
            Debug.LogError("最高亮度超出取值范围[0, 1],已重置为1。");
        }        if (minBrightness >= maxBrightness)
        {
            minBrightness = 0.0f;
            maxBrightness = 1.0f;
            Debug.LogError("最低亮度[MinBrightness]必须低于最高亮度[MaxBrightness],已分别重置为0/1!");
        }        // 限制闪烁频率
        if (rate < 0.2f || rate > 30.0f)
        {
            rate = 1;
            Debug.LogError("闪烁频率超出取值范围[0.2, 30.0],已重置为1.0。");
        }        // 更新亮度差
        _deltaBrightness = maxBrightness - minBrightness;        // 更新颜色
        // 注意不能使用 _v ,否则在运行时修改参数会导致亮度突变
        float tempV = 0;
        Color.RGBToHSV(color, out _h, out _s, out tempV);
    }    /// 
    /// 开始闪烁。
    /// 
    public void StartGlinting()
    {
        _material.EnableKeyword(_keyword);        if (_glinting != null)
        {
            StopCoroutine(_glinting);
        }
        _glinting = StartCoroutine(IEGlinting());
    }    /// 
    /// 停止闪烁。
    /// 
    public void StopGlinting()
    {
        _material.DisableKeyword(_keyword);        if (_glinting != null)
        {
            StopCoroutine(_glinting);
        }
    }    /// 
    /// 控制自发光强度。
    /// 
    /// 
    private IEnumerator IEGlinting()
    {
        Color.RGBToHSV(color, out _h, out _s, out _v);
        _v = minBrightness;
        _deltaBrightness = maxBrightness - minBrightness;        bool increase = true;        while (true)
        {            if (increase)
            {
                _v += _deltaBrightness * Time.deltaTime * rate;
                increase = _v <= maxBrightness;
            }            else
            {
                _v -= _deltaBrightness * Time.deltaTime * rate;
                increase = _v <= minBrightness;
            }
            _material.SetColor(_colorName, Color.HSVToRGB(_h, _s, _v));            //_renderer.UpdateGIMaterials();
            yield return null;
        }
    }
}


浅浅77
6楼 · 2021-01-07 10:07

首先是给UI对象添加Canvas Group组件

通过控制Alpha改变其透明度来控制显示和隐藏(Alpha=0隐藏;Alpha=1显示)(Blocks Raycasts=true可以交互;Blocks Raycasts=false无法交互)

剩下的没什么特殊点,直接一套代码

using UnityEngine;using System.Collections;using UnityEngine.UI;public class ShanShuoAnim : MonoBehaviour {private float alpha = 0.2f;private float alphaSpeed = 8f;private bool isShow = true;//用来控制闪烁的内容private CanvasGroup cg;private bool isClick = false;//用来控制 彻底不需要走动画了private Image shanImg;public Sprite shan_sprite;  //外部传进来的void Start(){cg = this.transform.GetComponent();shanImg = this.transform.GetComponent();}void Update(){if (isClick){if (isShow){if (alpha != cg.alpha){cg.alpha = Mathf.Lerp(cg.alpha, alpha, alphaSpeed * Time.deltaTime);  //这个方法表示的是一种简便过程 传入初始和想达到的if (Mathf.Abs(alpha - cg.alpha) <= 0.01){//Debug.Log("更新2===" + alpha + "===" + cg.alpha);cg.alpha = alpha; isShow = false;}}}else{if (1 != cg.alpha){cg.alpha = Mathf.Lerp(cg.alpha, 1, alphaSpeed * Time.deltaTime);  //这个方法表示的是一种简便过程 传入初始和想达到的if (Mathf.Abs(1 - cg.alpha) <= 0.01){//Debug.Log("更新3===" + alpha + "===" + cg.alpha);cg.alpha = 1; isShow = true;}}}}}public void ShowAnim(){//alpha = 1;isClick = true;shanImg.sprite = shan_sprite;//cg.blocksRaycasts = true;//可以和该UI对象交互}public void HideAnim(){isClick = false;//alpha = 0;//cg.blocksRaycasts = false;//不可以和该UI对象交互}}

挂在脚本

实现!

Kindery
7楼 · 2021-01-07 14:22

首先是给UI对象添加Canvas Group组件

通过控制Alpha改变其透明度来控制显示和隐藏(Alpha=0隐藏;Alpha=1显示)(Blocks Raycasts=true可以交互;Blocks Raycasts=false无法交互)


Transform
8楼 · 2021-01-08 20:20

如果是相同颜色的灯光,使用一个调节该灯光的强度即可。

image.png

下世纪再秃头
9楼 · 2021-01-10 23:32

首先是给UI对象添加Canvas Group组件

通过控制Alpha改变其透明度来控制显示和隐藏(Alpha=0隐藏;Alpha=1显示)(Blocks Raycasts=true可以交互;Blocks Raycasts=false无法交互)

剩下的没什么特殊点,直接一套代码

挂在脚本

然后实现


相关问题推荐

  • 回答 17

    还是要学好编程基础呀如果你觉得编程很苦难 不一定要从c#开始学  学学js flash as等等  有个梯度就好多了如果要用好unity  不会编程那是不行的  学习的过程中都有个头疼的过程  记住  头越痛  代表你要接受的东西越多  坚持 你的大脑在和知识兼容中:D...

  • unity如何自学Unity3D 2022-01-06 15:24
    回答 18

    可以先思考学习的目的,是什么因素在驱动你。是完成一款作品?进入某个行业?还是探究某类问题?否则和技术相关的知识浩如烟海,很容易迷失在细枝末节上。而要找到动力源头。个人的经验,就是关注一些和自己同方向,同类型的创作者。他们输出的作品会激励你,...

  • 回答 23

    可以让模型师直接作出这样的形状,如果用纯Unity制作,就要用基本游戏对象拼接了,包括楼梯,城堡,都可以拼接出来。正常情况不会这样做,因为不够精美,都是建模师来实现,毕竟Unity不属于专业的建模软件,侧重于实现功能。...

  • 回答 2

    Shader Unlit/Test{Properties{_MainTex(MainTex,2D)=white{}_MainColor(MainColor,COLOR)=(1,1,1,1)_AddTex(AddTex,2D)=white{}_Maxset(Max,Range(0.1,1.0))=0.1}SubShader{Tags{RenderType=Transparent Queue=Tran...

  • 回答 4

    文章主要为大家详细介绍了Unity Shader实现水波纹效果,文中示例代码介绍的非常详细具体代码实现如下:Shader Custom/shuibowen{ Properties{ _MainTex(Base (RGB),2D)=white{} _distanceFactor(Distancefactor,float)=1 _timeFactor(time factor,float)=...

  • 回答 7

    策划的最基本的原则就是:改进缺点,做别人没有做到的。无论游戏策划还是其它策划都是一样!    游戏策划的第二个原则:放飞思想。也许你认为我是说策划们应该充满想象力,能想一些匪夷所思的东西!对不起。不是这意思!一个合格的策划不是为了发泄自己的...

  • 回答 7
    已采纳

    可以多玩一些其它的游戏,看一些科幻电影等,寻找灵感。

  • 回答 3
    已采纳

    游戏架构与设计不纯粹是一门科学,它不需要提出假设或探究真理,也不被逻辑或正规方法的严格标准所束缚。游戏的目的就是通过玩来获得娱乐,因此游戏设计即需要艺术家一样的创造力,也需要工程师一样的精心规划。游戏设计是一门手艺,就像好莱坞的电影摄像或服...

  • 回答 5

    void Update(){          transform.rotation = Quaternion.Euler(Vector3.zero);}可以试一下,保证物体x轴和z轴为0就可以使其一直垂直。

  • 回答 3

    界面左右移动、上下移动。。本质都是:手指滑动。。。可以参考这些:https://www.cnblogs.com/coldcode/p/5362537.htmlhttps://blog.csdn.net/totosj/article/details/80112852https://blog.csdn.net/zcc858079762/article/details/85253120...

  • 回答 6

    首先新建一个C#脚本,命名为MyFollow,然后把以下代码粘贴进去,保存:AخA 1using UnityEngine;2using System.Collections;3public class MyFollow : MonoBehaviour4{5    public float distanceAway = 5;          // distance...

  • 回答 5

    安装高通的Vuforia插件即可。

  • 回答 5

    不可以,只能一个工程打一个包。

  • 回答 2

    Edit->Project Settings->Graphics 找到Shader Stripping 中fog mode设置为custom(原来是Automatic),然后选中你想要的模式,最后重新打包就ok

  • 回答 2

    用到的插件:System.Drawing.dllSystem.Windows.Forms.dllSystem.Deployment.dll(运用基于.Net4.x的dll打包时,需要用到该dll,否则会报错)代码如下:using System;using System.Runtime.InteropServices;using UnityEngine;using UnityEngine.UI; p......

  • 回答 6

    如下图,设置为none,然后删掉滑动条就可以了。

没有解决我的问题,去提问