本次的作业是,修改飞碟程序。它使用以下 JSON 文本控制程序(你可以自由添加内容)
1、远程控制目录(有四个Json文件)
game_info.json - {“version”:1.2 ,”totolRound”:3, …}
disk_level_1.json - {“title”:”Round 1”, “turn”:10, “diskEachTurn”:1, “speedMax”:10, “speedMin”:8, “color”=”gray,red”, … }
2、修改飞碟程序,并发布
由于我是二年级生,所以很多大的思路都来源于大三师兄的博客。
尤其是胡江川师兄。他的博客写的十分的完整、易懂。所以这门课在他的博客上面我真的是受益匪浅。
传送门:Simba的博客
好了我们来看下这一次的作业。要求用json文件来存储游戏的信息。这是一个在实际游戏中常见,也是十分重要的功能。这一次我们用json简单地模拟一下其读写。
其中保存了每一关的信息。包括飞碟的颜色,发射的位置,发射的方向,发射的速度,第几回合等等。根据这些信息在初始化的时候我们就可以直接读取json文件,提取相应信息,赋值即可。
创建完json文件之后我们要考虑的问题就是如何将json文件变成data.根据课上的内容以及一些文档的提示。
首先我们创建一个FileManager.cs的脚本
可以通过如下的方法拿到我们的数据:
// 输入关卡文件名,启动协程读取文件
public void loadLevelJson(string name)
{
url = "file://" + Application.dataPath + "/Data/" + name;
Debug.Log(url);
StartCoroutine(LoadLevel());
}
IEnumerator LoadLevel()
{
if (url.Length > 0)
{
WWW www = new WWW(url);
yield return www;
if (!string.IsNullOrEmpty(www.error))
Debug.Log(www.error);
else
scene.stageLevel(www.text.ToString()); // 返回json字符串给scene
}
}
拿到数据后返回给SceneController,里面创建相关的函数对拿到的数据进行赋值。
而在SenceController处赋值方法如下:
public void stageLevel(string json)
{
//获取相关json数据
LevelData data = LevelData.CreateFromJSON(json);
int emitNum = data.emitNum;
float speed = data.speed;
_judge.disksEachRound = emitNum;
_judge.round = data.round;
//配置发射环境
Vector3 emitPos = new Vector3(data.emitPosX, data.emitPosY, data.emitPosZ);
Vector3 emitDir = new Vector3(data.emitDirX, data.emitDirY, data.emitDirZ);
_gameModel.setting(1, color, emitPos, emitDir.normalized, speed, emitNum);
}
同样的方法适用于disk_level_1.json
这样子我们就完成了FileManager.cs文件。将其挂载主摄像机上。
[SerializeField] Attribute
强制unity去序列化一个私有域
这是一个内部的unity序列化功能,有时候我们需要Serialize一个private或者protected的属性,这个时候可以使用[SerializeField]这个Attribute:
在Unity最新的UI系统中,UI属性上方全部添加[SerializeField] ,如下所示
[SerializeField]
private Button btn1;
SerializeField参考文档:
http://game.ceeger.com/Script/Attributes/SerializeField.html
因此,我们在SceneController中gameinfo和disklevel进行序列化
[SerializeField]
public class GameInfo
{
public string version;
public int totalRound;
public static GameInfo CreateFromJSON(string json)
{
return JsonUtility.FromJson(json);
}
}
[SerializeField]
public class LevelData
{
public string color;
public int emitNum;
public float emitPosX, emitPosY, emitPosZ;
public float emitDirX, emitDirY, emitDirZ;
public float speed;
public int round;
public static LevelData CreateFromJSON(string json)
{
return JsonUtility.FromJson(json);
}
}
拿到game_info的数据后肯定要显示在主界面上。
我们将这些数据都写在我们的控制器中,并将其置为Public变量。
public string _version;
public int _totalRound;
public Color color;
然后在UI中对Text进行赋值
string gameinfo = "version : " + SceneController.getInstance()._version;
gameInfoText.text = gameinfo;
roundText.text = "Round: " + queryInt.getRound().ToString() + "/" + SceneController.getInstance()._totalRound;
scoreText.text = "Score: " + queryInt.getPoint().ToString();
小小的游戏展示:可以看到显示了json文件存储的内容,