【Unity ShaderGraph使用雪碧图制作导航光效效果】

这篇具有很好参考价值的文章主要介绍了【Unity ShaderGraph使用雪碧图制作导航光效效果】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

效果:
雪碧导航,unity,游戏引擎
ShaderGraph的制作:
雪碧导航,unity,游戏引擎
shader中uv数和雪碧图的uv数对上就能出效果。

直接上代码:

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

public class TurnDirEffectController : MonoBehaviour
{
    public RectTransform effecRrectTf;
    public Material mat;
    public int currentLevel = -1;
    public float totalTime;
    public float currentSpeed;

    public Texture2D[] textures;
    public float[] mainColorAlpha;

    public bool isEffectOver;
    public int trunValue = -2;

    public Button[] testBtn;

    public Sprite dayimg;
    public Sprite nightimg;
    void Start()
    {
        Application.targetFrameRate = 24;

        StopTween();

        testBtn[0].onClick.AddListener(() =>  Btn1());
        testBtn[1].onClick.AddListener(() => { Btn2(); });
        testBtn[2].onClick.AddListener(() => { Btn3(); });
        testBtn[3].onClick.AddListener(() => { Btn4(); });
        testBtn[4].onClick.AddListener(() => { Btn5(); });
    }
    public void StopTween()
    {
        trunValue = -2;
        mat.SetFloat("_alpha", 0);
        totalTime = 0;
    }

    float time;
    float time1;
    float time2;
    float time3;

    private DayOrNightMode mo;
    void Update()
    {
#if UNITY_EDITOR
        if (Input.GetKeyDown(KeyCode.Z))
        {
            mo = DayOrNightMode.Day;
            Turn_new2(0, 0, mo);//左1
        }
        if (Input.GetKeyDown(KeyCode.X))
        {
            mo = DayOrNightMode.Day;
            Turn_new2(1, 0, mo);//右1
        }
        if (Input.GetKeyDown(KeyCode.C))
        {
            mo = DayOrNightMode.Day;
            Turn_new2(0, 1, mo);//左2
        }
        if (Input.GetKeyDown(KeyCode.V))
        {
            mo = DayOrNightMode.Day;
            Turn_new2(1, 1, mo);//右2
        }
        if (Input.GetKeyDown(KeyCode.B))
        {
            trunValue = -2;
        }
#endif

        //time += Time.deltaTime;
        //time1 += Time.deltaTime;
        //time2 += Time.deltaTime;
        //time3 += Time.deltaTime;
        //if (time > 5 && time < 11)
        //{
        //    Turn_new2(-1, 1, DayOrNightMode.Day);
        //    time = 11;
        //}
        //if (time1 > 11 && time1 < 17)
        //{
        //    Turn_new2(1, 1, DayOrNightMode.Day);//右1
        //    time1 = 17;
        //}
        //if (time2 > 17 && time2 < 25)
        //{
        //    Turn_new2(-1, 2, DayOrNightMode.Day);//左2
        //    time2 = 25;
        //}
        //if (time3 > 25 && time3 < 33)
        //{
        //    Turn_new2(1, 2, DayOrNightMode.Day);//右2
        //    //time3 = 33;
        //}
        //if (time3 > 33)
        //{
        //    Btn5();
        //}

        if (isEffectOver)
        {
            return;
        }

        totalTime += Time.deltaTime * currentSpeed;

        //每次周期结束时判断一下
        if (totalTime >= 48f)
        {
            if (trunValue == -2)
            {
                totalTime = 0;
                effecRrectTf.gameObject.SetActive(false);
                isEffectOver = true;
            }
            else
            {
                totalTime = 0;
                if(trunValue == 0)
                {
                    effecRrectTf.localScale = new Vector3(-1, 1, 1);
                }
                if (trunValue == 1)
                {
                    effecRrectTf.localScale = new Vector3(1, 1, 1);
                }
            }
            //1秒30帧,每帧时间100/3=33;
            float picturePreSecont = 33;
            if (currentLevel == -1)
            {
                speedTye = SpeedType.normal;
                currentSpeed = picturePreSecont / 1;
            }
            else if (currentLevel == 0)
            {
                speedTye = SpeedType.high;
                currentSpeed = picturePreSecont / 1.5f;
            }
            else if (currentLevel == 1)
            {
                speedTye = SpeedType.low;
                currentSpeed = picturePreSecont / 2.5f;
            }
            OnDayOrNight(mo, currentLevel);
        }

        totalTime %= 48;

        mat.SetFloat("_timer", totalTime);
    }

    public void naviLightMessage(string data)
    {
        //data=0-1-1   第一个开关导航0=关闭、1=开启    第二个表示左右 0=左  1=右    第三个表示快慢  0=快  1=慢
        Debug.Log("receiveNaviMessage params=" + data);

        string[] value = data.Split('-');
        if (int.Parse(value[0])==0)
        {
            trunValue = -2;
        }
        else if(int.Parse(value[0]) == 1)
        {
            Turn_new2(int.Parse(value[1]), int.Parse(value[2]), DayOrNightMode.Day);
        }
    }

    public void Turn_new2(int value, int speedValue, DayOrNightMode mode)
    {
        //Application.targetFrameRate = 24;

        currentLevel = speedValue;
        if (trunValue == value)
        {
            //MR_Debug.LogI(null, "TrunValue==value and return" + value);
            return;
        }

        trunValue = value;
        if (trunValue == -2)
        {
            return;
        }

        //DayNight(mode);

        if (trunValue == 0)
        {
            effecRrectTf.localScale = new Vector3(-1, 1, 1);
        }
        if (trunValue == 1)
        {
            effecRrectTf.localScale = new Vector3(1, 1, 1);
        }
        //effecRrectTf.localScale = new Vector3(trunValue, 1, 1);

        //currentLevel = speedValue;
        totalTime = 0;
        //0 normal 1 high 2 low
        //1秒30帧,每帧时间100/3=33;
        float picturePreSecont = 33;
        if (currentLevel == -1)
        {
            speedTye = SpeedType.normal;
            currentSpeed = picturePreSecont / 1;
        }
        else if (currentLevel == 0)
        {
            speedTye = SpeedType.high;
            currentSpeed = picturePreSecont / 1.5f;
        }
        else if (currentLevel == 1)
        {
            speedTye = SpeedType.low;
            currentSpeed = picturePreSecont / 2.5f;
        }
        //重新播放
        OnDayOrNight(mode, speedValue);


        isEffectOver = false;
        effecRrectTf.gameObject.SetActive(true);

    }
    private void OnDayOrNight(DayOrNightMode mode, int speedValue)
    {
        //重头播
        // totalTime = 0;
        mat.SetFloat("_alpha", 1);
        //更换贴图和透明度
        if (mode == DayOrNightMode.Day)
        {
            //if (speedValue == 0)
            //{
            //    mat.SetTexture("_MainTex", textures[0]);
            //}
            //else if(speedValue == 1)
            //{
            //    mat.SetTexture("_MainTex", textures[1]);
            //}

            mat.SetTexture("_MainTex", textures[0]);
            if (speedTye == SpeedType.low)
            {
                mat.SetFloat("_alpha", mainColorAlpha[1]);
            }
            else if(speedTye == SpeedType.high)
            {
                mat.SetFloat("_alpha", mainColorAlpha[0]);
            }

        }
        else if (mode == DayOrNightMode.Night)
        {
            //if (speedValue == 0)
            //{
            //    mat.SetTexture("_MainTex", textures[2]);
            //}
            //else if (speedValue == 1)
            //{
            //    mat.SetTexture("_MainTex", textures[3]);
            //}

            mat.SetTexture("_MainTex", textures[1]);
            if (speedTye == SpeedType.low)
            {
                mat.SetFloat("_alpha", mainColorAlpha[1]);
            }
            else if (speedTye == SpeedType.high)
            {
                mat.SetFloat("_alpha", mainColorAlpha[0]);
            }
        }
    }
    private void Btn1()
    {
        Turn_new2(0, 0, DayOrNightMode.Day);
    }
    private void Btn2()
    {
        Turn_new2(1, 0, DayOrNightMode.Day);
    }
    private void Btn3()
    {
        Turn_new2(0, 1, DayOrNightMode.Day);//左2
    }
    private void Btn4()
    {
        Turn_new2(1, 1, DayOrNightMode.Day);//右2
    }
    private void Btn5()
    {
        trunValue = -2;
    }

    private void DayNight(DayOrNightMode mode)
    {
        if(mode== DayOrNightMode.Day)
        {
            transform.GetComponent<Image>().sprite = dayimg;
        }
        else if(mode == DayOrNightMode.Night)
        {
            transform.GetComponent<Image>().sprite = nightimg;
        }
    }
    public enum SpeedType
    {
        normal,
        high,
        low
    }
    public SpeedType speedTye;

    public enum DayOrNightMode
    {
        Day,
        Night,
    }
}

代码绑定:
雪碧导航,unity,游戏引擎

下面是雪碧图:
雪碧导航,unity,游戏引擎文章来源地址https://www.toymoban.com/news/detail-608275.html

到了这里,关于【Unity ShaderGraph使用雪碧图制作导航光效效果】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity ShaderGraph】| 快速制作一个 表面水纹叠加效果

    前言 本文将使用ShaderGraph制作一个表面水纹叠加效果,可以直接拿到项目中使用。 对ShaderGraph还不了解的小伙伴可以参考这篇文章:【Unity ShaderGraph】| Shader Graph入门介绍 | 简介 | 配置环境 | 窗口介绍 | 简单案例 下面就开始看一下具体的制作流程,然后自己动手制作一个吧!

    2024年01月19日
    浏览(53)
  • 【Unity ShaderGraph】| 如何快速制作一个 马赛克效果 实战

    前言 本文将使用Unity 的ShaderGraph制作一个 马赛克 的效果,可以直接拿到项目中使用。 对ShaderGraph还不了解的小伙伴可以参考这篇文章:【Unity ShaderGraph】| Shader Graph入门介绍 | 简介 | 配置环境 | 窗口介绍 | 简单案例 下面就开始看一下具体的制作流程,然后自己动手制作一个吧

    2024年02月08日
    浏览(62)
  • 【Unity ShaderGraph】| 快速制作一个 钛金化不锈钢效果

    前言 本文将使用ShaderGraph制作一个 钛金化不锈钢 效果,可以直接拿到项目中使用。 对ShaderGraph还不了解的小伙伴可以参考这篇文章:【Unity ShaderGraph】| Shader Graph入门介绍 | 简介 | 配置环境 | 窗口介绍 | 简单案例 下面就开始看一下具体的制作流程,然后自己动手制作一个吧!

    2024年02月08日
    浏览(58)
  • 【Unity ShaderGraph】| 如何快速制作一个炫酷的 全息投影效果

    前言 本文将使用ShaderGraph制作一个 炫酷的 全息投影效果 ,可以直接拿到项目中使用。 对ShaderGraph还不了解的小伙伴可以参考这篇文章:【Unity ShaderGraph】| Shader Graph入门介绍 | 简介 | 配置环境 | 窗口介绍 | 简单案例 下面就开始看一下具体的制作流程,然后自己动手制作一个

    2024年02月05日
    浏览(50)
  • 【Unity ShaderGraph】| 如何快速制作一个炫酷 模型裁剪效果 实战

    前言 本文将使用Unity 的ShaderGraph制作一个 模型裁剪 的效果,可以直接拿到项目中使用。 对ShaderGraph还不了解的小伙伴可以参考这篇文章:【Unity ShaderGraph】| Shader Graph入门介绍 | 简介 | 配置环境 | 窗口介绍 | 简单案例 下面就开始看一下具体的制作流程,然后自己动手制作一个

    2024年02月08日
    浏览(52)
  • 使用Unity里的ShaderGraph实现物体边框呼吸灯效果

    提前声明一下,以下效果需要在hdrp项目中进行。 首先创建好我们的正方体: 用来接下来的边框显示。 这里需要创建两个材质球,一个用于显示方块的材质,另一个用于边框的显示。 (Material用于方块材质,OutlineMat用于边框线) 为了更好地突出边框的视觉效果我这里给它加

    2024年04月22日
    浏览(51)
  • unity shaderGraph实例-扫描效果

    区域1 用场景深度减去顶点的View空间的视野深度(Z值),这里Z值需要乘-1是因为从相机看到的物体顶点的视野深度为-1,而场景深度是正值,所以需要乘-1让两者都为正。 这一步的意义是,用场景中的深度减去sphere的视野深度,当sphere与场景的物体接近时,这个差将会非常接

    2024年02月03日
    浏览(35)
  • Unity之ShaderGraph如何实现靠近显示溶解效果

    今天我们来实现一个我再B站看到的一个使用LeapMotion实现的用手部触摸就可以显示的溶解效果。 效果如下图所示: Position:提供对网格顶点或片段的Position 的访问,具体取决于节点所属图形部分的有效着色器阶段。使用Space下拉参数选择输出值的坐标空间。 Remap:基于输入

    2024年02月04日
    浏览(49)
  • [Unity] ShaderGraph实现伪室内效果,性能大解放

    使用版本为:2023.1.19f1  更详细的实现逻辑及步骤参考Mert Kirimgeri的视频: UNITY SHADER GRAPH with Fake Interiors Shader (youtube.com) OS:这简直是个降低性能的天才技术!!! 目录 一、构建虚拟立方体  二、切线空间与视角射线  三、赋予贴图 四、天空盒环境反射 五、两侧空间与插值

    2024年01月23日
    浏览(41)
  • [Unity] ShaderGraph实现Sprite图片描边/发光效果

    使用版本为:2022.3.10f1  [原始图]      [运行前]      [运行后] 更详细的实现逻辑及步骤参考CodeMonkey的视频: https://youtu.be/FvQFhkS90nI?si=zy6XRlqGnzIdQkqD OS:猴子老师,我永远的神!!! 目录 一、准备工作 二、偏移效果与颜色叠加 三、单侧描边与原理 四、另一侧与Sub管理 五、

    2024年01月20日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包