您的位置:首页 > 移动开发 > Unity3D

Unity-3d 用JSON 文本控制程序

2016-05-23 14:06 597 查看
本次的作业是,修改飞碟程序。它使用以下 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文件的内容提取出来。

创建完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对私有域进行序列化

[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<GameInfo>(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<LevelData>(json);
}
}


四、UI界面做相关的显示

拿到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文件存储的内容,





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: