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

本次的作业是,修改飞碟程序。它使用以下 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文件,提取相应信息,赋值即可。
Unity-3d 用JSON 文本控制程序_第1张图片
Unity-3d 用JSON 文本控制程序_第2张图片
Unity-3d 用JSON 文本控制程序_第3张图片

二、将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(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);
        }
    }

四、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();

Unity-3d 用JSON 文本控制程序_第4张图片

小小的游戏展示:可以看到显示了json文件存储的内容,

Unity-3d 用JSON 文本控制程序_第5张图片
Unity-3d 用JSON 文本控制程序_第6张图片
Unity-3d 用JSON 文本控制程序_第7张图片

你可能感兴趣的:(大二,3d,游戏)