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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM