Common(十一)—— FadeInOut
来源:互联网 发布:软件研发学习 编辑:程序博客网 时间:2024/06/06 03:25
文件目录为:Assets/Scripts/Common/FadeInOut.cs 这个文件主要实现了角色淡入淡出的效果,但是其中用到的shader我没找到,所以暂时只能用作参考。
using UnityEngine;using System.Collections.Generic;//淡入淡出效果public class FadeInOut : MonoBehaviour{ public enum FADE_TYPE { FADE_IN, //淡入状态 FADE_OUT, //淡出状态 FADE_NOT, //非淡入淡出 } //角色当前透明度 public float mCurFadeValue = 1.0f; //角色需要的透明度 private float mFadeValue = -1.0f; //过渡时间 private float mFadeTime = -1.0f; //单位淡出值 private float mDeltaFade = 0.0f; //淡入淡出类型 public FADE_TYPE mFadeType = FADE_TYPE.FADE_NOT; //角色默认材质 private Material mDefaultMat; //角色透明材质 private Material mTransparentMat; //保存角色的SkinnedMeshRender private List<SkinnedMeshRenderer> mMeshRenders = new List<SkinnedMeshRenderer>(); //保存角色的ParticleSystem private ParticleSystem[] mParticleSystems; //保存每个ParticleSystem的alpha值 private float[] mPsAlphas; //保存每个ParticleSystem的alpha值 private float[] mPsCurAlphas; void Start() { //遍历获取第一层SkinnedMeshRender for (int i = 0; i < gameObject.transform.childCount; i++) { Transform ts = gameObject.transform.GetChild(i); GameObject psObj = ts.gameObject; if (psObj) { SkinnedMeshRenderer render = psObj.GetComponent<SkinnedMeshRenderer>(); if (render != null) mMeshRenders.Add(render); } } //获取玩家身上所有特效 mParticleSystems = gameObject.GetComponentsInChildren<ParticleSystem>(); if (mParticleSystems.Length != 0) { //开辟空间 mPsAlphas = new float[mParticleSystems.Length]; mPsCurAlphas = new float[mParticleSystems.Length]; } //保存粒子系统的alpha值 for (int i = 0; i < mParticleSystems.Length; i++) { mPsAlphas[i] = mParticleSystems[i].startColor.a; mPsCurAlphas[i] = mParticleSystems[i].startColor.a; } if (mMeshRenders.Count == 0) Debug.LogError("the SkinnedMeshRender can not be empty in fadeInOut!"); //获取默认材质 mDefaultMat = mMeshRenders[0].sharedMaterial; //创建角色透明材质 //Shader.Find can be used to switch to another shader without having to keep a reference to the shader. //name is the name you can see in the shader popup of any material, for example "Standard", "Unlit/Texture", "Legacy Shaders/Diffuse" etc. //这里Find的shader的name应当是能在shader弹出菜单里能找到的才对 mTransparentMat = new Material(Shader.Find("Custom/Alpha_Diffuse")); //修改材质 mTransparentMat.SetTexture(0,mDefaultMat.GetTexture(0)); } //修改模型材质 void ChangeMaterial(Material mat) { foreach (SkinnedMeshRenderer render in mMeshRenders) { render.material = mat; } } //设置角色模型可见性 void SetMeshVisible(bool flag) { foreach (SkinnedMeshRenderer render in mMeshRenders) { render.enabled = flag; } } //淡入效果 //这里的deltaTime单位为秒 public void FadeIn(float deltaTime, float alphaValue) { //此时mCurFadeValue应当是一个较小的值,至少小于1.0f //从alphaValue-mCurFadeValue逐渐增加 if (alphaValue > mCurFadeValue) { mFadeType = FADE_TYPE.FADE_IN; mFadeValue = alphaValue; mFadeTime = deltaTime; mDeltaFade = (alphaValue - mCurFadeValue) / deltaTime; ChangeMaterial(mTransparentMat); SetMeshVisible(true); } } //淡出效果 //这里的deltaTime单位为秒 public void FadeOut(float deltaTime, float alphaValue) { if (alphaValue < mCurFadeValue) { mFadeType = FADE_TYPE.FADE_OUT; mFadeValue = alphaValue; mFadeTime = deltaTime; mDeltaFade = (alphaValue - mCurFadeValue) / deltaTime; ChangeMaterial(mTransparentMat); } } void Update() { if(mFadeType == FADE_TYPE.FADE_NOT) return; float deltaFade = mDeltaFade * Time.deltaTime; //处理每个特效alpha for (int i = 0; i < mPsCurAlphas.Length; i++) { float psDelta = deltaFade * mPsAlphas[i]; mPsCurAlphas[i] += psDelta; if (mPsCurAlphas[i] <= 0.0f) mPsCurAlphas[i] = 0.0f; else if(mPsCurAlphas[i] >= 1.0f) mPsCurAlphas[i] = 1.0f; Color colour = mParticleSystems[i].startColor; mParticleSystems[i].startColor = new Color(colour.r, colour.g, colour.b, mPsCurAlphas[i]); } //淡入效果 if (mFadeType == FADE_TYPE.FADE_IN) { mCurFadeValue = mCurFadeValue + deltaFade; //结束 if (mCurFadeValue >= mFadeValue) { mCurFadeValue = mFadeValue; mFadeType = FADE_TYPE.FADE_NOT; //换回默认的Mat ChangeMaterial(mDefaultMat); } mTransparentMat.SetColor("_Color", new Color(1, 1, 1, mCurFadeValue)); } //淡出效果 else if (mFadeType == FADE_TYPE.FADE_OUT) { mCurFadeValue = mCurFadeValue + deltaFade; //结束 if (mCurFadeValue <= mFadeValue) { mCurFadeValue = mFadeValue; mFadeType = FADE_TYPE.FADE_NOT; // SetMeshVisible(false); } mTransparentMat.SetColor("_Color", new Color(1, 1, 1, mCurFadeValue)); } } }
阅读全文
0 0
- Common(十一)—— FadeInOut
- FadeInOut相机渐变
- Common(二)—— CMemQueue
- Common(三)—— CMsg
- Common(四)—— Protocal
- Common(六)—— 单例
- Common(七)—— NetworkManager
- Common(九)—— BeatFlyMotion
- Common(十二)—— JXML
- Common Lisp学习之十一:使用宏
- OpenLayers分析——(十一)体系结构
- Java实践(十一)——五子棋
- Java实践(十一)——五子棋
- Java基础(十一)——反射
- Hibernate学习——(十一)HQL
- Tricks(二十一)—— 随机数
- angular学习(十一)—— Form
- Q&A——资源管理(十一)
- 古文觀止卷九_鈷鉧潭西小丘記_柳宗元
- matlab显示直方图涉及的函数(入门篇)
- 应用归并排序解决——求逆序对问题
- 第4周项目1建立单链表
- jAVA SpringBoot(2)---application.properties数据库配置
- Common(十一)—— FadeInOut
- 台大Hungyi Lee Machine-Learning 2017FALL HW0
- 初识c#---泛型集合,哈希表,堆栈,队列,索引器
- mysql优化1.1
- PHP学习笔记——使用回调函数处理数组的函数array_filter()
- 深度学习如何选择模型
- leetcode53. Maximum Subarray
- C# lock关键词/lock语句块、线程锁
- 1.Redis简介与基本命令