Unity 6.3
0 онлайн 54 гостей 3 в системе
Вход

4. Испытание стержня достижения

Цели обучения

Выполняйте утверждения о позиции и поведении персонажа.

2010 год

  1. Вернётся к предыдущему файлу MovementTest.cs.
  2. Напишите тест MainScene\_CharacterReachesWand, который заставляет вашего персонажа двигаться вправо, и проверяет, доходит ли он до места расположения палочки.

Подсказки

  • Поищите Альтарь и Сара Вариант игровые объекты в вашей сцене. Вы заинтересованы в измерении X позиции ваших Transform объектов.
  • Местоположение палочки X положение равно поплавку 21.080. Положение X главного персонажа динамично и изменяется при каждом его движении.
  • Рассмотрите возможность установки тайм-аута, который приведет к неудаче теста, если Палочка не достигнута.

Решение

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

public class MovementTest
{
    private Transform _characterTransform;
    private float _testTimeout = 25.0f;
    private float _wandLocation = 21.080f;

    [UnityTest]
    public IEnumerator MainScene_CharacterReachesWand()
    {
      SceneManager.LoadScene("Assets/Scenes/Main.unity", LoadSceneMode.Single);
      yield return waitForSceneLoad();

      var elapsedTime = 0.0f;
      yield return GoRight();
      while (GetCurrentCharacterPosition() <= _wandLocation)
      {
          yield return null;
          elapsedTime += Time.deltaTime;
          if (elapsedTime > _testTimeout)
          {
            Assert.Fail($"Character did not reach location position in {_testTimeout} seconds.");
          }
      }
    }

    private float GetCurrentCharacterPosition()
    {
      // Get Main character's Transform which is used to manipulate position.
      if (_characterTransform == null)
      {
          _characterTransform = GameObject.Find("Sara Variant").transform;
      }

      return _characterTransform.position.x;
    }

    private IEnumerator GoRight()
    {
      TestInputControl.MoveLeft = false;
      yield return null;
      TestInputControl.MoveRight = true;
    }

    private IEnumerator waitForSceneLoad()
    {
        while (SceneManager.GetActiveScene().buildIndex > 0)
        {
            yield return null;
        }
    }
}