Posts Tagged editor

Creating new GameObjects

I don’t know what you want when you create new GameObjects for 3D, but for my UI stuff, I need the new instance to be a child of the GameObject that I have selected in the hierarchy. When you use the command provided by the Unity editor, it creates the new GameObject at the root of your project. Plus when you move that GameObject (haha I wrote MovieClip at first) in the hierarchy, its position and scale will change according to the parent’s values. So basically, I was spending my time moving new GameObject and setting their position to (0,0,0) and scale to (1,1,1).

When I had enough of it, I took matters in my own hands and created a little panel that will create a new GameObject as a child of the GameObject selected in the editor. It also sets it position to 0 and scale to 1. Bam! Here is the code for it:

public class CreateGameObject : EditorWindow{
	[MenuItem("zedia/Utility/GameObject Creator")]
	public static void ShowWindow() {
		EditorWindow.GetWindow<CreateGameObject>("GameObject Creator");
	}
 
	void OnGUI (){
		GUILayout.Label("GameObject Creator4", EditorStyles.boldLabel);
		GUILayout.Label("Creates a new GameObject under the selected GameObject in the Hierarchy,", EditorStyles.label);
		GUILayout.Label("with local position (0,0,0) and local scale (1,1,1)", EditorStyles.label);
		EditorGUILayout.Separator();
		GUILayout.BeginHorizontal();
 
		var retainValue = GUILayout.Button("Add GameObject To:");
		GameObject sel = EditorGUILayout.ObjectField(Selection.activeGameObject, typeof(GameObject), true, GUILayout.Width(140f)) as GameObject;
		if (retainValue){
			CreateTheEmptyGameObject();
		}
	}
 
	public static void CreateTheEmptyGameObject(){
		GameObject newGameObject = new GameObject();
		newGameObject.transform.parent = Selection.activeGameObject.transform;
		newGameObject.transform.localScale = new Vector3(1,1,1);
		newGameObject.transform.localPosition = new Vector3(0,0,0);
		Selection.activeObject = newGameObject;
	}
 
	void OnSelectionChange () { Repaint(); }
}

Now, that was what I wanted, but it would have been even better if it could listen for a keyboard shortcut. So I set out to do just that in the previous little panel except it didn’t work. Something was preventing me from receiving the events from the keyboard (I can Debug.Log, but as soon as I execute code it doesn’t work). So I decided I would just create a MenuItem associated with a keyboard shortcut. Here is what the code look likes:

using UnityEngine;
using System.Collections;
using UnityEditor;
 
public class CreateGameObjectCommand : MonoBehaviour {
	[MenuItem("zedia/Utility/GameObject Creator Command #%m")]
	static void CreateGameObject () {
		GameObject newGameObject = new GameObject();
		newGameObject.transform.parent = Selection.activeGameObject.transform;
		newGameObject.transform.localScale = new Vector3(1,1,1);
		newGameObject.transform.localPosition = new Vector3(0,0,0);
		Selection.activeObject = newGameObject;
	}
}

So here you go; either a panel in the editor or a shortcut or both if you want to. Just grab the code and put the files in a folder named Editor, and Unity will add a menu for you. I hope Unity3D changes their default behavior for creating new GameObject but until then, we will make it work ourself!

, , , ,

2 Comments


Unity3D: the editor/code duality

So as most of you know I have been doing Flash for a long time and recently I have been doing Unity3d (well mostly NGUI you could say). It has been mostly fun and mostly rigid.

Rigid???

Yeah I would say rigid. Unity3d imposes you a way to work that is mostly to use the editor and not programming. They really really want you to use the editor. And coming from Flash this feels really weird. Probably because after 6 years of using Flash you kinda learn that the most you can do in code, the better and easier it is. Also, if you constantly switch between the editor and the code, it gets confusing, always switching paradigms.

GameObject for president!

GameObject is the root of everything you do in Unity, but one of the most annoying thing is that you can’t extend GameObject… Come on, let me do it, just the tip ;) . Here is what I would do if I could; I would make myself APIs for 2D. Moving something in x would be

gameObject.x = 30;

instead of

gameObject.tranform.localPosition = new Vector3d (30,  gameObject.tranform.localPosition.y, gameObject.tranform.localPosition.z);

Man have you seen the size of that thing just to move something in x???? Let me make it better for myself, I don’t care about 3D, I wouldn’t have a z value I would call it depth and it would make the code way more readable.

Encapsulation, what encapsulation

The other thing that bugs me is that to interact through code with a gameObject hierarchy you created, you basically have to know how it is built and you have to get your pieces using Find or GetComponent. Find statements are the ugliest ones as they use a string to get you what you want and is really error prone.

So you add your Script to your gameObject (proof that the editor is taking precedence over code) but to have interactions between multiple gameObject you have to do it through their scripts which you have to know their types, but have no idea if they exist and are linked or not. You’ll know at runtime when the error pops up.

Everything on a GameObject

Basically my point here is that you can’t do anything if it ain’t on a gameObject. Some core functions just won’t work if it ain’t. Like the WWW function(used to load stuff from the web) (really cryptic name if you ask me). It won’t work if it ain’t called from a MonoBehavior and MonoBehaviors can’t be instantiated, it needs to be added to a GameObject. So what about Models, code that only keep the states of an application or that loads data to hold it. Models have nothing to do with GameObjects, they should be allowed to use the WWW function. But no, if you want to, you need to create a GameObject, add to it a loading script, and wait for it to pass you back the data. Doesn’t that sound devious to you?

Let it define itself

I like Unity3d; it allows you to build for Android / iOs very easily, but the way it is so rigid really annoys me. I think that a project that is so young like Unity3D should not force the users down some path, it should let them find incredible and unthought ways of using it. I want to do 2D / UI with it and right now it is pretty annoying to do so.

, , , , , ,

6 Comments