要从中发射粒子的形状的类型。
using UnityEngine; using System; using System.Collections; using System.Collections.Generic;
public class ExampleClass : MonoBehaviour { private ParticleSystem ps; public ParticleSystemShapeType shapeType = ParticleSystemShapeType.Cone; private int shapeTypeIndex = 2; public float arc = 360.0f; public ParticleSystemShapeMultiModeValue arcMode = ParticleSystemShapeMultiModeValue.Random; public float arcSpread = 0.0f; public float arcSpeed = 1.0f; public float angle = 25.0f; public float radius = 1.0f; public float radiusThickness = 1.0f; public ParticleSystemShapeMultiModeValue radiusMode = ParticleSystemShapeMultiModeValue.Random; public float radiusSpread = 0.0f; public float radiusSpeed = 1.0f; public float donutRadius = 0.2f; public float length = 2.0f; public Vector3 boxThickness = new Vector3(0.0f, 0.0f, 0.0f); public ParticleSystemMeshShapeType meshShapeType; public float normalOffset = 0.0f; public float randomizeDirection = 0.0f; public float spherizeDirection = 0.0f; public float randomizePosition = 0.0f; public Vector3 position = new Vector3(0.0f, 0.0f, 0.0f); public Vector3 rotation = new Vector3(0.0f, 0.0f, 0.0f); public Vector3 scale = new Vector3(1.0f, 1.0f, 1.0f);
void Start() { ps = GetComponent<ParticleSystem>();
var main = ps.main; main.startSpeed = 0.1f; main.startSize = 0.1f; main.startLifetime = 1.0f;
var emission = ps.emission; emission.rateOverTime = 500.0f;
var shape = ps.shape; shape.mesh = Resources.GetBuiltinResource<Mesh>("Capsule.fbx"); }
void Update() { var shape = ps.shape; shape.shapeType = shapeType; shape.arc = arc; shape.arcMode = arcMode; shape.arcSpread = arcSpread; shape.arcSpeed = arcSpeed; shape.angle = angle; shape.radius = radius; shape.radiusMode = radiusMode; shape.radiusSpread = radiusSpread; shape.radiusSpeed = radiusSpeed; shape.radiusThickness = radiusThickness; shape.donutRadius = donutRadius; shape.length = length; shape.boxThickness = boxThickness; shape.meshShapeType = meshShapeType; shape.normalOffset = normalOffset; shape.randomDirectionAmount = randomizeDirection; shape.sphericalDirectionAmount = spherizeDirection; shape.randomPositionAmount = randomizePosition; shape.position = position; shape.rotation = rotation; shape.scale = scale; }
void OnGUI() { List<GUIContent> content = new List<GUIContent>(); for (int i = 0; i < (int)ParticleSystemShapeType.Donut + 1; i++) { ParticleSystemShapeType currentShapeType = (ParticleSystemShapeType)i; var obsoleteAttribute = Attribute.GetCustomAttribute(currentShapeType.GetType().GetField(currentShapeType.ToString()), typeof(ObsoleteAttribute), false); // skip the obsolete shape types if (obsoleteAttribute == null) content.Add(new GUIContent(currentShapeType.ToString(), i.ToString())); } shapeTypeIndex = GUI.SelectionGrid(new Rect(25, 25, 1000, 80), shapeTypeIndex, content.ToArray(), content.Count / 3); shapeType = (ParticleSystemShapeType)int.Parse(content[shapeTypeIndex].tooltip);
float y = 120.0f; float spacing = 40.0f;
if (shapeType == ParticleSystemShapeType.Sphere || shapeType == ParticleSystemShapeType.Hemisphere) { GUI.Label(new Rect(25, y, 140, 30), "Radius"); radius = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), radius, 1.0f, 5.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Radius Thickness"); radiusThickness = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), radiusThickness, 0.0f, 1.0f); y += spacing; }
if (shapeType == ParticleSystemShapeType.Cone || shapeType == ParticleSystemShapeType.ConeVolume) { GUI.Label(new Rect(25, y, 140, 30), "Angle"); angle = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), angle, 1.0f, 90.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Radius"); radius = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), radius, 0.2f, 5.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Radius Thickness"); radiusThickness = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), radiusThickness, 0.0f, 1.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Arc"); arc = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), arc, 1.0f, 360.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Arc Mode"); arcMode = (ParticleSystemShapeMultiModeValue)GUI.SelectionGrid(new Rect(165, 280, 360, 20), (int)arcMode, new GUIContent[] { new GUIContent("Random"), new GUIContent("Loop"), new GUIContent("Ping-Pong"), new GUIContent("Burst Spread") }, 4); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Arc Spread"); arcSpread = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), arcSpread, 0.0f, 1.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Arc Speed"); arcSpeed = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), arcSpeed, 0.0f, 2.0f); y += spacing;
if (shapeType == ParticleSystemShapeType.ConeVolume) { GUI.Label(new Rect(25, y, 140, 30), "Length"); length = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), length, 1.0f, 5.0f); y += spacing; } }
if (shapeType == ParticleSystemShapeType.Box || shapeType == ParticleSystemShapeType.BoxShell || shapeType == ParticleSystemShapeType.BoxEdge) { if (shapeType == ParticleSystemShapeType.BoxShell || shapeType == ParticleSystemShapeType.BoxEdge) { GUI.Label(new Rect(25, y, 140, 30), "Box Thickness"); boxThickness.x = GUI.HorizontalSlider(new Rect(165, y + 5, 50, 30), boxThickness.x, 0.0f, 1.0f); boxThickness.y = GUI.HorizontalSlider(new Rect(220, y + 5, 50, 30), boxThickness.y, 0.0f, 1.0f); boxThickness.z = GUI.HorizontalSlider(new Rect(275, y + 5, 50, 30), boxThickness.z, 0.0f, 1.0f); y += spacing; } }
if (shapeType == ParticleSystemShapeType.Donut) { GUI.Label(new Rect(25, y, 140, 30), "Arc"); arc = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), arc, 1.0f, 360.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Arc Mode"); arcMode = (ParticleSystemShapeMultiModeValue)GUI.SelectionGrid(new Rect(165, y, 360, 20), (int)arcMode, new GUIContent[] { new GUIContent("Random"), new GUIContent("Loop"), new GUIContent("Ping-Pong"), new GUIContent("Burst Spread") }, 4); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Arc Spread"); arcSpread = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), arcSpread, 0.0f, 1.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Arc Speed"); arcSpeed = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), arcSpeed, 0.0f, 2.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Radius"); radius = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), radius, 0.2f, 5.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Radius Thickness"); radiusThickness = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), radiusThickness, 0.0f, 1.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Donut Radius"); donutRadius = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), donutRadius, 0.0f, 5.0f); y += spacing; }
if (shapeType == ParticleSystemShapeType.Circle) { GUI.Label(new Rect(25, y, 140, 30), "Arc"); arc = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), arc, 1.0f, 360.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Arc Mode"); arcMode = (ParticleSystemShapeMultiModeValue)GUI.SelectionGrid(new Rect(165, y, 360, 20), (int)arcMode, new GUIContent[] { new GUIContent("Random"), new GUIContent("Loop"), new GUIContent("Ping-Pong"), new GUIContent("Burst Spread") }, 4); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Arc Spread"); arcSpread = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), arcSpread, 0.0f, 1.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Arc Speed"); arcSpeed = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), arcSpeed, 0.0f, 2.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Radius"); radius = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), radius, 0.2f, 5.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Radius Thickness"); radiusThickness = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), radiusThickness, 0.0f, 1.0f); y += spacing; }
if (shapeType == ParticleSystemShapeType.SingleSidedEdge) { GUI.Label(new Rect(25, y, 140, 30), "Radius"); radius = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), radius, 0.2f, 5.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Radius Mode"); radiusMode = (ParticleSystemShapeMultiModeValue)GUI.SelectionGrid(new Rect(165, y, 360, 20), (int)radiusMode, new GUIContent[] { new GUIContent("Random"), new GUIContent("Loop"), new GUIContent("Ping-Pong"), new GUIContent("Burst Spread") }, 4); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Radius Spread"); radiusSpread = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), radiusSpread, 0.0f, 1.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Radius Speed"); radiusSpeed = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), radiusSpeed, 0.0f, 2.0f); y += spacing; }
if (shapeType == ParticleSystemShapeType.Mesh) { meshShapeType = (ParticleSystemMeshShapeType)GUI.SelectionGrid(new Rect(25, y + 5, 300, 20), (int)meshShapeType, new GUIContent[] { new GUIContent("Vertex"), new GUIContent("Edge"), new GUIContent("Polygon") }, 3); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Normal Offset"); normalOffset = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), normalOffset, -3.0f, 3.0f); y += spacing; }
GUI.Label(new Rect(25, y, 140, 30), "Randomize Direction"); randomizeDirection = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), randomizeDirection, 0.0f, 1.0f); y += spacing;
if (shapeType != ParticleSystemShapeType.Sphere) { GUI.Label(new Rect(25, y, 140, 30), "Spherize Direction"); spherizeDirection = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), spherizeDirection, 0.0f, 1.0f); y += spacing; }
GUI.Label(new Rect(25, y, 140, 30), "Randomize Position"); randomizePosition = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), randomizePosition, 0.0f, 1.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Position"); position.x = GUI.HorizontalSlider(new Rect(165, y + 5, 50, 30), position.x, -2.0f, 2.0f); position.y = GUI.HorizontalSlider(new Rect(220, y + 5, 50, 30), position.y, -2.0f, 2.0f); position.z = GUI.HorizontalSlider(new Rect(275, y + 5, 50, 30), position.z, -2.0f, 2.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Rotation"); rotation.x = GUI.HorizontalSlider(new Rect(165, y + 5, 50, 30), rotation.x, 0.0f, 360.0f); rotation.y = GUI.HorizontalSlider(new Rect(220, y + 5, 50, 30), rotation.y, 0.0f, 360.0f); rotation.z = GUI.HorizontalSlider(new Rect(275, y + 5, 50, 30), rotation.z, 0.0f, 360.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Scale"); scale.x = GUI.HorizontalSlider(new Rect(165, y + 5, 50, 30), scale.x, 0.0f, 3.0f); scale.y = GUI.HorizontalSlider(new Rect(220, y + 5, 50, 30), scale.y, 0.0f, 3.0f); scale.z = GUI.HorizontalSlider(new Rect(275, y + 5, 50, 30), scale.z, 0.0f, 3.0f); y += spacing; } }