Files
Continentis/Assets/OtherPlugins/Sprite Shaders Ultimate/Scripts/Interactive/Editor/InteractiveWindSSUEditor.cs
SoulliesOfficial ad4948207e 推进度!
2025-11-25 21:49:03 -05:00

240 lines
10 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
namespace SpriteShadersUltimate
{
[CustomEditor(typeof(InteractiveWindSSU)), CanEditMultipleObjects]
public class InteractiveWindSSUEditor : Editor
{
bool displaySetup;
bool displayTroubleshooting;
bool displayInformation;
public override void OnInspectorGUI()
{
//References:
GUIStyle style = new GUIStyle(GUI.skin.label);
style.richText = true;
InteractiveWindSSU wind = (InteractiveWindSSU)target;
//Header:
EditorGUILayout.BeginVertical("Helpbox");
EditorGUILayout.LabelField("<size=14><b>Interactive Wind</b></size>", style);
EditorGUILayout.LabelField(" ", GUILayout.Height(1));
DisplayHints(ref displaySetup, "Setup",
"- Attach this to a <b>SpriteRenderer</b> with the <b>Wind</b> shader.",
"- Set <b>Mesh Type</b> to <b>Full Rect</b> in the sprite's settings.",
"- Attach a <b>BoxCollider2D</b> to this gameobject.",
"- Set <b>Is Trigger</b> to true in the <b>BoxCollider2D</b>.",
"- Have a single active <b>WindManager</b> component in your scene.",
" ",
"- You can <b>flip</b> the shader for hanging objects.",
"- You can combine the shader with <b>UV Distort</b>."
);
EditorGUILayout.LabelField(" ", GUILayout.Height(1));
DisplayHints(ref displayTroubleshooting, "Troubleshooting",
" ",
"<b>Pixels are clipping out:</b>",
"- Make sure the sprite's <b>Mesh Type</b> is <b>Full Rect</b>.",
"- <b>Sprite Sheets</b> need the <b>Sprite Sheet Fix</b> option.",
"- Expand the sprite's texture horizontally with empty pixels.",
" ",
"<b>Wind is not visible:</b>",
"- Make sure the SpriteRenderer is using the <b>Wind</b> shader.",
"- If using a <b>Uber Shader</b> you need to enable <b>Wind</b>.",
"- Make sure you have a single active <b>WindManager</b> component.",
"- Check your <b>WindManager's</b> and <b>material's</b> settings.",
" ",
"<b>Physical interaction is not happening:</b>",
"- Check this <b>component's</b> and the <b>material's</b> settings.",
"- Make sure the <b>BoxCollider2D</b> is positioned properly.",
"- Set the <b>BoxCollider2D</b> to a <b>trigger</b>.",
"- Make sure a collision with the <b>BoxCollider2D</b> is happening.",
" "
);
EditorGUILayout.LabelField(" ", GUILayout.Height(1));
DisplayHints(ref displayInformation, "Information",
" ",
"<b>Summary:</b>",
"- Interaction will <b>bend</b> and <b>squish</b> the sprite.",
"- Can be used for <b>Grass, Trees, Chains, Vines</b> and more.",
" ",
"<b>Temporary Interaction:</b>",
"- Disable <b>Stay Bent</b> to have a temporary interaction.",
"- Only objects moving faster than <b>" + Mathf.RoundToInt(wind.minBendSpeed) + " unit/s</b> will interact.",
" "
);
EditorGUILayout.EndVertical();
EditorGUILayout.Space();
//Rotation:
EditorGUILayout.BeginVertical("Helpbox");
EditorGUILayout.LabelField("<b>Rotation:</b>", style);
EditorGUILayout.PropertyField(serializedObject.FindProperty("rotationFactor"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("bendInSpeed"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("bendOutSpeed"));
EditorGUILayout.EndVertical();
EditorGUILayout.Space();
//Temporary:
EditorGUILayout.BeginVertical("Helpbox");
EditorGUILayout.LabelField("<b>Method:</b>", style);
EditorGUILayout.PropertyField(serializedObject.FindProperty("stayBent"));
if(!wind.stayBent)
{
EditorGUILayout.PropertyField(serializedObject.FindProperty("minBendSpeed"));
}
EditorGUILayout.EndVertical();
EditorGUILayout.Space();
//Hyper Performance:
EditorGUILayout.BeginVertical("Helpbox");
EditorGUILayout.LabelField("<b>Hyper Performance:</b>", style);
EditorGUILayout.PropertyField(serializedObject.FindProperty("hyperPerformanceMode"));
if (wind.hyperPerformanceMode)
{
EditorGUILayout.PropertyField(serializedObject.FindProperty("randomOffsetZ"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("customMaterial"));
if (wind.customMaterial)
{
EditorGUILayout.PropertyField(serializedObject.FindProperty("inactiveMaterial"));
}
else
{
EditorGUILayout.PropertyField(serializedObject.FindProperty("inactiveShader"));
}
//Hint:
GUI.color = new Color(1, 1, 1, 0.7f);
EditorGUILayout.LabelField("- GPU performance boost for <b>lowest-end</b> mobile phones.", style);
if(!wind.customMaterial)
{
EditorGUILayout.LabelField("- Sets the shader to <b>" + wind.inactiveShader + "</b> while inactive.", style);
}
else
{
if(wind.inactiveMaterial != null)
{
EditorGUILayout.LabelField("- Sets the material to <b>" + wind.inactiveMaterial.name + "</b> while inactive.", style);
}
else
{
GUIStyle warningStyle = new GUIStyle(GUI.skin.label);
warningStyle.richText = true;
if (EditorGUIUtility.isProSkin)
{
warningStyle.normal.textColor = new Color(1, 0.7f, 0.7f, 1);
}
else
{
warningStyle.normal.textColor = new Color(0.3f, 0f, 0f, 1);
}
EditorGUILayout.LabelField("- Please reference a material in <b>Inactive Material</b>.", warningStyle);
}
}
EditorGUILayout.LabelField("- Use this if you want <b>physical interaction</b> but don't need <b>Wind</b>.", style);
EditorGUILayout.LabelField("- You must set <b>Rotation Wind Factor</b> to <b>0</b> in the material.", style);
EditorGUILayout.Space();
EditorGUILayout.LabelField("- Enabling <b>Random Offset Z</b> will prevent resorting of render order.", style);
GUI.color = Color.white;
}
EditorGUILayout.EndVertical();
EditorGUILayout.Space();
//Other:
EditorGUILayout.BeginVertical("Helpbox");
EditorGUILayout.LabelField("<b>Other:</b>", style);
EditorGUILayout.PropertyField(serializedObject.FindProperty("randomizeWiggle"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("allowCustomLayer"));
EditorGUILayout.EndVertical();
serializedObject.ApplyModifiedProperties();
//Fix Layer:
if(wind.gameObject.layer != 2 && !wind.allowCustomLayer)
{
wind.gameObject.layer = 2;
}
//Fix BoxCollider2D:
BoxCollider2D boxCollider = wind.gameObject.GetComponent<BoxCollider2D>();
if(boxCollider == null)
{
//Create new BoxCollider2D:
boxCollider = wind.gameObject.AddComponent<BoxCollider2D>();
boxCollider.isTrigger = true;
}
//Fix Variables:
if(wind.bendInSpeed < 0)
{
wind.bendInSpeed = 0;
}
if (wind.bendOutSpeed < 0)
{
wind.bendOutSpeed = 0;
}
if (wind.minBendSpeed < 0)
{
wind.minBendSpeed = 0;
}
}
void DisplayHints(ref bool toggleVariable, string title,params string[] lines)
{
GUIStyle style = new GUIStyle(GUI.skin.label);
style.richText = true;
GUIStyle button = new GUIStyle(GUI.skin.button);
button.richText = true;
if (toggleVariable)
{
GUI.color = new Color(1, 1, 1, 0.7f);
}
else
{
GUI.color = new Color(1, 1, 1, 0.5f);
}
title = "<b>" + title + "</b>";
EditorGUILayout.BeginVertical(GUI.skin.box);
EditorGUILayout.BeginHorizontal();
GUI.color = Color.white;
EditorGUILayout.LabelField(title, style);
if (GUILayout.Button("<size=10>" + (toggleVariable ? "▼" : "▲") + "</size>", button, GUILayout.Width(20)))
{
toggleVariable = !toggleVariable;
}
EditorGUILayout.EndHorizontal();
if (toggleVariable == true)
{
GUI.color = new Color(1, 1, 1, 0.7f);
for(int l = 0; l < lines.Length; l++)
{
if(lines[l] == " ")
{
EditorGUILayout.LabelField(lines[l], style,GUILayout.Height(6));
}
else
{
EditorGUILayout.LabelField(lines[l], style);
}
}
}
GUI.color = Color.white;
EditorGUILayout.EndVertical();
}
}
}