游戏测试 开发基于 Unity 的测试工具入门篇

孤心修剑 · November 23, 2019 · Last by geons replied at December 01, 2019 · 1134 hits

主题:通过一个小需求,讲解如何开发基于Unity的测试工具

一:需求与需求分析

原因

测试中,进行GM作弊测试时,需要自己在聊天频道输入各种作弊指令,每次输入需要查看指令文档,不方便。

需求

在Unity中开发一个集成大多数GM指令的界面工具

需求分析

1.c#基础知识
2.unity基础知识,涉及到的主要类:EditorWindow
3.游戏框架代码,涉及到的主要类:主运行程序、通信类、协程相关

二:代码实现

1.一段简单的代码

在\Assets\Editor文件夹下新建一个类(TestTool),该类继承自EditorWindow,还需要引用UnityEditor命名空间。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEditor;
using UnityEngine;

namespace Assets.Editor.QATools
{
public class TestTool : EditorWindow
{

//下面这个特性是在Unity的工具栏的入口
[MenuItem("GStore/QA测试工具/作弊测试工具")]
static void ShowWindow()
{
EditorWindow.GetWindow(typeof(TestTool), true, "作弊测试工具");
}

string str_cmd = "";
GUIStyle style_red = new GUIStyle("Button");
GUIStyle style_green = new GUIStyle("Button");

private void Awake()
{
//颜色字体样式
style_red.normal.textColor = Color.red;
style_green.normal.textColor = Color.green;
}

void OnGUI()
{
GUILayout.Space(10f);
GUILayout.BeginHorizontal();
{
//GUILayout.Label 文本显示
GUILayout.Label("作弊指令:", GUILayout.Width(50f));
//文本字段
str_cmd = GUILayout.TextField(str_cmd, GUILayout.ExpandWidth(true));
}
if (GUILayout.Button("提交", GUILayout.ExpandWidth(true)))
{
SubmitCmd(str_cmd);
}
GUILayout.EndHorizontal();

GUILayout.Space(10f);
GUILayout.BeginHorizontal();

if (GUILayout.Button("加道具", style_red, GUILayout.ExpandWidth(true)))
{
SubmitCmd("additem 10101 1");
}
if (GUILayout.Button("批量加道具", style_green,GUILayout.ExpandWidth(true)))
{
ArrayList list_cmds = new ArrayList()
{
"additem 10101 1",
"additem 10102 1"
};
//请使用游戏中的全局携程
//XXXXX.StartCoroutine(ExecuteCmds(list_cmds));
}
GUILayout.EndHorizontal();
}

/// <summary>
/// 批量执行GM指令
/// </summary>
/// <param name="invincible">作弊指令列表</param>
/// <returns></returns>
public IEnumerator ExecuteCmds(ArrayList list_cmds)
{
foreach (string cmd in list_cmds)
{
SubmitCmd(cmd);
yield return new WaitForSeconds(1);
}
}

/// <summary>
/// 发送作弊指令给服务器
/// </summary>
/// <param name="cmd">作弊指令</param>
void SubmitCmd(string cmd)
{
//调游戏代码
}

}
}

2.常用方法说明

一般我们只要使用Button、TextField、Label等就可以实现我们的测试工具。
更多的方法可以查看Unity手册:http://docs.manew.com/Script/index.htm

下拉框、单选框等等看上面的资料就行了,都有例子。

3.其他

作弊指令工具,主要需要操作策划配置文档,自动读取数据。通过开发的工具可以省去自己去查找数据的时间。
如下面的例子:给所有英雄加亲密度
方法一:读配置表,获取所有英雄。

/// <summary>
/// 添加所有英雄的亲密度
/// </summary>
/// <returns></returns>
private IEnumerator TestAddHeroIntimacy()
{
Dictionary<ulong, CSVHero> dict_heros = CSVHero.GetAllDic();
string cmdCode = "";
foreach (var item in dict_heros)
{
if (item.Value.hero_id > 1000)
{
cmdCode = string.Format("addHeroIntimacy {0} {1}", item.Value.hero_id, 100000);
yield return new WaitForSeconds(2);
SendCheatCode(cmdCode);
}
}
}

方法二:直接调游戏代码,获取所有英雄。
示例:略。

三:扩展

例如通过Button调用我们写好的Python脚本等。
例如数据检查脚本等等。
内嵌到Unity的测试工具,直接使用客户端部分代码,个人认为可以降低开发测试工具的开发难度,提高测试工具的使用率和效率。

共收到 1 条回复 时间 点赞

其实这个对游戏是有入侵性的,不如将GM接口随着游戏启动后进行注册,建立一个HTTP Server,使用外部连接游戏客户端主动进行GM调用

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up