主题:通过一个小需求,讲解如何开发基于 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 的测试工具,直接使用客户端部分代码,个人认为可以降低开发测试工具的开发难度,提高测试工具的使用率和效率。


↙↙↙阅读原文可查看相关链接,并与作者交流