Unity 6.3
0 онлайн 57 гостей 3 в системе
Вход
Программирование в Unity Шаг 192 из 210

3. Подвижный характер

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

Как использовать пакеты Unity InputSystem, чтобы иметь общий способ программного перемещения персонажа в тестах.

2010 год

Пожалуйста, убедитесь, что InputSystem установлены в вашем проекте Unity. Вы можете проверить это, проверив Package Manager.

  1. Создайте новый класс с именем MovementTest.cs под Assets/Tests/PlayModeTests.
  2. Добавьте ссылку на Unity.InputSystem и Unity.InputSystem.TestFramework в определение сборки PlayModeTests.
  3. Создайте новый каталог InputControl в Tests: Assets/Tests/InputControl.
  4. В каталоге InputControl создайте новое определение сборки: TestInputControl.asmdef.
  5. Создайте новый класс TestInputControl.cs где вы реализуете следующие свойства: public static bool MoveLeft { get; set; } public static bool MoveRight { get; set; } public static bool Jump { get; set; }
  6. Вернитесь к определению сборки PlayModeTests и добавьте ссылку на вновь созданную: TestInputControl.
  7. Наконец, нам нужно использовать наш TestInputControl в реальном LostCrypt коде. В настоящее время InputSystem Unity не поддерживает более простой способ программного выполнения моков, пожалуйста, посмотрите этот 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;
        }
    }
}