简单的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));
        }
    }
}
posted @ 2020-09-19 10:51  Victor2k  阅读(202)  评论(0)    收藏  举报