Unity3D-代码控制粒子移动或者按照预定的路径移动(ParticleSystem)

参考:http://blog.csdn.net/pz789as/article/details/54573621

 

今天在做项目中,发现很多时候我们需要做一个金币移动效果。

比如,点击某个按钮之后,按钮附近出现各种零散的金币,然后他们都会向着显示金币的框框飞。

一般如果按钮都是固定的话,那么可以直接使用一个例子系统,然后调整好方向和速度,就可以达到要求!但是呢,有时候我们需要在很多地方都会使用这个效果。

一开始,我也是打算自己写一个类去自动生成一个个的小Image,然后里面加逻辑去控制他们移动。后面写到一半,感觉实在太费事了,为什么就不能控制粒子系统里面粒子移动呢?

于是在官方文档看到这个控制粒子属性的方法,还挺方便的,在这里贴一下。

自己写了一个类去控制,不用去记录粒子的位置,可是省了很多麻烦哦~

 

[RequireComponent(typeof(ParticleSystem))]
public class ParMove : MonoBehaviour {
	ParticleSystem par;
	ParticleSystem.Particle[] arrPar;
	int arrCount = 0;
	public RectTransform target;//指向要移动的目的
	public float speed = 0.1f;
	void Awake()
	{
		par = GetComponent<ParticleSystem>();
		arrPar = new ParticleSystem.Particle[par.main.maxParticles];
	}
	void Update () {
		if (target && par && par.isPlaying){
			arrCount = par.GetParticles(arrPar);//获取到当前激活的粒子
			Vector3 pos = Vector3.zero;
			for(var i=0;i<arrCount;i++){
				arrPar[i].position = Vector3.Lerp(arrPar[i].position, pos, speed);//设置他们的位置
			}
			par.SetParticles(arrPar, arrCount);//再把更新过的粒子数据设置回去
		}
	}
	public void Play(){
		if (par.isStopped){
			par.Play(true);//供外边调用
		}
	}
}

 

 

 

我加了一个target指向移动目的地,开始不知道怎么回事,移动的老是不对,这是因为他们的坐标系不同,所以需要转换一下。

我这里后面再次加了一个设置Target的函数,然后在里面做了设置,主要是将粒子生成的空间改成和target是一样的,这样就只要让粒子都移动到0,0,0的位置就可以了

 

public void SetTarget(RectTransform transform){
		target = transform;
		ParticleSystem.MainModule module = par.main;//更改生成的空间,使用自定义的
		module.simulationSpace = ParticleSystemSimulationSpace.Custom;
		module.customSimulationSpace = transform;//把target设置给它
	}
	public void Play(RectTransform transform){//新加了一个play,可以根据不同需求去设置并且播放。
		SetTarget(transform);
		Play();
	}


这些都做好之后,我后面还加了一个碰撞区域,是用来让粒子产生碰撞,自动消失的。想想粒子飞到金币框之后,是不是要让他消失呢,所以需要在target对象上面添加一个box collider 2d组件,不然粒子会超过金币框,知道它的生命时间终结为止哦。

 

最后把粒子系统的Trigger打上勾,如下图所示:

Colliders 要设置成金币框,这个其实也可以在代码中设置,我是都固定飞往一个地方,所以直接在编辑器中设置了。

好了,到此,本效果就新鲜出炉啦~

看看效果,金币不会超过哟~它们会在碰到框框之后消失,因为上面我选择的是Kill。

3D粒子爱心动画可以使用WebGL和Three.js库来实现。以下是一个简单的示例代码,用于创建一个3D粒子爱心动画。 HTML部分: ``` <!DOCTYPE html> <html> <head> <title>3D Particle Heart Animation</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script> </head> <body> <canvas id="canvas"></canvas> <script src="particle_heart.js"></script> </body> </html> ``` JS部分(particle_heart.js): ``` // 创建场景 var scene = new THREE.Scene(); // 创建渲染器 var renderer = new THREE.WebGLRenderer({ canvas: document.getElementById("canvas"), antialias: true }); // 设置渲染器大小 renderer.setSize(window.innerWidth, window.innerHeight); // 创建摄像机 var camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 10000 ); camera.position.set(0, 0, 1000); // 创建粒子材质 var material = new THREE.PointsMaterial({ color: "red", size: 10 }); // 创建粒子系统 var geometry = new THREE.Geometry(); var particleCount = 2000; for (var i = 0; i < particleCount; i++) { var x = Math.random() * 2000 - 1000; var y = Math.random() * 2000 - 1000; var z = Math.random() * 2000 - 1000; var particle = new THREE.Vector3(x, y, z); geometry.vertices.push(particle); } // 将粒子系统添加到场景中 var particles = new THREE.Points(geometry, material); scene.add(particles); // 渲染场景 function render() { requestAnimationFrame(render); particles.rotation.x += 0.001; particles.rotation.y += 0.001; renderer.render(scene, camera); } render(); ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏小败在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值