残影实现:

    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运动残影技能的更多相关文章

  1. Unity3D手游开发日记(8) - 运动残影效果

    2D游戏的残影很简单,美术做序列帧图片就行了,那么3D游戏的残影美术做不了,得靠程序员动态创建模型来处理. 实现原理也很简单: 1.间隔一定时间创建一个残影模型 GameObject go = Gam ...

  2. Unity角色残影特效

    残影特效在网上有很多例子,比如这个,我参考着自己整合了一下,算是整合了一个比较完整且特别简单易用的出来,只需要一个脚本挂上去无需任何设定就能用. 这里只针对SkinnedMeshRenderer的网格 ...

  3. Unity Shader : Ghost(残影) v1

    前阵子组长给我提了个需求,要实现角色人物的残影.我百度google了一下,发现可以用两种方式实现这个效果:1.记录前几帧的人物位置,将其传入shader中,对每个位置进行一个pass渲染.2. 通过相 ...

  4. as3如何做出残影效果

    在页游中,时不时能看到人物做一些快速移动动作如冲刺时,有残影效果,强化了画面表现.实际人肉眼之所以能看到残影的效果,是因为观察到的物体会在人视线中残留几十毫秒时间,当运动物体运动太快时,人肉眼所见未能 ...

  5. Win7去除桌面残影的方法

    用户升级到Win7系统后使用正常,就是系统桌面会留有残影,怎么样也去不掉,影响用户的使用,那么要如何将这些残影去掉呢?可从计算机属性中进行相关配置. 解决方法 一.在计算机面板上,右键点击“计算机”, ...

  6. Unity3d 残影效果(狂拽炫酷叼炸天)

    效果图,真的很叼啊 我根据别人的改进了一版,支持MeshFilter上的Mesh(需要确保Mesh的Read/Write是开启的否则不能正常工作) 非常感谢原作者给提供思路.http://blog.c ...

  7. HDOJ(HDU) 2153 仙人球的残影(谜一样的题、、、)

    Problem Description 在美丽的HDU,有一名大三的同学,他的速度是众所周知的,跑100米仅仅用了2秒47,在他跑步过程中会留下残影的哎,大家很想知道他是谁了吧,他叫仙人球,既然名字这 ...

  8. Unity3D-Shader-人物残影效果

    [旧博客转移 - 2016年1月7日 00:24 ] 前面的话 上一篇讲了一下人物边缘发光效果,链接: Unity-ShaderLab-实现X光效果,这次我们利用这个Shader来实现人物残影效果 先 ...

  9. cocos2dx - shader实现任意动画的残影效果

    本节主要讲利用cocos2dx机制实现opengl es shader脚本的绘制 这里先看下最终效果:                      这里分别实现了灰度效果及残影的效果. 一.绘制基类 这 ...

随机推荐

  1. js中计算两个日期之差

    js中计算两个日期之差            var aBgnDate, aEndDate;            var oBgnDate, oEndDate;            var nYl ...

  2. php流程管理

    流程控制即某个人发起一个流程,通过一层一层审核,通过后,完成整个流程,若有一层审核未通过,中断整个流程.即结束! 比如请假流程: 某一员工发起一个请假流程,那么这个流程的节点人员即他的上级,上上级,上 ...

  3. 【转】JDBC学习笔记(9)——DBUtils的使用

    转自:http://www.cnblogs.com/ysw-go/ 使用DBUtils提供的功能需要使用commons-dbutils-1.6.jar这个JAR包,在Apache官网可以下载到 使用D ...

  4. 我使用的Chrome插件列表

    AdBlock 用来屏蔽广告的,有一些网站会探测出你在使用AdBlock.如果一定要继续浏览的话,你可能需要暂停一下AdBlock Vimium 非常推荐喜欢vim的用户试试看这款插件,它的主要特色是 ...

  5. oracle 的 SDO_GEOMETRY

    元数据定义 CREATE OR REPLACE TYPE MDSYS.SDO_GEOMETRY AS OBJECT ( SDO_GTYPE NUMBER, SDO_SRID NUMBER, SDO_P ...

  6. C语言结构体中字符数组的问题

    第一个程序 #include <stdio.h> #include <string.h> typedef struct student { char name[10]; int ...

  7. 1. Skippr

    Skippr 是一个超级简单的 jQuery 幻灯片插件.只是包括你的网页中引入 jquery.skippr.css 和 jquery.skippr.js 文件就能使用了.Skippr 能够自适应窗口 ...

  8. NodeJs之fs的读写删移监

    NodeJs版本:4.4.4 fs 文件系统模块是一个封装了标准的 POSIX 文件 I/O 操作的集合.Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本. 图片的复制与粘贴 创建 ...

  9. oracle中varchar、varchar2、char和nvarchar的区别

    1.char char的长度是固定的,比如说,你定义了char(20),即使你你插入abc,不足二十个字节,数据库也会在abc后面自动加上17个空格,以补足二十个字节: char是区分中英文的,中文在 ...

  10. python中str的find()

    今天学习语法的时候发现字符串自带函数find和操作符in功能十分近似,几乎一模一样 if 'a' in name:    print 'Yes, it contains the string &quo ...