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");
}
}
}
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实现多点触控代码
- 在Unity中实现动画的正反播放代码
- unity实现摄像头跟随
- Unity3D上路_01-2D太空射击游戏
- Unity3D上路_02-第一视角射击游戏
- Unity3D上路_03-塔防游戏
- Unity3D上路_04-基础资源介绍
- Unity3D上路_05-网络相关
- [软件资讯]Unity已支持将3D游戏导出成Flash
- Unity 武器拖尾效果
- unity常见问题之20题
- Unity3D动画存储插件
- unity 赛车相机跟随物体移动
- Unity 预编译宏
- Unity AssetDatabase类
- VS2013中 命名空间“UnityEngine”中不存在类型或命名空间名称“UI”。是否缺少程序集引用?
- unity 实现炸弹人放炸弹后只进不出的一种方法
- Unity3D占用内存太大的解决方法
- 【Unity】安卓项目使用带有资源Jar包SDK的打包方法
- Unity2d 5.1 弱联网游戏制作 (一)场景创建、添加组件、精灵移动、主摄像机跟随