Intro
A few days ago my friend stumbled across a problem because of the usage of GameObject.Find
, it can’t find the game object because the game object was renamed. So, I thought we can have something like Unreal Engine redirector to solve this problem.
In Unity, There is FormerlySerializedAsAttribute
, which is used to rename a field without losing its serialized value.
Structure
Data
-
GameObjects
This data comes from Unity Engine itself, to retrieve this I use
Resources.FindObjectsOfTypeAll(typeof(GameObject));
-
ScriptableObject
The scriptable object is used to store all the game objects. I create a custom class to hold the required data.
public class NameConfig { public int hashCode; public string oldName; public string newName; }
- The hash code is the game object hash code, it uses to check whether a game object name is changed or not.
- Old name store the current game object name.
- New name store the new game object name.
System
Since I can not find any event for rename I use EditorApplication.hierarchyChanged
, below is the step I do to check rename in the game object.
- Listen to
EditorApplication.hierarchyChanged
. - When there is any change in hierarchy,
- Find the data that match the hash code of the current game object.
- If any change then stores the new name otherwise clear it.
I also use a MenuItem
to create a menu to register all the game objects manually. It will directly store the data in the ScriptableObject, I use it because working with ScriptableObject is easy and does not require any parsing.
API
I want to override GameObject.Find but it seems I can’t do that, so I create an extension method so it gonna looks more natural,
gameObject.FindByName("game object name");
Conclusion
The GameObject.Find
can be solved using redirector, but it is gonna need more improvement in the future. This experiment’s purpose is to be a proof of concept. But it gonna need more effort to make a better and more advanced version of the redirector.
Improvement
- Make sure if the hash code is persistent, I am not testing this yet.
- Change ScriptableObject to store data into text-based, e.g json, csv.
- Asset redirector, this gonna need to connect between the redirector data and the engine itself, besides the redirector needs to be compatible with the engine too.
- Script Redirector, use hash code to track any changes, basically similar to this experiment.
You can take a look at the code here.
Thank you for reading 😃 I hope you enjoy it.
Have a nice day.