您的位置:首页 > 移动开发 > Unity3D

Unity实现残影效果

2016-01-23 20:58 661 查看
//残影实现

using UnityEngine;

using System.Collections;

using System.Collections.Generic;//引入使用List的命名空间

public class CanYing : MonoBehaviour {

    public float interval = 0.1f;//残影的时间间隔

    public float lifeCycle = 2.0f;//残影的生存周期

    float lastCombinedTime = 0.0f;//上一次组合时间

    MeshFilter[] meshFilters = null;

    MeshRenderer[] meshRenderers = null;

    SkinnedMeshRenderer[] skinedMeshRenderers = null;

    List<GameObject> objs = new List<GameObject>();

// Use this for initialization
void Start () 

    {

        meshFilters = gameObject.GetComponentsInChildren<MeshFilter>();

        skinedMeshR
acf4
enderers = gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();
}

    void OnDisable()

    {

        foreach (GameObject go in objs)

        {

            DestroyImmediate(go);//销毁go

        }

        objs.Clear();

        objs = null;

    }
// Update is called once per frame
void Update () 

    {

        if (Time.time - lastCombinedTime > interval)
//控制间隔时间

        {

            lastCombinedTime = Time.time;

for (int i = 0; skinedMeshRenderers != null && i < skinedMeshRenderers.Length; ++i)
//遍历skinedMeshRenderers

            {

                Mesh mesh = new Mesh(); //生成一个新的mesh

                skinedMeshRenderers[i].BakeMesh(mesh);
//烘焙到新生成的mesh

                GameObject go = new GameObject();
//生成新的GameObject

                go.hideFlags = HideFlags.HideAndDontSave;
//设置属性隐藏不保存

MeshFilter meshFilter = go.AddComponent<MeshFilter>();
//添加MeshFilter

                
meshFilter.mesh = mesh;
//将新添加的MeshFilter设置为mesh

MeshRenderer meshRenderer = go.AddComponent<MeshRenderer>();//添加MeshRenderer

meshRenderer.material = skinedMeshRenderers[i].material;//将新添加的MeshRenderer的材质设置为获取到的材质

                InitFadeInObj(go, skinedMeshRenderers[i].transform.position,

                    skinedMeshRenderers[i].transform.rotation, lifeCycle);//淡入淡出

            }

            for (int i = 0; meshFilters != null && i < meshFilters.Length; ++i)

            {

                GameObject go = Instantiate(meshFilters[i].gameObject) as GameObject;

                InitFadeInObj(go, meshFilters[i].transform.position, meshFilters[i].transform.rotation, lifeCycle);
//新生成GameObject并且将其设置淡入淡出

            }

        }
}

    private void InitFadeInObj(GameObject go, Vector3 position, Quaternion rotation, float lifeCycle)

    {
go.hideFlags = HideFlags.HideAndDontSave;
//设置属性隐藏不保存

        go.transform.position = position; //得到position

        go.transform.rotation = rotation; //得到rotation

        FadInOut fi = go.AddComponent<FadInOut>();//添加FadInOut脚本

        
fi.lifeCycle = lifeCycle;//复制生命周期

        objs.Add(go);//放入列表中

    }
}

//淡入淡出效果

using UnityEngine;

using System.Collections;

public class FadInOut : MonoBehaviour {

    public float lifeCycle = 2.0f;

    float startTime;

    Material mat = null;

// Use this for initialization
void Start () {

        startTime = Time.time;//得到启动时间

        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();

        if (!meshRenderer || !meshRenderer.material)

        {

            base.enabled = false;//为空的话 禁用

        }

        else

        {

            mat = meshRenderer.material;//得到材质

            ReplaceShader();//替换Shader

        }
}

// Update is called once per frame
void Update () {

        float time = Time.time - startTime;//获取运行时间

        if (time > lifeCycle)

        {

            DestroyImmediate(gameObject);//达到设置时间,销毁

        }

        else

        {

            float remainderTime = lifeCycle - time;//得到剩余时间

            if (mat)

            {
//if(mat.HasProperty("_Color"))   得到mat中是否有这个属性

Color col = mat.GetColor("_Color");//得到材质中的shader中的_Color颜色
               col.a = remainderTime;//设置Alpha(剩余时间越小 Alpha值越小)
               mat.SetColor("_Color", col);//将修改后的颜色设置回去

                col = mat.GetColor("_OutlineColor");//原理同上

                col.a = remainderTime;

                mat.SetColor("_OutlineColor", col);

            }

        }
}

    private void ReplaceShader()

    {

        if (mat.shader.name.Equals("Custom/Toon/Basic Outline"))//检查当前shader名字是否是“ ”

        {

            mat.shader = Shader.Find("Custom/Toon/Basic Outline Replace");//如果是的话 替换shader

        }

        else if (mat.shader.name.Equals("Custom/Toon/Basic"))

        {

            mat.shader = Shader.Find("Custom/Toon/Basic Replace");

        }

        else

        {

            Debug.LogError("Can't find target shader");

        }

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Unity 残影技术