最近被实习、论文、毕业的事转得浑浑噩噩,不是有多忙,而是变得更加懒了,每天下班之后就混迹在不朽的 ACG 事业中消磨时间 … 定下的目标也各种荒废,连 UDK 也抛在一边 … 这不是病,是罪 T_T 这周把学院的事情基本处理完毕,接下来就是等着拿证了。在此即将毕业之际请自己不要在浪费时间的错误道路上越走越远 …

本篇是有关粒子效果的教程,本来早就该放出来 … 但不知不觉一拖就到了六月 … 还请各位看官见谅。下图展示了最终效果 :

教程将会说明如何在 UDK 中创建出此类带有 “拖尾” 效果的粒子,以及怎样将这些粒子附加给目标对象,并简要说明用 UnrealScript 控制这些粒子的方法。

注 :

虚幻引擎的粒子需要至少一个有效材质方可正常工作,通常在使用默认的材质进行简单测试后,就需要导入目标材质进行进一步制作,通过多次修改粒子的各项属性及材质来得出理想效果。本文中的材质非常简单 :

一个 Vertex Color (顶点颜色) 和一个常数 100 通过 Multiply 连接到材质的 Emissive 节点上。使用 Vertex Color 是为了这个材质的颜色可以被粒子编辑器中的颜色模块控制,增加灵活性;

常数 100 是为了让材质具有较强的光溢出效果,让粒子看起来 “华丽”。另外记住设置 Blend Mode (混合模式) 和勾选 Two Sided (双面材质);

 接下来新建一个粒子 (在 Content Browser 空白处右键选择 New ParticleSystem),将我们刚才建立的材质赋予它的 Required 模块 :

Required 是一个必要基础模块,包含许多基础属性的设置,最常用的就是 Material;

设置 Spawn 模块的 Rate 属性为 0,这个属性很重要它表示表秒生成的粒子数量,但这里由于 “拖尾” 效果通常是平滑且连续的,我们要使用 Spawn PerUnit 来替代它工作;

Spawn PerUnit 可以基于发射器运行的距离来产生粒子,不管尾迹的速度是快还是慢,它都可以保持结合性,并且它一直产生相对数量的粒子来填充空隙。它有两个重要属性 : Spawn Per Unit 和 Unit Scalar,它们相除得出的值表示每个单位的粒子的实际数量;

做完这些你会发现粒子根本就不是一个 “拖尾” 的效果 … 表着急 … 接下来就请出主角 Ribbon Data 模块,你可以在 Particle Emitter (粒子发射器) 的空白处右键 → TypeData → New Ribbon Data 来添加,调整它的 Render Axis (渲染轴) 使效果看起来符合预期 :

 Ribbon Data 有许多可以设置的属性,您可以在 UDN 上 了解详情

至此,您应该能看到一个条带状的效果,不过为了要让它像模像样,还应该继续改进 : 通过 Lifetime 调整生存时间、Initial Size 调整条带的大小、Color Over Life 调整颜色 …

在获得一个符合预期的粒子后,就可以赋给目标对象,配合动画来看看运行效果 (提示 :调试类似于 “拖尾” 这样的粒子时您最好另开一个动画编辑器窗口来实时观看运行结果)

我们给目标对象添加一个插槽,再将粒子赋给这个插槽,注意下图的红色横线部分 :

接下来来讲脚本部分 : 武器的 “拖尾” 通常是角色施展了战斗类技能才会产生,要是一直存在 “拖尾” 反而会影响玩家的游戏体验,因此我们需要一些手段来控制这些 “拖尾” 来让它们听话

首先在你自定义的 Pawn 类中创建这个粒子对象,并添加到插槽 :

//声明变量,GhostSwordParticle 是自定义的变量名,它的类型是 ParticleSystemComponent var ParticleSystemComponent GhostSwordParticle;

defaultproperties { //...省略代码...//创建武器粒子对象 Begin Object Class=ParticleSystemComponente Name = WeaponParticle Template = ParticleSystem'BSA_Particles.weapon-particles.GhostSword-Ribbon' //是否在进入游戏后就自动激活这个粒子? bAutoActivate = False End Object //赋给上面声明过的变量 GhostSwordParticle GhostSwordParticle = WeaponParticle //将这个粒子添加到组件 Components.Add(WeaponParticle) //...省略代码... }

//PostBeginPlay() 会在开始游戏后立即生效 simulated function PostBeginPlay() { if (WeaponSkeletalMesh != none) { //将粒子添加到武器粒子插槽 Mesh.AttachComponentToSocket(GhostSwordParticle,'WeaponParticleSocket'); } }

定位到你的有关战斗动画的代码 (通常是一个专门的类) ,在你需要应用 “拖尾” 效果的时候激活粒子,停止战斗时则立即关闭粒子:

//首先声明你的玩家角色类 var BSA_BladeMasterPlayerPawn BSA_BMPP; simulated function PostBeginPlay() { Super.PostBeginPlay(); BSA_BMPP = BSA_BladeMasterPlayerPawn(instigator); }

//开始普通攻击 function StartAttack() { //...省略代码.. //激活玩家角色的 GhostSwordParticle BSA_BMPP.GhostSwordParticle.SetActive(True); //...省略代码... //攻击时间到,调用 EndAttack() SetTimer(SwordAttackDuration[ComboIndex],, nameOf(EndAttack)); //...省略代码... }

//停止任何进行中的攻击 function EndAttack() { //...省略代码... //关闭玩家角色的 GhostSwordParticle BSA_BMPP.GhostSwordParticle.SetActive(False); //...省略代码... }

粒子系统是最千变万化的,没有什么一成不变的数据,很多时候不经意之间就调教出了很好的效果 …

许多人会问战神系列那么夸张华丽的武器拖尾是怎么做出来的,其实在本文这个基本的拖尾粒子上加上 Initial Velocity (初始速度) 和 Acceleration (加速度) 就能收到十分相似的结果, 关键是要多调试、多总结!

祝大家都能做出漂亮惊艳的粒子 当然别忘了分享哦 ~ .END.