版本:Unity 6 (6000.0)
语言英语
  • C#

ParticleSystemForceField

UnityEngine 中的类

/

继承自:Behaviour

/

实现于:UnityEngine.ParticleSystemModule

建议更改

成功!

感谢您帮助我们改进 Unity 文档的质量。虽然我们无法接受所有提交的内容,但我们确实会阅读用户提出的每一项更改建议,并在适当的情况下进行更新。

关闭

提交失败

由于某些原因,您的更改建议无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们改进 Unity 文档的质量。

关闭

取消

切换到手册

描述

粒子系统力场的脚本接口。

粒子系统力场可以用来影响进入每个力场影响区域的粒子组。

力场形状可以设置为多种形状,力场中各种属性控制粒子如何受到影响。

作为选择形状的一部分,您可以定义开始范围和结束范围。结束范围描述了形状的最大范围,开始范围可以用来创建空心形状。

可以对位于此体积内的粒子施加多种力:方向力、重力、旋转力、阻力和矢量场。

每种力类型的设置使用 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 ==比较两个对象引用以查看它们是否引用同一个对象。