- Home /
How Can I Make A Menu Like "Components\Scripts"?
The menu Components\Scripts is automatically populated with all the scripts in your project. I'd like to implement a similar menu that is dynamically populated in order to create a proper "Open Recent" option in the file menu.
How can I do this? It seems like the only way to add menu items is as attributes which makes them compile-time only... I can't find a way to get a hold of the main editor menus to add to them either... Thoughts?
Thanks.
Answer by EvilTak · Dec 18, 2014 at 10:42 AM
You will have to use the MenuItem attribute for static functions. Note that this uses the UnityEditor namespace and has to be in an editor folder. Example:
using UnityEngine;
using UnityEditor;
using System.Collections;
public class RealtimeReflectionsMenu : ScriptableObject
{
[MenuItem("GameObject/Realtime Reflections/Add to Selected Object")]
static void AddToSelectedObject(){
GameObject reflectionPrefab = (GameObject)AssetDatabase.LoadAssetAtPath ("Assets/Realtime Reflections/Prefabs/Reflection Manager.prefab", typeof(GameObject));
reflectionPrefab = (GameObject)Instantiate (reflectionPrefab);
Undo.RecordObject (reflectionPrefab, "Reflection Manager Creation");
reflectionPrefab.name = "Reflection Manager";
reflectionPrefab.transform.parent = Selection.activeGameObject.transform;
reflectionPrefab.transform.localPosition = Vector3.zero;
reflectionPrefab.transform.rotation = Quaternion.identity;
if (!Selection.activeGameObject.GetComponent<Camera>() && Selection.activeGameObject.renderer) {
reflectionPrefab.GetComponent<RealtimeReflections>().materials = Selection.activeGameObject.renderer.materials;
}
}
[MenuItem("GameObject/Realtime Reflections/Add to Main Camera")]
static void AddToMainCamera(){
GameObject reflectionPrefab = (GameObject)AssetDatabase.LoadAssetAtPath ("Assets/Realtime Reflections/Prefabs/Reflection Manager.prefab", typeof(GameObject));
reflectionPrefab = (GameObject)Instantiate (reflectionPrefab);
Undo.RecordObject (reflectionPrefab, "Reflection Manager Creation");
reflectionPrefab.name = "Reflection Manager";
reflectionPrefab.transform.parent = Camera.main.transform;
reflectionPrefab.transform.localPosition = Vector3.zero;
reflectionPrefab.transform.rotation = Quaternion.identity;
}
[MenuItem("Component/Realtime Reflections/Planar Reflections/Add to Selected Object")]
static void AddPlanarToSelectedObject(){
GameObject go = Selection.activeGameObject;
go.AddComponent<PlanarRealtimeReflection> ();
Undo.AddComponent<PlanarRealtimeReflection> (go);
foreach (Material m in go.renderer.sharedMaterials) {
m.shader = (Shader)AssetDatabase.LoadAssetAtPath("Assets/Realtime Reflections/Shaders/PlanarReflection.shader", typeof(Shader));
}
}
}
This script is from one of my assets, but I have just uploaded it as an example.
Unless I'm mistaken this only creates a pair of static menu items. What I want is something like the Components\Scripts which is a sub-menu whose items are dynamically populated (ie they can't be known at compile time).
Your answer

Follow this Question
Related Questions
Set Graphics Emulation to No Emulation as Default? 2 Answers
Custom menu dissapearing sometimes. 0 Answers
Null Reference exception when trying to extend the editor. 1 Answer
MenuItem in EditorWindow 1 Answer
Making a Selectable EditorGUI Menu 0 Answers