Extending the Unity Editor

Its been a while since my last post, as I have been pretty busy with a new job and learning new tools. After going through a bunch of tutorials I have familiarized myself with the Unity3d workflow and C#, and busied myself writing art tools for my new workplace.

The Unity Editor is pretty fun to work with, and has a very extendable interface. With just a few lines of code (C# by preference) it's possible to create a customized interface window.

Here is a bare bones example of how to make a custom window in Unity 4.2, and make it do stuff. The example is written in CSharp and does a very simple task, makes a window and tells you the name of whatever you have selected.

// Example Window- Get the name of whatever game object 
// that is currently selected

using UnityEngine;
using UnityEditor;

public class ExampleWindow : EditorWindow
{

// Strings
string objectName = "";

// Update specific variables
// Using the repaint flag, GUI updates are done once, rather than spammed
// every frame.
private string lastSelected = "";
private bool repaint = true;

// This creates a new Menu item where we can access our tool from.
[MenuItem("Window/ExampleWindow")]
static void Init()
{
ExampleWindow window = (ExampleWindow)EditorWindow.GetWindow(typeof(ExampleWindow));
}

// A Button Function
void myFancyFunction()
{
// Log something to the comments console.
Debug.Log("You pressed a fancy button!");
}

// This is my actual window
private void OnGUI()
{
// Create a label
GUILayout.Label("Select an object in the hierarchy view");

// Create a text field that will update whenever we select a different object
EditorGUILayout.TextField("Object Name: ", objectName);

// Create a button that calls our fancy function.
if (GUI.Button(new Rect(32, 42, 256, 16), "Fancy function!"))
{
myFancyFunction();
}

}

private void Update()
{

if (Selection.activeGameObject && Selection.activeGameObject.name != lastSelected)
{
objectName = Selection.activeGameObject.name;
this.Repaint();

// This is to prevent spamming GUI updates
lastSelected = Selection.activeGameObject.name;
repaint = true;
}

else if (Selection.activeGameObject == null && repaint == true)
{
objectName = "Please Select an Object";
this.Repaint();

// This is to prevent spamming GUI updates
repaint = false;
lastSelected = "";
}
}
}

All of this results in a window you can then access from Window > ExampleWindow.
Probably the most useful tool ever made. 

Comments

Popular posts from this blog

Calling Python from Substance Painter

A Quick Checkin- Clion, Unreal and Mac