131 lines
4.8 KiB
Markdown
131 lines
4.8 KiB
Markdown
|
特效
|
|||
|
===============
|
|||
|
|
|||
|
本教程主要介绍了在egret3d引擎中使用自定义粒子
|
|||
|
|
|||
|
粒子特效:粒子由ParticleData和MaterialBase两个数据生成,我们可以自定义一个粒子,或者通过插件来导出Unity中的粒子特效。
|
|||
|
|
|||
|
* 自定义ParticleData,即手动编写代码生成一个粒子(注:你需要准备好一个材质球数据)
|
|||
|
|
|||
|
----------
|
|||
|
//创建一个粒子特效
|
|||
|
private createParticle():void{
|
|||
|
var material: MaterialBase = this.createMaterial();
|
|||
|
var particleData: ParticleData = this.createParticleData();
|
|||
|
this.particle = new ParticleEmitter(particleData, material);
|
|||
|
this.particle.play();
|
|||
|
this.view1.addChild3D(this.particle);
|
|||
|
}
|
|||
|
|
|||
|
//创建一个粒子数据
|
|||
|
private createParticleData(): ParticleData {
|
|||
|
var data: ParticleData = new ParticleData();
|
|||
|
data.geometry.planeW = data.geometry.planeH = 30;
|
|||
|
|
|||
|
|
|||
|
var life: ParticleDataLife = data.life;
|
|||
|
life.max = 6;
|
|||
|
life.min = 6;
|
|||
|
life.duration = 5;
|
|||
|
life.delay = 0.5;
|
|||
|
life.loop = true;
|
|||
|
|
|||
|
var emission: ParticleDataEmission = data.emission;
|
|||
|
emission.rate = 2;
|
|||
|
|
|||
|
var property: ParticleDataProperty = data.property;
|
|||
|
property.particleCount = 100;
|
|||
|
property.renderMode = ParticleRenderModeType.StretchedBillboard;
|
|||
|
property.colorConst1.setTo(255, 255, 255, 255);
|
|||
|
property.colorConst2.setTo(255, 255, 255, 255);
|
|||
|
property.gravity = 5;
|
|||
|
|
|||
|
var speed: ParticleDataMoveSpeed = data.moveSpeed;
|
|||
|
speed.max = 50;
|
|||
|
speed.min = 50;
|
|||
|
|
|||
|
var velocityOver: VelocityOverLifeTimeData = new VelocityOverLifeTimeData();
|
|||
|
speed.velocityOver = velocityOver;
|
|||
|
speed.velocityOver.type = ParticleValueType.OneBezier;
|
|||
|
|
|||
|
var xBezier: BezierData = new BezierData();
|
|||
|
xBezier.posPoints.push(new Point(0, 0));
|
|||
|
xBezier.posPoints.push(new Point(0.5, 20));
|
|||
|
xBezier.posPoints.push(new Point(0.5, 20));
|
|||
|
xBezier.posPoints.push(new Point(1.0, 8));
|
|||
|
|
|||
|
xBezier.ctrlPoints.push(new Point(0, 10));
|
|||
|
xBezier.ctrlPoints.push(new Point(0.55, 20));
|
|||
|
xBezier.ctrlPoints.push(new Point(0.55, 20));
|
|||
|
xBezier.ctrlPoints.push(new Point(1.0, 8));
|
|||
|
|
|||
|
speed.velocityOver.xBezier1 = xBezier;
|
|||
|
|
|||
|
var yBezier: BezierData = new BezierData();
|
|||
|
yBezier.posPoints.push(new Point(0, 0));
|
|||
|
yBezier.posPoints.push(new Point(0.7, 40));
|
|||
|
yBezier.posPoints.push(new Point(0.7, 40));
|
|||
|
yBezier.posPoints.push(new Point(1.0, 16));
|
|||
|
|
|||
|
yBezier.ctrlPoints.push(new Point(0, 10));
|
|||
|
yBezier.ctrlPoints.push(new Point(0.75, 40));
|
|||
|
yBezier.ctrlPoints.push(new Point(0.76, 40));
|
|||
|
yBezier.ctrlPoints.push(new Point(1.0, 20));
|
|||
|
speed.velocityOver.yBezier1 = yBezier;
|
|||
|
|
|||
|
var zBezier: BezierData = new BezierData();
|
|||
|
zBezier.posPoints.push(new Point(0, 0));
|
|||
|
zBezier.posPoints.push(new Point(1, 0));
|
|||
|
zBezier.ctrlPoints.push(new Point(0, 0));
|
|||
|
zBezier.ctrlPoints.push(new Point(1, 0));
|
|||
|
speed.velocityOver.zBezier1 = zBezier;
|
|||
|
|
|||
|
|
|||
|
var colorOffset: ParticleDataColorOffset = new ParticleDataColorOffset();
|
|||
|
data.colorOffset = colorOffset;
|
|||
|
colorOffset.data.colors.push(new Color(255.0, 0.0, 0.0, 255.0));
|
|||
|
colorOffset.data.colors.push(new Color(0.0, 255.0, 0.0, 255.0));
|
|||
|
colorOffset.data.colors.push(new Color(0.0, 0.0, 255.0, 255.0));
|
|||
|
colorOffset.data.colors.push(new Color(0.0, 255.0, 0.0, 255.0));
|
|||
|
colorOffset.data.colors.push(new Color(255.0, 0.0, 0.0, 128.0));
|
|||
|
colorOffset.data.colors.push(new Color(255.0, 0.0, 0.0, 0.0));
|
|||
|
colorOffset.data.times.push(0.0);
|
|||
|
colorOffset.data.times.push(0.2);
|
|||
|
colorOffset.data.times.push(0.4);
|
|||
|
colorOffset.data.times.push(0.6);
|
|||
|
colorOffset.data.times.push(0.7);
|
|||
|
colorOffset.data.times.push(1.0);
|
|||
|
|
|||
|
var sizeBezier: ParticleDataScaleBezier = new ParticleDataScaleBezier();
|
|||
|
data.scaleBezier = sizeBezier;
|
|||
|
|
|||
|
sizeBezier.data.posPoints.push(new Point(0, 0));
|
|||
|
sizeBezier.data.posPoints.push(new Point(0.4, 2));
|
|||
|
sizeBezier.data.posPoints.push(new Point(0.4, 2));
|
|||
|
sizeBezier.data.posPoints.push(new Point(1.0, 0.2));
|
|||
|
|
|||
|
sizeBezier.data.ctrlPoints.push(new Point(0, 1));
|
|||
|
sizeBezier.data.ctrlPoints.push(new Point(0.3, 2));
|
|||
|
sizeBezier.data.ctrlPoints.push(new Point(0.6, 2));
|
|||
|
sizeBezier.data.ctrlPoints.push(new Point(1.0, 0.2));
|
|||
|
|
|||
|
data.validate();
|
|||
|
return data;
|
|||
|
}
|
|||
|
|
|||
|
//创建一个材质球
|
|||
|
private createMaterial(): MaterialBase {
|
|||
|
var mat: TextureMaterial = new TextureMaterial();
|
|||
|
mat.bothside = true;
|
|||
|
mat.ambientColor = 0xffffff;
|
|||
|
mat.blendMode = BlendMode.ADD;
|
|||
|
return mat;
|
|||
|
}
|
|||
|
|
|||
|
显示结果如图:
|
|||
|
|
|||
|
![](Img_0.png)
|
|||
|
|
|||
|
----------
|
|||
|
|