Version: 6000.3
语言: 中文
4. 伸手棒测试
6. 资产变更测试

5. 碰撞测试

学习目标

检查碰撞当物理引擎检测到两个游戏对象的碰撞器接触或重叠时,当至少一个游戏对象具有刚体组件并且处于运动状态时,就会发生碰撞。更多信息
请参阅术语表
并确保 LostCrypt 不存在允许您的角色移动到地图之外的错误。

锻炼

查看游戏对象Environment/Character Bounds - Left.您可以看到它位于我们 2D 地图的左侧。它旨在保护玩家免于退出地图并掉入纹理中。让我们看看它是否达到了它的目的。

  1. 添加新测试MainScene\_CharacterDoesNotFallIntoTexturesMovementTest.cs.
  2. 让你的角色向左移动,偶尔在跳跃之间有一些等待间隔进行跳跃。
  3. 在测试中,断言 Sara Variant 游戏对象位置在当前的范围内场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
    请参阅术语表
    .

提示

  • 与之前的测试类似,让我们设置一些任意的秒数作为超时。Sara 应在给定时间内保持在场景范围内。
  • 您可能想要使用WaitForSeconds(0.5f)跳跃之间可以更好地模拟用户行为。
  • 研究场景并硬编码 X 和 Y 位置,用于地图外检查,或者更好的是 - 从Character Bounds - Leftgame 对象。

溶液

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;
        }
    }
}

我们的测试失败了,我们的一个示例 Unity 项目中存在一个错误。您将如何解决这个问题?有很多可能性,请继续尝试将其作为本次培训的一部分进行修复:

  • 引入新的字符边界框collider 用于处理对象物理碰撞的不可见形状。碰撞体不需要与对象的网格体形状完全相同 - 在游戏中,粗略的近似值通常更有效且难以区分。更多信息
    请参阅术语表
    这将防止错误发生。
  • 重新设计我们的 Sara 角色碰撞逻辑。
4. 伸手棒测试
6. 资产变更测试