Unity运动残影技能
残影实现:
1、List<DrawMesh> list,此list中包含某一帧动画模型网格、材质
2、每过一段时间就将运动物体的模型add到list中(优化:未实现,网格合并)
3、LateUpdate里将list中所有模型材质alpha减少,为0,则remove;其余的模型 DrawMesh
技能实现:
技能为两部分,前一部分是运动残影,后一部分是落地爆炸,协程处理即可。
ps
此例简单实现了这个技能,不过应该能够做的更好一些,就是给运动物体添加状态:空中、即将落地,需要维护这两个状态,并且需要用射线处理将爆炸粒子放在合适的位置play
代码:
using UnityEngine;
using System.Collections;
using System.Collections.Generic; class DrawMesh
{
public Mesh mesh;
public Matrix4x4 matrix;
public Material material;
public DrawMesh(Mesh me, Matrix4x4 ma, Material mat, Color color)
{
this.mesh = me;
this.matrix = ma;
this.material = new Material(mat);
this.material.shader = Shader.Find("Transparent/VertexLit");
this.material.SetColor("_Emission", color);
}
} public class Skill4 : MonoBehaviour
{
private SkinnedMeshRenderer[] render; public float forwardPower;//移动速度
public float jumpPower;//跳跃速度
private bool isStart;//残影是否开始 public float Skill4ContinueTime;//残影过程总时间
private float time;
public float fadeSpeed;//残影渐变消失速率 public float rate;//绘制残影速率
public Color color;//残影颜色
private List<DrawMesh> list;//残影list public ParticleSystem particle;//结束爆炸粒子
private Vector3 particlePosition;//粒子初始位置,粒子挂在玩家身上 void Awake()
{
render = GetComponentsInChildren<SkinnedMeshRenderer>();
list = new List<DrawMesh>();
isStart = false;
time = ;
particlePosition = particle.transform.localPosition;
} void Update()
{
if (Input.GetKeyDown(KeyCode.H))
{
UseSkill();
}
} public void UseSkill()
{
playerCS.CrossFade("Attack3Anim", 0f);
isStart = true;
time = ;
StartCoroutine(IEStartSkill());
} private IEnumerator IEStartSkill()
{
rigidbody.velocity = rigidbody.velocity + Vector3.up * jumpPower;//跳跃速度
while (isStart)
{
for (int i = ; i < render.Length; i++)
{
Mesh mesh = new Mesh();
render[i].BakeMesh(mesh);
list.Add(new DrawMesh(mesh, render[i].transform.localToWorldMatrix, render[i].material, color));
}
yield return new WaitForSeconds(rate);
}
} void FixedUpdate()
{
if (isStart)
{
if (time < Skill4ContinueTime)//残影过程中
{
time += Time.deltaTime;
rigidbody.velocity = transform.TransformDirection(Vector3.forward * forwardPower) + Vector3.up * rigidbody.velocity.y;
}
else//残影过程结束 进入爆炸过程
{
isStart = false;
rigidbody.velocity = Vector3.up*rigidbody.velocity.y;
playerCS.CrossFade("IdleAnim", 1f);
StartCoroutine(IEBoom());
}
}
} IEnumerator IEBoom()
{
particle.transform.parent = null; particle.gameObject.SetActive(true);
particle.Play();
yield return new WaitForSeconds(particle.duration); //爆炸过程结束
particle.gameObject.SetActive(false);
particle.transform.parent = transform;
particle.transform.localPosition = particlePosition;
} void LateUpdate()
{
for (int i = list.Count - ; i >= ; i--)
{
list[i].material.SetColor("_Color", new Color(color.r, color.g, color.b, list[i].material.color.a - Time.deltaTime * fadeSpeed));
if (list[i].material.color.a <= 0.05f)
{
Destroy(list[i].material);//重要,如果不destroy显存占用越来越多
Destroy(list[i].mesh);
list.RemoveAt(i);
}
}
for (int i = list.Count - ; i >= ; i--)
{
Graphics.DrawMesh(list[i].mesh, list[i].matrix, list[i].material, gameObject.layer);
}
}
}
效果:
Unity运动残影技能的更多相关文章
- Unity3D手游开发日记(8) - 运动残影效果
2D游戏的残影很简单,美术做序列帧图片就行了,那么3D游戏的残影美术做不了,得靠程序员动态创建模型来处理. 实现原理也很简单: 1.间隔一定时间创建一个残影模型 GameObject go = Gam ...
- Unity角色残影特效
残影特效在网上有很多例子,比如这个,我参考着自己整合了一下,算是整合了一个比较完整且特别简单易用的出来,只需要一个脚本挂上去无需任何设定就能用. 这里只针对SkinnedMeshRenderer的网格 ...
- Unity Shader : Ghost(残影) v1
前阵子组长给我提了个需求,要实现角色人物的残影.我百度google了一下,发现可以用两种方式实现这个效果:1.记录前几帧的人物位置,将其传入shader中,对每个位置进行一个pass渲染.2. 通过相 ...
- as3如何做出残影效果
在页游中,时不时能看到人物做一些快速移动动作如冲刺时,有残影效果,强化了画面表现.实际人肉眼之所以能看到残影的效果,是因为观察到的物体会在人视线中残留几十毫秒时间,当运动物体运动太快时,人肉眼所见未能 ...
- Win7去除桌面残影的方法
用户升级到Win7系统后使用正常,就是系统桌面会留有残影,怎么样也去不掉,影响用户的使用,那么要如何将这些残影去掉呢?可从计算机属性中进行相关配置. 解决方法 一.在计算机面板上,右键点击“计算机”, ...
- Unity3d 残影效果(狂拽炫酷叼炸天)
效果图,真的很叼啊 我根据别人的改进了一版,支持MeshFilter上的Mesh(需要确保Mesh的Read/Write是开启的否则不能正常工作) 非常感谢原作者给提供思路.http://blog.c ...
- HDOJ(HDU) 2153 仙人球的残影(谜一样的题、、、)
Problem Description 在美丽的HDU,有一名大三的同学,他的速度是众所周知的,跑100米仅仅用了2秒47,在他跑步过程中会留下残影的哎,大家很想知道他是谁了吧,他叫仙人球,既然名字这 ...
- Unity3D-Shader-人物残影效果
[旧博客转移 - 2016年1月7日 00:24 ] 前面的话 上一篇讲了一下人物边缘发光效果,链接: Unity-ShaderLab-实现X光效果,这次我们利用这个Shader来实现人物残影效果 先 ...
- cocos2dx - shader实现任意动画的残影效果
本节主要讲利用cocos2dx机制实现opengl es shader脚本的绘制 这里先看下最终效果: 这里分别实现了灰度效果及残影的效果. 一.绘制基类 这 ...
随机推荐
- 快速排序算法回顾 --冒泡排序Bubble Sort和快速排序Quick Sort(Python实现)
冒泡排序的过程是首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字.以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止 ...
- oracle调用array参数存储过程
declare -- Non-scalar parameters require additional processing files tyt_gas2014_search; ,); temp1 t ...
- java面试题—精选30道Java笔试题解答(二)
摘要: java面试题-精选30道Java笔试题解答(二) 19. 下面程序能正常运行吗() public class NULL { public static void haha(){ System ...
- Native App和Web App 的差异
开发者们都知道在高端智能手机系统中有两种应用程序:一种是基于本地(操作系统)运行的APP:一种是基于高端机的浏览器运行的WebApp,本文将主要讲解后者. WebApp与Native App有何区别呢 ...
- sass入门学习篇(二)
从语法开始但是语法也不是一两句的事情,首先看基本的导入,使用 一,sass有两种后缀名文件:一种后缀名为sass,不使用大括号和分号:另一种就是我们这里使用的scss文件,建议scss. 二,导入 使 ...
- angularjs中常用的ng指令介绍【转载】
原文:http://www.cnblogs.com/lvdabao/p/3379659.html 一.模板中可使用的东西及表达式 模板中可以使用的东西包括以下四种: 指令(directive).ng提 ...
- [Git]04 如何使用标签
Git也可以对某一时间点上的版本打上标签.人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做. 本节我们一起来学习如何如何新建标签,列出所有可用的标签,以及各种不同类型标签之间的差 ...
- macOS 下配置 MAMP 开发环境(Mac + Apache + Mysql + PHP)
macOS 中已经内置了 PHP.Python.Ruby.Perl 等常用的脚本语言,以及 Apache HTTP 服务器,所以使用起来非常方便.本文以最新的 macOS Sierra 10.12 配 ...
- python特征提取——pyAudioAnalysis工具包
作者:桂. 时间:2017-05-04 18:31:09 链接:http://www.cnblogs.com/xingshansi/p/6806637.html 前言 语音识别等应用离不开音频特征的 ...
- virtualbox中实施ASM扩容实施记录
实施ASM在线扩容 1. 首先关闭集群 [root@node1 bin]# ./crsctl stop crs [root@node2 bin]# ./crsctl stop crs 关机,halt ...