5. Испытание на удар
Цели обучения
Проверьте коллизии и убедитесь, что LostCrypt не имеет ошибок, которые позволяют вашему персонажу перемещаться за пределы карты.
2010 год
Посмотрите на GameObject Environment/Character Bounds - Left. Вы видите, что он расположен слева от нашей карты 2D. Он предназначен для защиты игроков от выхода из карты и попадания в текстуры. Посмотрим, выполняет ли он свою задачу.
- Добавить новый тест
MainScene\_CharacterDoesNotFallIntoTexturesвMovementTest.cs. - Сделайте ваш персонаж двигаться влево и иногда прыгать с некоторым интервалом ожидания между прыжками.
- В тесте, Утверждаем, что Сара Вариант позиция игрового объекта находится в пределах нашей текущей сцены.
Подсказки
- Аналогично предыдущему тесту, давайте установим какое-то произвольное количество секунд как тайм-аут. Сара должна оставаться в пределах сцены в течение указанного времени.
- Вы можете использовать
WaitForSeconds(0.5f)между прыжками, чтобы лучше эмулировать поведение Пользователя. - Изучите Scene и hardcode X, и Y позиции, используемые для проверки вне карты, или лучше — получить его динамически из
Character Bounds - Leftигрового объекта.
Решение
MovementTest.cs
using System.Collections;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;
using UnityEngine.SceneManagement;
public class MovementTest
{
const float _testTimeout = 20.0f;
private Transform _characterTransform;
[UnityTest]
public IEnumerator MainScene_CharacterDoesNotFallIntoTextures()
{
SceneManager.LoadScene("Assets/Scenes/Main.unity", LoadSceneMode.Single);
yield return waitForSceneLoad();
yield return GoLeft();
while (Time.timeSinceLevelLoad < _testTimeout)
{
yield return new WaitForSeconds(0.5f);
yield return Jump();
if (GetCurrentCharacterPosition().x < -75f && GetCurrentCharacterPosition().y < -10f)
{
Assert.Fail("Character escaped the map and fell into textures! :(");
}
}
}
private Vector3 GetCurrentCharacterPosition()
{
// Get Main character's Transform which is used to manipulate position.
if (_characterTransform == null)
{
_characterTransform = GameObject.Find("Sara Variant").transform;
}
return _characterTransform.position;
}
private IEnumerator Jump()
{
TestInputControl.Jump = true;
yield return null;
TestInputControl.Jump = false;
}
private IEnumerator GoLeft()
{
TestInputControl.MoveRight = false;
yield return null;
TestInputControl.MoveLeft = true;
}
private IEnumerator waitForSceneLoad()
{
while (SceneManager.GetActiveScene().buildIndex > 0)
{
yield return null;
}
}
}
Наш тест не сработал, у нас есть ошибка в одном из наших проектов Sample Unity. Как бы вы подходили к решению этой проблемы? Есть много возможностей, продолжайте и попробуйте исправить ее в рамках этого обучения:
- Представлен новый коллайдер Character Bounds Box, который предотвратит возникновение ошибки.
- Переработанная логика столкновений персонажа Сара.