为Unity 3D创建数据管理器

因此,无论考虑什么游戏,您都在考虑创建一个游戏,您肯定会碰到的一件事是如何访问所有角色级别的进度信息。 您可能会考虑将所有内容都放到本地存储中,仅此而已,但是最后,以有组织的方式放置信息可以帮助您简化游戏平衡。

假设我们正在创建一个角色扮演游戏,并且想要设置主要角色级别,我们可以创建一个.xls并组织所有内容,如下所示:

 等级HP BaseAttack
  1100 10
  2 200 15 

使用xls文件是编辑角色属性的简单方法,除了可以广泛了解游戏各个级别的属性外,还可以在单​​独的文件中制作此版本,从而使您可以与其他团队成员共享同一文件,例如作为游戏设计和关卡设计。

现在逐步介绍如何创建数据管理器。 必须有几种不同的解决方案,我在这里介绍的只是其中一种。 在继续之前,数据管理器只不过是用于管理游戏中重要数据的脚本,在此示例中,我们将使用它来管理主要角色级别的属性。

  1. 将.xls文件转换为JSON

编辑字符级进程后,您可以使用任何库将其转换为JSON,我使用了一个称为NPOI的库。 在Unity编辑器中,我们还必须解析JSON文件,为此,我使用了另一个名为SimpleJSON的库。

转换后,您的JSON文件应如下所示:

  [
    {
       “1级,
       “ maxHP”:100,
       “ baseAttack”:10
    },
    {
       “级别”:2,
       “ maxHP”:200,
       “ baseAttack”:15
    }
 ] 

我将此文件称为PlayerLevelData,并将其放在名为Resources / LevelData / PlayerLevelData的文件夹中。

2.创建一个关卡数据对象

下一步是创建一个具有角色属性的类:

 使用System.Collections.Generic;


 [System.Serializable]
公共类PlayerLevelData
 {
     [System.Serializable]
    公共类属性
     {
        公共诠释级别;
         public int maxHP;
        公共浮动基地攻击;
      }
 } 

3.创建一个DataManager

现在,我们实际上可以创建DataManager ,在这种情况下,它将是一个单例(每个人都将访问同一实例)。 我们应该在此处创建的两个重要事项是DataManager的两个属性。 一个将具有从资源中检索JSON值 ,另一个将具有已解析的对象

 公共TextAsset playerLevelDataJson;  // JSON
 
 public PlayerLevelData.Attribute [] playerLevelData;  //解析的数据 

如前所述,我将使用SimpleJSON库简化解析器,您可以在这里找到它:

facebook-csharp-sdk / simple-json

simple-json –用于.NET 2.0 + / SL4 + / WP7 / WindowsStore的JSON库,可选支持dynamic和DataContract

github.com

您唯一要做的是下载SimpleJSON脚本,并将其放入游戏目录内的文件夹中,我通常将其放入名为Scripts / SimpleJSON的文件夹中。 完整的DataManager脚本如下所示:

 使用UnityEngine;
使用System.Collections;
使用UnityEngine.SceneManagement;

公共类DataManager:MonoBehaviour
 {
	私有静态DataManager _Instance;
    公共静态DataManager实例{get {return _Instance;  }}

    公共TextAsset PlayerLevelDataJson;
     public PlayerLevelData.Attribute [] PlayerLevelData;
   
    无效Awake()
     {
        如果(_Instance == null)
         {
             _Instance = this;

             PlayerLevelDataJson =(TextAsset)Resources.Load(“ LevelData / PlayerLevelData”);
            
             ParseData();

             DontDestroyOnLoad(gameObject);
         }
			
     }

    无效的ParseData()
     {
         PlayerLevelData = SimpleJson.SimpleJson.DeserializeObject (PlayerLevelDataJson.text);
       
         Debug.Log(“ JSON Level:” + PlayerLevelDataJson.text);

     }
		
     public PlayerLevelData.Attribute GetPlayerCurrentLevelData(int levelIndex)
     {
        返回PlayerLevelData [levelIndex];
     }
		
 } 

现在,您可以创建一个空的游戏对象并添加此脚本(我称为DataManager),请注意,这些属性是公共的,这样它们将在运行时显示在编辑器中,但是您不必一次将任何内容拖到它们上您运行游戏后,将意识到ParseData将自动填充它们。

现在,您将如何使用它,这取决于创建一个名为PlayerData的脚本,该脚本将具有我们在此处创建的PlayerLevelData引用。 然后,将使用您作为参数在DataManager的GetCurrentLevelData中传递的级别来加载PlayerLevelData,在此处可以看到,每次玩家升级时,当前级别的信息都会在编辑器中显示:

PlayerData脚本的示例:

 使用UnityEngine;
使用System.Collections;


公共类PlayerData:MonoBehaviour
 {

	 public PlayerLevelData.Attribute LevelData;

	 private int _LevelIndex = 0;

	公共int MaxHP;
	公共浮动BaseAttack;

	无效Awake()
	 {
		
		 LevelData = DataManager.Instance.GetPlayerCurrentLevelData(_LevelIndex);

		 Debug.Log(“ Player Level” + LevelData.level);
		 Debug.Log(“ HP:” + LevelData.maxHP);
		 Debug.Log(“ BaseAttack:” + LevelData.baseAttack);

		 Debug.Log(“呼叫级别提高”);

		升级();

		 Debug.Log(“ Player Level” + LevelData.level);
		 Debug.Log(“ HP:” + LevelData.maxHP);
		 Debug.Log(“ BaseAttack:” + LevelData.baseAttack);

	 }
		

	无效的LevelUp()
	 {
		 _LevelIndex = 1;

		 LevelData = DataManager.Instance.GetPlayerCurrentLevelData(_LevelIndex);

	 }
 } 

在此示例中,角色从第一级开始,当我们调用LevelUp函数时,将使用新属性更新该级。

看到现在我们可以简单快速地访问角色级别的任何信息。 我们可以创建各种功能,例如将属性信息带到下一个级别的LevelUp,或者创建更多属性(例如将XP的数量提高到某个级别)。

就是这样,如果某些信息不清楚,您可以在下面的github中下载示例。

erasmosoares / UnityDataManager

UnityDataManager –适用于Unity3D的DataManger

github.com

再见!