简单的unity脚本
粒子光环空父物体的子物体挂一个粒子,然后挂这个脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ParticleHalo : MonoBehaviour
{
private ParticleSystem particleSys; // 粒子系统
private ParticleSystem.Particle[] particleArr; // 粒子数组
private CirclePosition[] circle; // 极坐标数组
public int count = 10000; // 粒子数量
public float size = 0.03f; // 粒子大小
public float minRadius = 1.0f; // 最小半径
private float oldMinRadius;
public float maxRadius = 2.0f; // 最大半径
private float oldMaxRadius;
public bool clockwise = true; // 顺时针|逆时针
public float speed = 2f; // 速度
public float pingPong = 0.00001f; // 游离范围
// Start is called before the first frame update
private Mesh mesh;
int meshVerCount = 0;
void Start()
{
particleArr = new ParticleSystem.Particle[count];
circle = new CirclePosition[count];
// 初始化粒子系统
//particleSys = this.GetComponent<ParticleSystem>();
particleSys = this.GetComponentsInChildren<ParticleSystem>()[0];
var main = particleSys.main;
main.startSpeed = 0; // 粒子位置由程序控制
main.startSize = size; // 设置粒子大小
main.loop = false;
main.maxParticles = count; // 设置最大粒子量
particleSys.Emit(count); // 发射粒子
particleSys.GetParticles(particleArr);
// particleSys.trails.enabled.Equals(true);
// particleSys.trails.
oldMinRadius = minRadius;
oldMaxRadius = maxRadius;
//mesh = this.GetComponent<MeshFilter>().mesh;
//mesh = this.GetComponentInChildren<MeshFilter>().mesh;
RandomlySpread(); // 初始化各粒子位置
}
// Update is called once per frame
private int tier = 10; // 速度差分层数
void Update()
{
//RandomlySpread();
if(isChanged())
{
RandomlySpread();
oldMinRadius = minRadius;
oldMaxRadius = maxRadius;
}
// mesh = this.GetComponentInChildren<MeshFilter>().mesh;
// meshVerCount = mesh.vertexCount;
for (int i = 0; i < count; i++)
{
if(i < meshVerCount){
//下标靠前的粒子吸附到mesh的顶点上
particleArr[i].position = mesh.vertices[i];
}else{
//光环
if (clockwise) // 顺时针旋转
//circle[i].angle -= 0.1f;
circle[i].angle -= (i % tier + 1) * (speed / circle[i].radius / tier);
else // 逆时针旋转
//circle[i].angle += 0.1f;
circle[i].angle += (i % tier + 1) * (speed / circle[i].radius / tier);
// 粒子在半径方向上游离
circle[i].time += Time.deltaTime;
circle[i].radius += Mathf.PingPong(circle[i].time / minRadius / maxRadius, pingPong) - pingPong / 2.0f;
// 保证angle在0~360度
circle[i].angle = (360.0f + circle[i].angle) % 360.0f;
float theta = circle[i].angle / 180 * Mathf.PI;
particleArr[i].position = new Vector3(circle[i].radius * Mathf.Cos(theta), 0f, circle[i].radius * Mathf.Sin(theta));
}
}
particleSys.SetParticles(particleArr, particleArr.Length);
}
void RandomlySpread()
{
for (int i = 0; i < count; ++i)
{ // 随机每个粒子距离中心的半径,同时希望粒子集中在平均半径附近
float midRadius = (maxRadius + minRadius) / 2;
float minRate = Random.Range(1.0f, midRadius / minRadius);
float maxRate = Random.Range(midRadius / maxRadius, 1.0f);
float radius = Random.Range(minRadius * minRate, maxRadius * maxRate);
// 随机每个粒子的角度
float angle = Random.Range(0.0f, 360.0f);
float theta = angle / 180 * Mathf.PI;
// 随机每个粒子的游离起始时间
float time = Random.Range(0.0f, 360.0f);
circle[i] = new CirclePosition(radius, angle, time);
particleArr[i].position = new Vector3(circle[i].radius * Mathf.Cos(theta), 0f, circle[i].radius * Mathf.Sin(theta));
}
particleSys.SetParticles(particleArr, particleArr.Length);
}
public bool isChanged()
{
if(oldMinRadius == minRadius && oldMaxRadius == maxRadius)
return false;
return true;
}
}
public class CirclePosition
{
public float radius = 0f, angle = 0f, time = 0f;
public CirclePosition(float radius, float angle, float time)
{
this.radius = radius; // 半径
this.angle = angle; // 角度
this.time = time; // 时间
}
}
球体按父节点中心向外破碎,父物体有子物体,子物体按父物体中心向外扩散
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BallBroken : MonoBehaviour
{
///[Header("nihhhhh")]
public List<Transform> trans;
public float speed = 0.1f;
public float fillTime = 1.0f;
public float myTick =0.0f;
public bool isv;
//Vector3[] tagetPos;
//Vector3[] startPos;
public List<Vector3> basePos;
public List<Vector3> startPos;
public List<Vector3> tagetPos;
//Time time;
// Start is called before the first frame update
void Start()
{
//mesh = this.GetComponent<MeshFilter>().mesh;
trans =new List<Transform>();
for(int i=1;i<this.GetComponentsInChildren<Transform>().Length;i++)
{
trans.Add(this.GetComponentsInChildren<Transform>()[i]);
}
basePos = new List<Vector3>();
startPos = new List<Vector3>();
tagetPos = new List<Vector3>();
for(int i = 0; i < trans.Count; i++){
basePos.Add(trans[i].localPosition);
startPos.Add(trans[i].localPosition);
tagetPos.Add(trans[i].localPosition + trans[i].localPosition);
}
}
// Update is called once per frame
void Update()
{
for(int i = 0; i < trans.Count; i++)
{
trans[i].localPosition = Vector3.Lerp(startPos[i],tagetPos[i],Mathf.Sin(Time.time));
}
}
}

浙公网安备 33010602011771号