Unity3d之遛光效果

所谓遛光效果,如一个图片上一条刀光从左闪到右边,以下为实现代码:

c#代码:

using System;
using UnityEngine;

public class WalkLightEffect : MonoBehaviour
{
    public Texture MainTex;
    public Texture LightTex;
    public float Duration;
    public float LightULen;
    public Vector2 Size;

    bool m_play;
    float m_timer;
    float m_t1;

    void Awake()
    {
        if (MainTex == null)
            throw new ArgumentNullException("MainTex");
        if (LightTex == null)
            throw new ArgumentNullException("LightTex");
        if (Duration <= 0)
            throw new ArgumentException("Duration");
        if (LightULen <= 0 || LightULen >= 1)
            throw new ArgumentException("LightULen <= 0 || LightULen >= 1");
        if (Size.x <= 0 || Size.y <= 0)
            throw new ArgumentException("Size.x <= 0 || Size.y <= 0");

        GenerateRenderer();

        m_t1 = (1 - LightULen) * Duration;
    }

    void GenerateRenderer()
    {
        // Mesh
        Mesh mesh = new Mesh();
        mesh.vertices = new Vector3[4]
            {
                new Vector2(-Size.x/2,Size.y/2),
                new Vector2(Size.x/2,Size.y/2),
                new Vector2(-Size.x/2,-Size.y/2),
                new Vector2(Size.x/2,-Size.y/2),
            };
        mesh.triangles = new int[6] { 0, 1, 2, 2, 1, 3 };
        mesh.uv = new Vector2[4]
            {
                new Vector2(0,1),
                new Vector2(1,1),
                new Vector2(0,0),
                new Vector2(1,0),
            };

        mesh.Optimize();

        var mf = gameObject.AddComponent<MeshFilter>();
        mf.mesh = mesh;

        // Material
        var mat = new Material(Shader.Find("Bleach/WalkLight"));
        mat.SetTexture("_MainTex", MainTex);
        mat.SetFloat("_LightLen", LightULen);

        var mr = gameObject.AddComponent<MeshRenderer>();
        mr.sharedMaterial = mat;
    }

    void Update()
    {
        if (m_play)
        {
            renderer.material.SetFloat("_TimeRate", m_timer / Duration);

            m_timer += Time.deltaTime;

            if (m_timer > Duration)
                m_timer = 0;
            else if (m_timer > m_t1)
                renderer.material.SetFloat("_ReachBoundary", 1);
            else
                renderer.material.SetFloat("_ReachBoundary", -1);
        }
    }

    public bool Play
    {
        set
        {
            renderer.material.SetTexture("_LightTex", value ? LightTex : null);
            m_timer = 0;
            m_play = value;
        }
    }
}

shader代码:

Shader "Bleach/WalkLight"
{
    Properties
    {
        _MainTex ("Main", 2D) = "white" {}
        _LightTex("Light", 2D) = "black" {}
        _LightLen("Light Length", float) = 0
    }

    SubShader
    {
        Pass
        {
            Tags { "RenderType"="Opaque" }
            LOD 200

            Cull Off

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            uniform sampler2D _MainTex;
            uniform sampler2D _LightTex;
            uniform    fixed _LightLen;

            uniform fixed _ReachBoundary;     // 小于0表示未到边界,大于0表示到达边界
            uniform fixed _TimeRate;        // 时间/周期

            struct Data
            {
                fixed4 vertex:POSITION;
                fixed2 texcoord:TEXCOORD0;
            };

            struct V2F
            {
                fixed4 pos:SV_POSITION;
                fixed2 uv:TEXCOORD0;
            };

            V2F vert(Data v)
            {
                V2F o;
                o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
                o.uv=v.texcoord;
                return o;
            }    

            fixed4 frag(V2F i):COLOR
            {
                fixed4 main = tex2D(_MainTex,i.uv);
                fixed x = _ReachBoundary>0 && i.uv.x<_LightLen? i.uv.x+1 : i.uv.x;
                fixed lightU = (x - _TimeRate)/_LightLen;            // u=(x-timer/Duration)/_LightLen;
                fixed4 light = tex2D(_LightTex,float2(lightU,i.uv.y));

                return lerp(main,light,light.a);
            }

            ENDCG
        }
    }

    FallBack "Diffuse"
}
时间: 2024-08-29 01:51:19

Unity3d之遛光效果的相关文章

CSS3实现文字扫光效果

本篇文章由:http://xinpure.com/css3-text-light-sweep-effect/ CSS3 实现的文字扫光效果,几乎可以和 Flash 相媲美了 效果解析 我们分析一下实现这个效果需要实现的功能: 实现一个扫光背景块,因为光是移动的,所以要加入渐变效果 (例如: 手电筒照射的一小块区域) 将扫光背景块控制到文本上 (即实现文本背景) 实现扫光动画 (扫光块从左往右循环移动) 思路理清了,接下来就是一步一步实现了 背景渐变 -webkit-linear-gradient

Unity3D烘培无效果原因

调节以下设置 Unity3D烘培无效果原因

使用CALayer制作View的辉光效果

使用CALayer制作View的辉光效果 实现以下的辉光效果: 思路是这样子的: 1. 创建好需要实现辉光效果的View 2. 对这个View进行截图 3. 将这个截图重新添加进View中 4. 对这个截图实现改变透明度的动画 ViewController.m // // ViewController.m // // Copyright (c) 2013 Nick Jensen. All rights reserved. // #import "ViewController.h" #i

刀光效果

今天的成果,模型来自DMC鬼泣,没有用unity的拖尾 球形插值的刀光mesh,效果不会太硬 非球形插值的刀光mesh 没有附加材质,纯扭曲的刀光shader 有时间还需要修改..

iOS 开发 - 绘制辉光效果

如何使曲线有辉光(荧光?)效果(glow)? 试了各种方法,最终有一点效果,觉得值得记录一下,如下. 1.最开始,我想是不是用shadow可以实现,事实证明,shadow 太淡,不醒目,如果多次shadow叠加,可加重一点,但性能不好,放弃: 2.然后想是不是可以用图片沿着path绘制,结果效果也不理想(也许是图片做的不好),性能也不好 3.Spritekit 中 skshapenode 可以设置辉光,而且可以设置用texture绘制,貌似可以解决问题,但是当线段之间夹角太小时,结合部位的辉光可

Unity3D——加入剑痕效果(PocketRPG Trail插件)

首先非常感谢大家的支持,因为近期项目吃紧,所以更新的速度可能会有点慢!希望大家谅解,当然大家的支持是我最大的动力.我也会尽我所能写出更好的文章,当然因为本人是个新手并且工作的内容也不是unity3D.可是本人对于这个比較爱好,所以都是在课余的时间去研究这些东西,没有什么实战,不可以更加深入的解读,分析.当然有看我文章的都因该知道我如今写的内容都是再基础只是的,同一时候在博客中也是有非常多人已经写过啦! 至于这个怎么说呢?因为本人不是干这个的.所以说临时还没有什么比較高深的和大家分享.同一时候我也

Unity3d HDR和Bloom效果(高动态范围图像和泛光)

文章开始先放两组效果,文章结尾再放两组效果 本文测试场景资源来自浅墨大神,shader效果为本文效果 HDR 人们有限的视觉系统,只支持16.7百万的颜色,超出这个范围的颜色就不能显示了 bmp或jprg每个像素就是16,24或32位 每个像素都由红绿蓝构成,如果储存为24位,每个值的范围就在0,255之间, 只能表现出256:1的差别,unity的shader中是0到1 然而在自然中太阳光下的对比度是50000:1 HDR(High Dynamic Range)使图像能表现出更大范围的对比,普

[UnityShader3]彩光效果

参考链接:http://blog.csdn.net/stalendp/article/details/40690185 效果图: 这里我把它分三部分实现:1.彩色 2.光圈 3.动画 1.先实现彩色效果.分析一下那张彩色图,它是以中心为原点的,然后颜色分为三部分,如下图.当角度为90度时,蓝色最多:当角度为-150度时,红色最多:当角度为-30度时,绿色最多.然后其他地方就是三色混合. Shader "Custom/Colors" { Properties { _AngleRange

Unity3D实现弹幕的效果

孙广东   2015.6.15 对于逗比的游戏.无厘头.可以让大家吐糟的游戏,如果有弹幕的功能是极好的. 使用U5和 UGUI 目前实现的很简陋而已. /// <summary> /// 实现看视频时的弹幕效果 /// </summary> public class DanMu : MonoBehaviour { //public Text[] texts; public GameObject textPrefab; [Tooltip("满屏的个数")] pub