Version: 6000.3
语言: 中文
2. 在 LostCrypt 中运行测试
4. 伸手棒测试

3. 移动角色

学习目标

如何使用 Unity InputSystem 包在测试中以编程方式移动角色的通用方法。

锻炼

请确保 Unity 项目中安装了 InputSystem。您可以通过检查包管理器来验证这一点。

  1. 创建一个名为MovementTest.csAssets/Tests/PlayModeTests.
  2. 将引用附加到Unity.InputSystemUnity.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 代码中。目前 Unity 的InputSystem不支持以编程方式进行模拟的更简单方法,请参阅此 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并编写一个测试,该测试不做任何断言(目前),而只是移动 Sara 角色并使其偶尔跳跃。

提示

  • 您可能想要使用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;
        }
    }
}
2. 在 LostCrypt 中运行测试
4. 伸手棒测试