前言
工作的时间总是会经历了很多心酸和无奈,当然也有成功的喜悦。因为平时工作很忙,自己在学到新东西的时候只能草草的记在笔记本上,不能和别人一起讨论。这是到了年底才有时间发布自己的第一条博客,希望这是一个好的开端,以后多多记录一下自己学到的知识吧。
关于Unity如何在发布PC端程序时使用txt文本配置程序参数
本人所在公司是一家做展馆展示的公司,我们开发完程序后需要将程序发布出来打包发给在现场的调试人员进行测试(公司人手经常不够,我作为一名程序员还经常灰头土脸地跑现场去测试,真是坑啊),现场的人员经常会根据业主的要求对软件进行修改,比如说播放视频路径、发送的串口信号编码、UDP信号编码、图片的大小等等,如果这些都由程序员来改,程序员需要修改完软件后再将软件重新发布并且打包发给现场人员,这样就无疑就给自己和其他人添加了很多不必要的工作负担(主要是自己懒得一次次给他们改)。所以这时就需要做一个可以有配置文件功能的软件,发给现场让他们自己玩去吧(当然,也不是什么参数都能让他们随便乱改的)。
步骤
1、首先在工程根目录下建立一个StreamingAssets文件夹,并在里面创建一个txt文档,名为Config(名称可以随便取,只要可以获取的到)。2、打开这个txt文件,在里面输入如下测试参数。
3、点击另存为,编码一定要选成UTF-8,点击保存。
4、创建一个脚本,取名为ConfigTest,在其中输入如下代码,点击保存,并将其挂载到场景中的物体上(注意我脚本里的注释)。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;
/// <summary>
/// 配置文件读取
/// </summary>
public class ConfigTest : MonoBehaviour
{
private string configPath;
//在实际项目中我一般不会用静态类,在有频繁跳转场景的时候很容易出问题
//public static Dictionary<string, Dictionary<string, string>> dic;
public Dictionary<string, Dictionary<string, string>> dic;
private void Awake()
{
//读取配置文件(StreamingAssets)路径
configPath = Path.Combine(Application.streamingAssetsPath, "Config.txt");
if (dic == null)
{
dic = new Dictionary<string, Dictionary<string, string>>();
LoadConfig();
}
}
/// <summary>
/// 读取所有的数据
/// </summary>
void LoadConfig()
{
string[] lines = null;
if (File.Exists(configPath))
{
lines = File.ReadAllLines(configPath);
BuildDic(lines);
}
}
/// <summary>
/// 处理所有数据
/// </summary>
/// <param name="lines"></param>
private void BuildDic(string[] lines)
{
string mainKey = null;//主键
string subKey = null;//子键
string subValue = null;//值
foreach (var item in lines)
{
string line = null;
line = item.Trim();//去除空白行
if (!string.IsNullOrEmpty(line))
{
if (line.StartsWith("["))//取主键
{
mainKey = line.Substring(1, line.IndexOf("]") - 1);
if (dic.ContainsKey(mainKey))
{
return;
}
dic.Add(mainKey, new Dictionary<string, string>());
}
else//取主键
{
var configValue = line.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
subKey = configValue[0].Trim();
subValue = configValue[1].Trim();
subValue = subValue.StartsWith("\"") ? subValue.Substring(1) : subValue;
dic[mainKey].Add(subKey, subValue);
}
}
}
}
}
4、再创建一个测试脚本,在其中输入如下代码,点击保存,并将其挂载到场景中的物体上,并将挂载这ConfigTest脚本的物体拖拽到该物体的测试脚本上。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test0 : MonoBehaviour
{
//配置文件类
public ConfigTest configtest;
//整型参数1、2、3
int number1, number2, number3;
//浮点型参数4、5、6
float number4, number5, number6;
//字符串参数
string zi0, zi1, zi2;
// Use this for initialization
void Start ()
{
BeginString();
StartCoroutine(ToShowThis());
}
/// <summary>
/// 初始化字符串
/// </summary>
void BeginString()
{
number1 = int.Parse(configtest.dic["整型"]["int0"]);
number2 = int.Parse(configtest.dic["整型"]["int1"]);
number3 = int.Parse(configtest.dic["整型"]["int2"]);
number4 = float.Parse(configtest.dic["浮点型"]["float0"]);
number5 = float.Parse(configtest.dic["浮点型"]["float1"]);
number6 = float.Parse(configtest.dic["浮点型"]["float2"]);
zi0 = configtest.dic["字符串型"]["string0"];
zi1 = configtest.dic["字符串型"]["string1"];
zi2 = configtest.dic["字符串型"]["string2"];
}
/// <summary>
/// 使用一个协程,将txt文档里的数据打印出来
/// </summary>
/// <returns></returns>
IEnumerator ToShowThis()
{
yield return new WaitForSeconds(0.1f);
Debug.Log(number1.ToString());
Debug.Log(number2.ToString());
Debug.Log(number3.ToString());
Debug.Log(number4.ToString());
Debug.Log(number5.ToString());
Debug.Log(number6.ToString());
Debug.Log(zi0 + zi1 + zi2);
}
}
5、运行程序,可以看到txt文档里的参数被打印出来了。
6、基本用法就是这样了,还是需要在实际工作中多练多学,才能熟能生巧,用起来游刃有余。