Unity Test Frameworkでシーン上のオブジェクトを取得する方法


1. はじめに

Unity Test Framework(UTF)では、Edit ModeテストとPlay Modeテストの両方でシーン内オブジェクトを取得・検証できます。

本資料では、それぞれの手順をコード例付きで解説します。


2. Edit Mode テスト

2.1 シーンの読み込み

using UnityEditor.SceneManagement;
using NUnit.Framework;

public class EditModeSceneTests
{
    [SetUp]
    public void Setup()
    {
        // テスト対象のシーンをEditor上で開く
        EditorSceneManager.OpenScene("Assets/Scenes/MyScene.unity");
    }

2.2 オブジェクトの検索と検証

    [Test]
    public void VerifyGameObjectExists()
    {
        // アクティブなGameObjectを名前で検索
        var obj = GameObject.Find("MyGameObject");
        Assert.That(obj, Is.Not.Null, "MyGameObject がシーン内に存在するはずです");
    }

2.3 後始末(クリーンアップ)

    [TearDown]
    public void Teardown()
    {
        // テスト後はデフォルトシーンにリセット
        EditorSceneManager.NewScene(
            NewSceneSetup.DefaultGameObjects, 
            NewSceneMode.Single
        );
    }
}

3. Play Mode テスト

3.1 シーンのロード

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.TestTools;
using NUnit.Framework;
using System.Collections;

public class PlayModeSceneTests
{
    [UnityTest]
    public IEnumerator LoadSceneAndFindObject()
    {
        // Build Settings に登録したシーンをロード
        SceneManager.LoadScene("MyScene", LoadSceneMode.Single);
        yield return null;  // 1フレーム待機してロード完了を待つ

3.2 オブジェクトの検索と検証

        var obj = GameObject.Find("MyGameObject");
        Assert.IsNotNull(obj, "ロード後のシーンに MyGameObject が存在するはずです");
    }
}

ポイント

  • Play Mode テストではシーンをBuild Settingsに登録が必要
  • フレームをまたぐ検証には [UnityTest] 属性を使用

4. Build Settings に登録せずにロードする方法

テスト専用シーンをBuild Settingsに追加したくない場合:

using UnityEditor.SceneManagement;
using UnityEngine.TestTools;
using NUnit.Framework;
using System.Collections;

public class EditorPlayModeTests
{
    [UnityTest]
    public IEnumerator LoadEditorSceneWithoutBuildSettings()
    {
        var path = "Assets/Scenes/MyScene.unity";
        // Build Settings 依存せずにPlay Modeでシーンをロード
        EditorSceneManager.LoadSceneInPlayMode(
            path,
            new LoadSceneParameters(LoadSceneMode.Single)
        );
        yield return null;
        Assert.IsNotNull(GameObject.Find("MyGameObject"));
    }
}

5. ポイントまとめ

  1. Edit Mode
    • [SetUp]:EditorSceneManager.OpenScene でシーン読み込み
    • [Test]:GameObject.Find でオブジェクト検証
    • [TearDown]:EditorSceneManager.NewScene でクリーンアップ
  2. Play Mode
    • [UnityTest]:SceneManager.LoadScene → yield return null → GameObject.Find
  3. Build Settings 非依存
    • EditorSceneManager.LoadSceneInPlayMode を活用

これで、UTFを使ったシーン上オブジェクトの取得と検証が行えます。

テスト

Posted by hidepon