3. Подвижный характер
Цели обучения
Как использовать пакеты Unity InputSystem, чтобы иметь общий способ программного перемещения персонажа в тестах.
2010 год
Пожалуйста, убедитесь, что InputSystem установлены в вашем проекте Unity. Вы можете проверить это, проверив Package Manager.
- Создайте новый класс с именем
MovementTest.csподAssets/Tests/PlayModeTests. - Добавьте ссылку на
Unity.InputSystemиUnity.InputSystem.TestFrameworkв определение сборкиPlayModeTests. - Создайте новый каталог
InputControlв Tests:Assets/Tests/InputControl. - В каталоге
InputControlсоздайте новое определение сборки:TestInputControl.asmdef. - Создайте новый класс
TestInputControl.csгде вы реализуете следующие свойства:public static bool MoveLeft { get; set; } public static bool MoveRight { get; set; } public static bool Jump { get; set; } - Вернитесь к определению сборки
PlayModeTestsи добавьте ссылку на вновь созданную:TestInputControl. - Наконец, нам нужно использовать наш
TestInputControlв реальном LostCrypt коде. В настоящее времяInputSystemUnity не поддерживает более простой способ программного выполнения моков, пожалуйста, посмотрите этот git diff, чтобы узнать, что изменить внутриCharacterController2D:
diff --git a/Assets/Scripts/CharacterController2D.cs b/Assets/Scripts/CharacterController2D.cs
index f8a10cf2..e0a62878 100644
--- a/Assets/Scripts/CharacterController2D.cs
+++ b/Assets/Scripts/CharacterController2D.cs
@@ -81,15 +81,15 @@ public class CharacterController2D : MonoBehaviour
// Horizontal movement
float moveHorizontal = 0.0f;
- if (keyboard.leftArrowKey.isPressed || keyboard.aKey.isPressed)
+ if (keyboard.leftArrowKey.isPressed || keyboard.aKey.isPressed || TestInputControl.MoveLeft)
moveHorizontal = -1.0f;
- else if (keyboard.rightArrowKey.isPressed || keyboard.dKey.isPressed)
+ else if (keyboard.rightArrowKey.isPressed || keyboard.dKey.isPressed || TestInputControl.MoveRight)
moveHorizontal = 1.0f;
movementInput = new Vector2(moveHorizontal, 0);
// Jumping input
- if (!isJumping && keyboard.spaceKey.wasPressedThisFrame)
+ if (!isJumping && (keyboard.spaceKey.wasPressedThisFrame || TestInputControl.Jump))
jumpInput = true;
}
Теперь вы готовы! Вернитесь к MovementTest.cs и напишите тест, который не делает никаких утверждений (пока), но только перемещает персонажа Сару и заставляет её иногда прыгать.
Подсказки
- Вы можете использовать
WaitForSecondsв вашем тесте, чтобы сознательно сделать его более длительным и увидеть фактическую анимацию, происходящую на экране. - В случае проблем с компиляцией, пожалуйста, убедитесь, что вы следуете правильной структуре папок:
Tests
InputControl
TestInputControl.asmdef
TestInputControl.cs
PlayModeTests
MovementTest.cs
PlayModeTest.asmdef
Решение
PlayModeTests.asmdef
{
"name": "PlayModeTests",
"references": [
"Unity.InputSystem",
"Unity.InputSystem.TestFramework",
"TestInputControl"
],
"optionalUnityReferences": [
"TestAssemblies"
]
}
MovementTest.cs
using System.Collections;
using UnityEngine;
using UnityEngine.TestTools;
using UnityEngine.SceneManagement;
public class MovementTest
{
[UnityTest]
public IEnumerator MainScene_CharacterIsAbleToJump()
{
SceneManager.LoadScene("Assets/Scenes/Main.unity", LoadSceneMode.Single);
yield return waitForSceneLoad();
yield return GoRight();
yield return new WaitForSeconds(2);
yield return Jump();
yield return new WaitForSeconds(3);
yield return GoLeft();
yield return Jump();
yield return new WaitForSeconds(2);
}
private IEnumerator Jump()
{
TestInputControl.Jump = true;
yield return null;
TestInputControl.Jump = false;
}
private IEnumerator GoRight()
{
TestInputControl.MoveLeft = false;
yield return null;
TestInputControl.MoveRight = true;
}
private IEnumerator GoLeft()
{
TestInputControl.MoveRight = false;
yield return null;
TestInputControl.MoveLeft = true;
}
private IEnumerator waitForSceneLoad()
{
while (SceneManager.GetActiveScene().buildIndex > 0)
{
yield return null;
}
}
}