zoukankan      html  css  js  c++  java
  • Unity实现残影和淡入淡出效果

    //残影实现

    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>();
    skinedMeshRenderers = 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");
    }
    }
    }

  • 相关阅读:
    spark 随意笔记
    c#读取输入字符串,从数据源中查找以该字符串开头的所有字符串(使用正则表达式)
    我的收藏链接地址
    SQL查询时,遇到用到关键词作的字段。将该字段用一对中括号括起来[]
    SQL数据类型相互转换
    Javascript获取系统当前时间
    节点类型nodeType的取值
    混合布局编程挑战
    Webstorm破解方法
    二列布局
  • 原文地址:https://www.cnblogs.com/X-dream/p/5154028.html
Copyright © 2011-2022 走看看