今天遇到一個需求,需要批量修改粒子系統(tǒng)的startDelay屬性值,Unity編輯器本來支持多選然后賦值,但是現在需要是要在原有的值上加(+)一個值.于是就想到自己擴展下編輯器支持這個操作.
代碼如下:
using UnityEngine;
using UnityEditor;
public class EffectEditorEx : EditorWindow
{
private static EffectEditorEx m_editor_ex;
[MenuItem("Duole/EffectEditorEx/Open",false,401)]
static void OpenEditor()
{
if (m_editor_ex == null)
{
m_editor_ex = EditorWindow.GetWindow<EffectEditorEx>("EffectEditorEx", true);
m_editor_ex.autoRepaintOnSceneChange = true;
}
m_editor_ex.Show(true);
}
private float m_start_delay = 0f;
private void OnGUI()
{
GUILayout.Label("Start Delay:");
m_start_delay = EditorGUILayout.FloatField(m_start_delay);
if (GUILayout.Button("+"))
{
var items = Selection.GetFiltered<ParticleSystem>(SelectionMode.ExcludePrefab);
foreach (var item in items)
{
var maindata = item.main;
maindata.startDelay = new ParticleSystem.MinMaxCurve(maindata.startDelay.constant + m_start_delay);
}
}
if (GUILayout.Button("x"))
{
var items = Selection.GetFiltered<ParticleSystem>(SelectionMode.ExcludePrefab);
foreach (var item in items)
{
var maindata = item.main;
maindata.startDelay = new ParticleSystem.MinMaxCurve(maindata.startDelay.constant * m_start_delay);
}
}
if (GUILayout.Button("="))
{
var items = Selection.GetFiltered<ParticleSystem>(SelectionMode.ExcludePrefab);
foreach (var item in items)
{
var maindata = item.main;
maindata.startDelay = new ParticleSystem.MinMaxCurve(m_start_delay);
}
}
}
}
這個過程中,坑的一點是ParticleSystem.main是只讀的struct,我找了半天沒找到賦值的方法.結果自己測試了下,發(fā)現直接修改這個ParticleSystem.main得到的MainModule中對應的值就可以了(一臉懵逼).