前几天在项目中遇到一个问题,需求是界面中先展示一段闪光特效,停顿一段时间后特效飞往一个固定的位置然后消失,类似于跑酷游戏吃到金币后金币飞往固定的金币数值显示框那种效果(具体是通过特效来实现还是直接通过金币模型移动和缩放来实现这个我倒没深入研究过,反正就是这么个意思,有相关经验的请不吝赐教 )。当时也没有多想,觉得这个应该是由美术特效来实现整个流程,后来美术资源给过来后发现和实际效果不大一样,特效播完后不能朝目标点移动,这就尴尬了!!!后来一想也确实是不行,一是虽然美术可以在Inspector面板设置参数来控制特效的一个大概运动方向,但是也不能实现精确的控制。二是即使能精确控制又怎么知道特效到底要飞往哪个点?万一需求改了目标点位置变了美术岂不是要重新设置特效?

正在苦思冥想之际得一同事指点,可以通过代码来控制粒子的运行方向及速度等属性。查阅相关资料后终于解决了这个问题。原来Unity官方文档里也提供了一个控制粒子属性的示例,真是惭愧,看来以后得多看几遍官方文档了。

大概的方法就是Update的时候获取粒子系统发出的所有粒子,调整好属性后再设置给粒子系统继续显示,代码如下:

using UnityEngine;

public class ParticleTarget : MonoBehaviour
{
public Transform targetTransform;
public float speed;
private ParticleSystem particleSys;
private ParticleSystem.Particle[] particles; private void Awake()
{
this.particleSys = this.GetComponent<ParticleSystem>();
if (this.particleSys)
{
this.particles = new ParticleSystem.Particle[this.particleSys.main.maxParticles];
//自定义粒子系统的模拟空间
ParticleSystem.MainModule main = this.particleSys.main;
main.simulationSpace = ParticleSystemSimulationSpace.Custom;
main.customSimulationSpace = this.targetTransform;
}
} private void Update()
{
if (!this.targetTransform)
{
return;
}
if (this.particleSys)
{
int count = this.particleSys.GetParticles(this.particles);
for (int i = 0; i < count; i++)
{
//朝目标点插值缓动
this.particles[i].position = Vector3.Lerp(this.particles[i].position, Vector3.zero, this.speed);
}
this.particleSys.SetParticles(this.particles, count);
}
}
}

其中需要注意一下坐标系的问题,我们的粒子特效一般设置成local坐标系模拟,只有保证粒子的模拟坐标系和目标点在同一空间下才能够正确的达到目的(这不是废话吗),好在粒子系统提供了一个自定义模拟空间的设置,这样就可以很方便的设置粒子系统的模拟空间为目标点的Transform,然后将粒子目标点设置成Vector3.zero(在目标位置的局部空间下,Vector3.zero就相当于目标点位置,这也是废话)。

上面的代码在Unity5.5版本运行没问题,但是在之前的版本没有提供自定义粒子系统模拟空间的设置。既然没有提供那我们可以手动将目标点的位置转换到粒子系统的local坐标系来达到同样的目的,如果粒子系统的模拟空间是世界坐标系的话可以直接使用目标点的世界坐标,代码如下:

using UnityEngine;

public class ParticleTarget : MonoBehaviour
{
public Transform targetTransform;
public float speed;
private Vector3 targetPosition;
private ParticleSystem particleSys;
private ParticleSystem.Particle[] particles; private void Awake()
{
this.particleSys = this.GetComponent<ParticleSystem>();
if (this.particleSys)
{
this.particles = new ParticleSystem.Particle[this.particleSys.main.maxParticles];
Vector3 world = this.targetTransform.TransformPoint(Vector3.zero);
this.targetPosition = this.transform.InverseTransformPoint(world);
}
} private void Update()
{
if (!this.targetTransform)
{
return;
}
if (this.particleSys)
{
int count = this.particleSys.GetParticles(this.particles);
for (int i = 0; i < count; i++)
{
this.particles[i].position = Vector3.Lerp(this.particles[i].position, this.targetPosition, this.speed);
}
this.particleSys.SetParticles(this.particles, count);
}
}
}

在此基础上我们还可以做一些扩展,比如可以在一个固定时间后粒子才飞往目标点,这样就为特效提供了充分的展示时间,整个过程就会显得不那么突兀。还可以调整粒子飞往目标点的速度或者路径(不限于直线),从而达到更好的显示效果。万变不离其宗,具体实现有兴趣的可以自己去研究。

以上内容均为本人拙见,如有错误还望大家指出,如有其他方法也请大家不吝赐教。

Unity:控制粒子特效的移动方向的更多相关文章

  1. 【Unity 3D】学习笔记四十二:粒子特效

    粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起.来模拟火焰,爆炸.水滴,雾气等效果. 要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system就可 ...

  2. Unity中的粒子特效的 RendererQ 排序

    这里接https://www.cnblogs.com/luguoshuai/p/10021660.html 这里介绍两套粒子排序的方法. 首先声明,这两套排序方法均不是本人所写,是在项目开发的过程当中 ...

  3. Unity基础功能:粒子特效(Shuriken)

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  4. Mask裁切UI粒子特效或者3D模型

    刚好前几天有人问我这个问题,再加上新项目也可能用,所以这两天就研究了一下.其实如果粒子特效 和3D模型 都用RenderTexture来做的话就不会有裁切的问题,但是粒子特效用RenderTextur ...

  5. UGUI中显示粒子特效

    今天在UGUI上显示粒子特效的时候遇到的一些问题,Mark一下.原理:修改特效中每一个ParticleSystem的Layer为UI,并且把ParticleSystemRenderer.sorting ...

  6. 关于Unity中粒子效果的使用

    粒子效果1: 游戏中会有很炫酷的特效,比如爆炸,水花,火焰等;2: unity提供粒子编辑器,方便特效人员来开发很炫酷的特效;3.粒子效果一般有专门的粒子特效师来做,我们只需要拿来用就好了,很多参数没 ...

  7. 【Stage3D学习笔记续】真正的3D世界(五):粒子特效

    先看效果,按下空格键添加粒子特效: 一般而言粒子特效的实现都是比较复杂的,且不说实现粒子特效的编码和设计,光是编写一个粒子编辑器就不是简单的一件事,但是作者使用了很取巧的方式来完成,我们接下来深入代码 ...

  8. JParticles 2.0 发布,打造炫酷的粒子特效

    JParticles 2.0 发布,打造炫酷的粒子特效.不好意思哈,在这么繁花似锦的世界里,标题不得不取得吸引眼球一点哈,不然...还是不啰嗦了,我们进入正题吧 简单介绍一下 JParticles 2 ...

  9. [原][粒子特效][spark]调节器modifier

    深入浅出spark粒子特效连接:https://www.cnblogs.com/lyggqm/p/9956344.html group添加modifier的方式: modifier An abstra ...

随机推荐

  1. Golang入门教程(一)GOPATH与工作空间(Windows)

    https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.2.md Windows 环境: 下面我就 ...

  2. java.lang.System.arraycopy() 与java.util.Arrays.copyOf()的区别

    java.lang.System.arraycopy() 与java.util.Arrays.copyOf()的区别 一.java.lang.System.arraycopy() 该方法的声明: /* ...

  3. jQuery UI dialog 使用记录

    1 属性 1.11 autoOpen ,这个属性为true的时候dialog被调用的时候自动打开dialog窗口.当属性为false的时候,一开始隐藏窗口,知道.dialog("open&q ...

  4. POJ 1350 Cabric Number Problem (模拟)

    题目链接 Description If we input a number formed by 4 digits and these digits are not all of one same va ...

  5. NYOJ 116 士兵杀敌(二) (树状数组)

    题目链接 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的.小工是南将军手下的军师,南将军经常想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧.南将军的某次询问之后 ...

  6. 软件测试工程师人手必备的一只:TOM猫,可以带你装逼带你飞!

    Hi,你来了? 其实没有猫,为了让你们好好学习,天天向上!我可真的是拼了命了! 写这篇文章的缘由是,近期有同学经常问到一个这样的问题: 老师,tomcat是啥? 老师,Linux是啥? 老师,xshe ...

  7. 【译】第四篇 Integration Services:增量加载-Updating Rows

    本篇文章是Integration Services系列的第四篇,详细内容请参考原文. 回顾增量加载记住,在SSIS增量加载有三个使用案例:1.New rows-add rows to the dest ...

  8. python入门 20141102-1405

    那Python有哪些缺点呢? 第一个缺点就是运行速度慢,和C程序相比非常慢, 第二个缺点就是代码不能加密. Python是解释型的 不是编译型的 Python解释器-CPython 命令行: 只需要在 ...

  9. python 面试题2

    问题一:以下的代码的输出将是什么? 说出你的答案并解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Par ...

  10. idea心得

    概述 Intellij IDEA真是越用越觉得它强大,它总是在我们写代码的时候,不时给我们来个小惊喜.出于对Intellij IDEA的喜爱,我决定写一个与其相关的专栏或者系列,把一些好用的Intel ...