How to Play Mode Unit Test a Prefab in Unity

Let’s say you have an existing Unity game and you would like to test a prefab exclusively by itself. No problem, you’ve come to the right place. You can do this using what is called a Play Mode unit test. Here is some sample code to help get you started:

[UnityTest]
[Timeout(180000)] // Sets the timeout of the test in milliseconds (if the test hangs, this will ensure it closes after 3 minutes).
public IEnumerator TestAnimationAnimUtilityPrefab()
{
	// Remove the default skybox.
    RenderSettings.skybox = null;
    // Create a new root game object.
    var root = new GameObject();
	// Attach a camera to our root game object.
    root.AddComponent(typeof(Camera));
	// Get a reference to the camera.
    var camera = root.GetComponent<Camera>();
    // Set the camera's background color to white.
    camera.backgroundColor = Colors.white;
    // Add our game object (with the camera included) to the scene by instantiating it.
    root = GameObject.Instantiate(root);
	// Load a prefab (by giving it the path to an existing prefab).
	var prefab = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Example.prefab");
	// Instantiate the prefab (by adding it to the scene). Use the Quaternion to set the rotation in degrees and the Vector3 to set the position in 3D space.
	prefab = GameObject.Instantiate(prefab, new Vector3(0, 0, 10), new Quaternion(0, 180, 0, 0));
	// Wait for three seconds (this gives us time to see the prefab in the scene if its an animation or something else).
	yield return new WaitForSeconds(3f);
	// In this example, let's assume that our Example.prefab has a script on it called ExampleScript.
	var script = prefab.gameObject.GetComponentInChildren<ExampleScript>();
	// Assert that the script exists on our prefab so we don't stumble upon this problem in the future.
    Assert.IsTrue(script != null, "ExampleScript must be set on Example.prefab.");
	// Finally, we should clean up our scene by destroying our objects.
	GameObject.Destroy(prefab);
	GameObject.Destroy(root);
}

Alexandru

"To avoid criticism, say nothing, do nothing, be nothing." - Aristotle

"It is wise to direct your anger towards problems - not people; to focus your energies on answers - not excuses." - William Arthur Ward

"Science does not know its debt to imagination." - Ralph Waldo Emerson

"Money was never a big motivation for me, except as a way to keep score. The real excitement is playing the game." - Donald Trump

"All our dreams can come true, if we have the courage to pursue them." - Walt Disney

"Mitch flashes back to a basketball game held in the Brandeis University gymnasium in 1979. The team is doing well and chants, 'We're number one!' Morrie stands and shouts, 'What's wrong with being number two?' The students fall silent." - Tuesdays with Morrie

I'm not entirely sure what makes me successful in general programming or development, but to any newcomers to this blood-sport, my best guess would be that success in programming comes from some strange combination of interest, persistence, patience, instincts (for example, someone might tell you that something can't be done, or that it can't be done a certain way, but you just know that can't be true, or you look at a piece of code and know something doesn't seem right with it at first glance, but you can't quite put your finger on it until you think it through some more), fearlessness of tinkering, and an ability to take advice because you should be humble. Its okay to be wrong or to have a bad approach, realize it, and try to find a better one, and even better to be wrong and find a better approach to solve something than to have had a bad approach to begin with. I hope that whatever fragments of information I sprinkle across here help those who hit the same roadblocks.

Leave a Reply

Your email address will not be published. Required fields are marked *