UnityEngine 中的类
/
继承自:Behaviour
/
实现于:UnityEngine.ParticleSystemModule
粒子系统力场的脚本接口。
粒子系统力场可以用来影响进入每个力场影响区域的粒子组。
力场形状可以设置为多种形状,力场中各种属性控制粒子如何受到影响。
作为选择形状的一部分,您可以定义开始范围和结束范围。结束范围描述了形状的最大范围,开始范围可以用来创建空心形状。
可以对位于此体积内的粒子施加多种力:方向力、重力、旋转力、阻力和矢量场。
每种力类型的设置使用 MinMaxCurve 类型,该类型也用于粒子系统。这种类型允许您设置简单的统一值,或更复杂的值,这些值随每个粒子而变化,并在每个粒子的生命周期内变化。
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine;
[RequireComponent(typeof(ParticleSystem))] public class ExampleClass : MonoBehaviour { public ParticleSystemForceFieldShape m_Shape = ParticleSystemForceFieldShape.Sphere; public float m_StartRange = 0.0f; public float m_EndRange = 3.0f; public Vector3 m_Direction = Vector3.zero; public float m_Gravity = 0.0f; public float m_GravityFocus = 0.0f; public float m_RotationSpeed = 0.0f; public float m_RotationAttraction = 0.0f; public Vector2 m_RotationRandomness = Vector2.zero; public float m_Drag = 0.0f; public bool m_MultiplyDragByParticleSize = false; public bool m_MultiplyDragByParticleVelocity = false;
private ParticleSystemForceField m_ForceField;
void Start() { // Create a Force Field var go = new GameObject("ForceField", typeof(ParticleSystemForceField)); go.transform.position = new Vector3(0, 2, 0); go.transform.rotation = Quaternion.Euler(new Vector3(90.0f, 0.0f, 0.0f));
m_ForceField = go.GetComponent<ParticleSystemForceField>();
// Configure Particle System transform.position = new Vector3(0, -4, 0); transform.rotation = Quaternion.identity; var ps = GetComponent<ParticleSystem>();
var main = ps.main; main.startSize = new ParticleSystem.MinMaxCurve(0.05f, 0.2f); main.startSpeed = new ParticleSystem.MinMaxCurve(1.5f, 2.5f); main.maxParticles = 100000;
var emission = ps.emission; emission.rateOverTime = 0.0f; emission.burstCount = 1; emission.SetBurst(0, new ParticleSystem.Burst(0.0f, 200, 200, -1, 0.1f));
var shape = ps.shape; shape.shapeType = ParticleSystemShapeType.SingleSidedEdge; shape.radius = 5.0f; shape.radiusMode = ParticleSystemShapeMultiModeValue.BurstSpread; shape.randomPositionAmount = 0.1f; shape.randomDirectionAmount = 0.05f;
var forces = ps.externalForces; forces.enabled = true; }
void Update() { m_ForceField.shape = m_Shape; m_ForceField.startRange = m_StartRange; m_ForceField.endRange = m_EndRange; m_ForceField.directionX = m_Direction.x; m_ForceField.directionY = m_Direction.y; m_ForceField.directionZ = m_Direction.z; m_ForceField.gravity = m_Gravity; m_ForceField.gravityFocus = m_GravityFocus; m_ForceField.rotationSpeed = m_RotationSpeed; m_ForceField.rotationAttraction = m_RotationAttraction; m_ForceField.rotationRandomness = m_RotationRandomness; m_ForceField.drag = m_Drag; m_ForceField.multiplyDragByParticleSize = m_MultiplyDragByParticleSize; m_ForceField.multiplyDragByParticleVelocity = m_MultiplyDragByParticleVelocity; }
void OnGUI() { GUIContent[] shapeLabels = Enum.GetNames(typeof(ParticleSystemForceFieldShape)).Select(n => new GUIContent(n)).ToArray(); m_Shape = (ParticleSystemForceFieldShape)GUI.SelectionGrid(new Rect(25, 25, 400, 25), (int)m_Shape, shapeLabels, 4);
float y = 80.0f; float spacing = 40.0f;
GUI.Label(new Rect(25, y, 140, 30), "Start Range"); m_StartRange = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), m_StartRange, 0.0f, 2.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "End Range"); m_EndRange = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), m_EndRange, 2.0f, 3.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Direction"); m_Direction.x = GUI.HorizontalSlider(new Rect(165, y + 5, 40, 30), m_Direction.x, -1.0f, 1.0f); m_Direction.y = GUI.HorizontalSlider(new Rect(210, y + 5, 40, 30), m_Direction.y, -1.0f, 1.0f); m_Direction.z = GUI.HorizontalSlider(new Rect(255, y + 5, 40, 30), m_Direction.z, -1.0f, 1.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Gravity"); m_Gravity = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), m_Gravity, -0.05f, 0.05f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Gravity Focus"); m_GravityFocus = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), m_GravityFocus, 0.0f, 1.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Rotation Speed"); m_RotationSpeed = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), m_RotationSpeed, -10.0f, 10.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Rotation Attraction"); m_RotationAttraction = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), m_RotationAttraction, 0.0f, 0.01f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Rotation Randomness"); m_RotationRandomness.x = GUI.HorizontalSlider(new Rect(165, y + 5, 60, 30), m_RotationRandomness.x, 0.0f, 1.0f); m_RotationRandomness.y = GUI.HorizontalSlider(new Rect(230, y + 5, 60, 30), m_RotationRandomness.y, 0.0f, 1.0f); y += spacing;
GUI.Label(new Rect(25, y, 140, 30), "Drag"); m_Drag = GUI.HorizontalSlider(new Rect(165, y + 5, 100, 30), m_Drag, 0.0f, 20.0f); y += spacing;
m_MultiplyDragByParticleSize = GUI.Toggle(new Rect(25, y, 220, 30), m_MultiplyDragByParticleSize, "Multiply Drag by Particle Size"); y += spacing;
m_MultiplyDragByParticleVelocity = GUI.Toggle(new Rect(25, y, 220, 30), m_MultiplyDragByParticleVelocity, "Multiply Drag by Particle Velocity"); y += spacing; } }
directionX | 沿着局部 X 轴对力场体积内的粒子施加线性力。 |
directionY | 沿着局部 Y 轴对力场体积内的粒子施加线性力。 |
directionZ | 沿着局部 Z 轴对力场体积内的粒子施加线性力。 |
drag | 对力场体积内的粒子施加阻力。 |
endRange | 确定用于影响粒子的形状的大小。 |
gravity | 对力场体积内的粒子施加重力。 |
gravityFocus | 使用重力时,将此值设置为 0 到 1 之间以控制重力效应的焦点。 |
length | 使用圆柱体力场形状影响粒子时,描述圆柱体的长度。 |
multiplyDragByParticleSize | 使用阻力时,如果启用此切换,则阻力强度将乘以粒子的尺寸。 |
multiplyDragByParticleVelocity | 使用阻力时,如果启用此切换,则阻力强度将乘以粒子的速度。 |
rotationAttraction | 控制粒子被拉入涡旋运动的强度。 |
rotationRandomness | 对粒子围绕其移动的力场轴施加随机性。 |
rotationSpeed | 粒子围绕涡旋推进的速度。 |
shape | 选择用于影响粒子的形状类型。 |
startRange | 设置大于 0 的值将创建一个空心力场形状。这将导致粒子在比 startRange 属性更靠近体积中心时不受力场的影响。 |
vectorField | 通过使用包含矢量场数据的 3D 纹理,对力场体积内的粒子施加力。 |
vectorFieldAttraction | 控制粒子被拉入矢量场运动的强度。 |
vectorFieldSpeed | 粒子穿过矢量场的推进速度。 |
enabled | 启用的行为将被更新,禁用的行为将不会被更新。 |
isActiveAndEnabled | 报告游戏对象及其关联的行为是否处于活动状态且已启用。 |
gameObject | 此组件所附加的游戏对象。组件始终附加到游戏对象。 |
tag | 此游戏对象的标签。 |
transform | 附加到此游戏对象的变换。 |
hideFlags | 对象是否应隐藏、与场景一起保存或用户是否可修改? |
name | 对象的名称。 |
BroadcastMessage | 在该游戏对象或其任何子对象中的每个 MonoBehaviour 上调用名为 methodName 的方法。 |
CompareTag | 将游戏对象的标签与定义的标签进行比较。 |
GetComponent | 获取与指定组件相同的 GameObject 上类型为 T 的组件的引用。 |
GetComponentInChildren | 获取与指定组件相同的 GameObject 或 GameObject 的任何子对象上类型为 T 的组件的引用。 |
GetComponentIndex | 获取组件在其父级 GameObject 上的索引。 |
GetComponentInParent | 获取与指定组件相同的 GameObject 或 GameObject 的任何父级上类型为 T 的组件的引用。 |
GetComponents | 获取与指定组件相同的 GameObject 上所有类型为 T 的组件的引用。 |
GetComponentsInChildren | 获取与指定组件相同的 GameObject 及其任何子对象上所有类型为 T 的组件的引用。 |
GetComponentsInParent | 获取与指定组件相同的 GameObject 及其任何父级上所有类型为 T 的组件的引用。 |
SendMessage | 在该游戏对象中的每个 MonoBehaviour 上调用名为 methodName 的方法。 |
SendMessageUpwards | 在该游戏对象中的每个 MonoBehaviour 以及该行为的每个祖先上调用名为 methodName 的方法。 |
TryGetComponent | 如果存在,则获取指定类型的组件。 |
GetInstanceID | 获取对象的实例 ID。 |
ToString | 返回对象的名称。 |
Destroy | 删除游戏对象、组件或资产。 |
DestroyImmediate | 立即销毁对象 obj。强烈建议您使用 Destroy 代替。 |
DontDestroyOnLoad | 加载新场景时,不要销毁目标对象。 |
FindAnyObjectByType | 检索类型为 type 的任何活动加载的对象。 |
FindFirstObjectByType | 检索类型为 type 的第一个活动加载的对象。 |
FindObjectsByType | 检索类型为 type 的所有加载对象的列表。 |
Instantiate | 克隆对象 original 并返回克隆。 |
InstantiateAsync | 捕获原始对象(必须与某个 GameObject 相关)的快照,并返回 AsyncInstantiateOperation。 |
bool | 对象是否存在? |
operator != | 比较两个对象是否引用不同的对象。 |
operator == | 比较两个对象引用以查看它们是否引用同一个对象。 |