残影实现:

    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. javascript中json对象json数组json字符串互转及取值

    今天用到了json数组和json对象和json类型字符串之间互转及取值,记录一下: 1.json类型的字符串转换为json对象及取值 var jsonString = '{"bar" ...

  2. h5 实现调用系统拍照或者选择照片并预览

    这次又来分享个好东西! 调用手机相机拍照或者是调用手机相册选择照片,这个功能在 手机端页面 或者 webApp 应该是常用到的,就拿个人或会员资料录入那块来说就已经是经常会碰到的, 每当看到这块功能的 ...

  3. redis skiplist (跳跃表)

    redis skiplist (跳跃表) 概述 redis skiplist 是有序的, 按照分值大小排序 节点中存储多个指向其他节点的指针 结构 zskiplist 结构 // 跳跃表 typede ...

  4. 在Oracle中添加用户登录名称

    第一步,打开Oracle客户端单击 “帮助”-->"支持信息"-->”TNS名“,加入红色部分.页面如下: 第二步,再次打开Oracle客户端时,就会显示数据库了,只需 ...

  5. 浅谈聚类算法(K-means)

    聚类算法(K-means)目的是将n个对象根据它们各自属性分成k个不同的簇,使得簇内各个对象的相似度尽可能高,而各簇之间的相似度尽量小. 而如何评测相似度呢,采用的准则函数是误差平方和(因此也叫K-均 ...

  6. ue4竖排文本显示

    最近发现中国风游戏中,经常会遇到旁白文字竖着显示的需求. 于是我首先找了找控件蓝图中的text有没有相关类似横竖文本框的选项,然而并无所获. 突然间灵机一动! 竖着显示不就是每个字一换行嘛! 说干就干 ...

  7. poj2155二维树状数组

    Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row an ...

  8. Debian 8 下安装持续集成的工具Jenkins

    前情提示:Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. 第一种方法: 1.1 配置java环境变量    解压java到相应目录,我一般习惯把安装的软件 ...

  9. Docker基于已有的镜像制新的镜像

    1.根据运行的容器制作镜像 #查看所有的容器 docker ps #暂停当前容器 docker pause COTNAINER-ID #将容器运行当前状态提交 docker commit COTNAI ...

  10. LeetCode4. Median of Two Sorted Arrays---vector实现O(log(m+n)--- findkth

    这道题目和PAT上的1029是同一题.但是PAT1029用O(m+n)的时间复杂度(题解)就可以,这道题要求是O(log(m+n)). 这道题花费了我一个工作日的时间来思考.因为是log因而一直思考如 ...