Files
HX_MapEditor/Assets/Effect/Shader/ParticleMove.cs

200 lines
6.3 KiB
C#
Raw Permalink Normal View History

2025-06-14 13:46:24 +08:00
//using Assets.Script.Base;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(ParticleSystem))]
public class ParticleMove : MonoBehaviour
{
[Tooltip("移动类型point为到目标位置Circle为绕目标旋转")]
public MoveTypeEnum MoveType;
[Tooltip("point时为目标位置Circle时为圆心点")]
public Transform TargetPosition;
[Tooltip("角度为90270分别顺逆时间转")]
[Range(0, 360)]
public float P = 1;
public float MoveTime;
private float Speed;
float Distance;
ParticleSystem particleSys;
ParticleSystem.Particle[] particleArray;
public enum MoveTypeEnum
{
Point,
Circle
//以后需要啥加啥先这2种
}
void Start()
{
particleSys = GetComponent<ParticleSystem>();
if (particleArray == null || particleArray.Length < particleSys.main.maxParticles)
particleArray = new ParticleSystem.Particle[particleSys.main.maxParticles];
//////Debug.Log((P2 - P1).magnitude);
}
void LateUpdate()
{
//if (TargetPosition == null)
//{
// if (m_Target != null)
// {
// TargetPosition = m_Target.transform;
// }
//}
if (TargetPosition != null)
{
MoveFunc();
}
}
void MoveFunc()
{
var numParticlesAlive = particleSys.GetParticles(particleArray);
for (int i = 0; i < numParticlesAlive; i++)
{
if (particleSys.shape.shapeType == ParticleSystemShapeType.SkinnedMeshRenderer || particleSys.shape.shapeType == ParticleSystemShapeType.MeshRenderer)
{
MainMoveFuncByMesh(i);
}
else
{
MainMoveFunc(i);
}
}
particleSys.SetParticles(particleArray, numParticlesAlive);
}
void MainMoveFunc(int i)
{
if (MoveType == MoveTypeEnum.Point)
{
if (particleSys.main.simulationSpace == ParticleSystemSimulationSpace.Local)
{
//realyPos.position = transform.TransformPoint(particleArray[i].position);
Vector3 normalize = (transform.InverseTransformPoint(TargetPosition.position) - particleArray[i].position).normalized;
Distance = (transform.InverseTransformPoint(TargetPosition.position) - particleArray[i].position).magnitude;
Speed = Distance / MoveTime;
// particleArray[i].position = new Vector3(particleArray[i].position.x*normalize.x, particleArray[i].position.y * normalize.z, particleArray[i].position.z * normalize.y) * Speed ;
particleArray[i].position += normalize * Speed;
}
if (particleSys.main.simulationSpace == ParticleSystemSimulationSpace.World)
{
movePointByWorld(i);
}
}
if (MoveType == MoveTypeEnum.Circle)
{
if (particleSys.main.simulationSpace == ParticleSystemSimulationSpace.Local)
{
Vector3 normalize = (transform.InverseTransformPoint(TargetPosition.position) - particleArray[i].position).normalized;
Distance = (transform.InverseTransformPoint(TargetPosition.position) - particleArray[i].position).magnitude;
Speed = Distance / MoveTime;
Vector2 v21 = RotationMatrix(new Vector2(normalize.x, normalize.y), P);
particleArray[i].position += new Vector3(v21.x, v21.y, normalize.z) * Speed;
}
if (particleSys.main.simulationSpace == ParticleSystemSimulationSpace.World)
{
moveCircleByWorld(i);
}
}
}
void MainMoveFuncByMesh(int i)
{
if (MoveType == MoveTypeEnum.Point)
{
if (particleSys.main.simulationSpace == ParticleSystemSimulationSpace.Local)
{
//particleSys.simulationSpace = ParticleSystemSimulationSpace.World;
ParticleSystem.MainModule mainModule = particleSys.main;
mainModule.simulationSpace = ParticleSystemSimulationSpace.World;
}
if (particleSys.main.simulationSpace == ParticleSystemSimulationSpace.World)
{
movePointByWorld(i);
}
}
if (MoveType == MoveTypeEnum.Circle)
{
if (particleSys.main.simulationSpace == ParticleSystemSimulationSpace.Local)
{
//particleSys.simulationSpace = ParticleSystemSimulationSpace.World;
ParticleSystem.MainModule mainModule = particleSys.main;
mainModule.simulationSpace = ParticleSystemSimulationSpace.World;
}
if (particleSys.main.simulationSpace == ParticleSystemSimulationSpace.World)
{
moveCircleByWorld(i);
}
}
}
void moveCircleByWorld(int i)
{
Vector3 normalize = (TargetPosition.position - particleArray[i].position).normalized;
Distance = (TargetPosition.position - particleArray[i].position).magnitude;
Speed = Distance / MoveTime;
Vector2 v21 = RotationMatrix(new Vector2(normalize.x, normalize.z), P);
particleArray[i].position += new Vector3(v21.x, normalize.y, v21.y) * Speed;
}
void movePointByWorld(int i)
{
//这行只是测试初始点位置用的
//realyPos.position = transform.InverseTransformPoint(particleArray[i].position).normalized;
Vector3 Devil = TargetPosition.position - particleArray[i].position;
if (Mathf.Abs(Devil.x) >= 0.01f && Mathf.Abs(Devil.y) >= 0.01f && Mathf.Abs(Devil.z) >= 0.01f)
{
Vector3 normalize = Devil.normalized;
Distance = (TargetPosition.position - particleArray[i].position).magnitude;
Speed = Distance / MoveTime;
particleArray[i].position += normalize * Speed;
}
}
private Vector2 RotationMatrix(Vector2 v, float angle)
{
var x = v.x;
var y = v.y;
var sin = Mathf.Sin(Mathf.PI * angle / 180);
var cos = Mathf.Cos(Mathf.PI * angle / 180);
var newX = x * cos + y * sin;
var newY = x * -sin + y * cos;
return new Vector2((float)newX, (float)newY);
}
}