// MIT License - Copyright (c) 2025 wallstop
// Full license text: https://github.com/wallstop/unity-helpers/blob/main/LICENSE
namespace WallstopStudios.UnityHelpers.Editor.Tools.UnityMethodAnalyzer
{
#if UNITY_EDITOR
using System;
using System.Collections.Generic;
///
/// Unity MonoBehaviour lifecycle methods and their expected signatures.
///
public static class UnityMethods
{
public static readonly HashSet LifecycleMethods = new(StringComparer.Ordinal)
{
// Initialization
"Awake",
"OnEnable",
"Start",
"OnDisable",
"OnDestroy",
// Update methods
"Update",
"LateUpdate",
"FixedUpdate",
// Physics
"OnCollisionEnter",
"OnCollisionStay",
"OnCollisionExit",
"OnCollisionEnter2D",
"OnCollisionStay2D",
"OnCollisionExit2D",
"OnTriggerEnter",
"OnTriggerStay",
"OnTriggerExit",
"OnTriggerEnter2D",
"OnTriggerStay2D",
"OnTriggerExit2D",
"OnControllerColliderHit",
"OnJointBreak",
"OnJointBreak2D",
"OnParticleCollision",
"OnParticleTrigger",
"OnParticleSystemStopped",
"OnParticleUpdateJobScheduled",
// Rendering
"OnPreCull",
"OnPreRender",
"OnPostRender",
"OnRenderObject",
"OnWillRenderObject",
"OnBecameVisible",
"OnBecameInvisible",
"OnRenderImage",
"OnGUI",
"OnDrawGizmos",
"OnDrawGizmosSelected",
// Application
"OnApplicationFocus",
"OnApplicationPause",
"OnApplicationQuit",
// Mouse
"OnMouseDown",
"OnMouseUp",
"OnMouseUpAsButton",
"OnMouseEnter",
"OnMouseExit",
"OnMouseDrag",
"OnMouseOver",
// Animation
"OnAnimatorIK",
"OnAnimatorMove",
// Audio
"OnAudioFilterRead",
// Network (legacy)
"OnServerInitialized",
"OnConnectedToServer",
"OnDisconnectedFromServer",
"OnFailedToConnect",
"OnFailedToConnectToMasterServer",
"OnMasterServerEvent",
"OnNetworkInstantiate",
"OnPlayerConnected",
"OnPlayerDisconnected",
"OnSerializeNetworkView",
// Scene
"OnLevelWasLoaded",
// Validation/Editor
"OnValidate",
"Reset",
// Transform
"OnTransformChildrenChanged",
"OnTransformParentChanged",
};
public static readonly HashSet MonoBehaviourBaseClasses = new(
StringComparer.Ordinal
)
{
"MonoBehaviour",
"ScriptableObject",
"StateMachineBehaviour",
"NetworkBehaviour",
"Editor",
"EditorWindow",
"PropertyDrawer",
"DecoratorDrawer",
"AssetPostprocessor",
"ScriptedImporter",
};
///
/// Lifecycle methods that accept parameters.
///
public static readonly HashSet MethodsWithParameters = new(StringComparer.Ordinal)
{
"OnCollisionEnter",
"OnCollisionStay",
"OnCollisionExit",
"OnCollisionEnter2D",
"OnCollisionStay2D",
"OnCollisionExit2D",
"OnTriggerEnter",
"OnTriggerStay",
"OnTriggerExit",
"OnTriggerEnter2D",
"OnTriggerStay2D",
"OnTriggerExit2D",
"OnControllerColliderHit",
"OnJointBreak",
"OnJointBreak2D",
"OnParticleCollision",
"OnAnimatorIK",
"OnAnimatorMove",
"OnAudioFilterRead",
"OnRenderImage",
"OnApplicationFocus",
"OnApplicationPause",
"OnSerializeNetworkView",
"OnLevelWasLoaded",
};
///
/// Returns true if the given return type is valid for the specified Unity lifecycle method.
///
public static bool IsValidUnityLifecycleReturnType(string methodName, string returnType)
{
if (string.IsNullOrEmpty(returnType))
{
return false;
}
string normalized = returnType.Trim();
if (string.Equals(normalized, "void", StringComparison.Ordinal))
{
return true;
}
if (string.Equals(methodName, "Start", StringComparison.Ordinal))
{
return string.Equals(normalized, "IEnumerator", StringComparison.Ordinal)
|| string.Equals(
normalized,
"System.Collections.IEnumerator",
StringComparison.Ordinal
);
}
return false;
}
}
#endif
}