5-5 Inventory System - Using JSON
本章開始要來製作背包系統,背包系統包含玩家的背包、倉庫、裝備、人物屬性、鍛造合成、商店功能等等,接下來的教學會一步一步製作遊戲的背包系統,並嘗試將原本寫好的武器系統改寫並納入背包中。
首先簡單介紹一下我的背包系統使用JSON格式記錄每個物件的資料,Unity內建JsonUtility解析JSON格式,若有不了解的地方,請先看看以下文章:
[UNITY] 使用內建的JSONUTILITY 遊戲讀存檔案 --2017.11.20更新
http://sammaru.blogspot.tw/2017/03/unity-jsonutility.html
JSON Serialization
https://docs.unity3d.com/Manual/JSONSerialization.html
當然大家也可以考慮使用XML、SQL、NoSQL等各種不同的資料儲存方式,我認為使用JSON傳輸資料最方便,需要透過網路更新時,使用Web Service的方式取得JSON資料,再寫入到本地的資料庫中。XML格式也可以考慮,但是撰寫的格式繁瑣了點,而且目前最流行的規格是JSON嘛!
先來自行寫一個簡單的JSON資料吧,取名叫Items.json,並放在Resources資料夾中。我們會使用Resource.Load方法讀取JSON資料。
Items.json:
然後新增五個Script,分別是負責讀取資料的InventorySystem.cs、物件的基礎類別Item.cs、消耗品Consumable.cs、裝備Equipment.cs、鍛造素材Materials.cs。
以下提供程式碼,說明也寫在註解中了,這一步驟沒有很難就不需要太多說明。
InventorySystem.cs:
Item.cs:
Consumable.cs:
Equipment.cs:
Materials.cs:
於場景中新增一個Empty GameObject取名為InventorySystem。
將InventorySystem.cs拉進去。
執行遊戲後,從console視窗可以確認是否正確解析JSON資料。
首先簡單介紹一下我的背包系統使用JSON格式記錄每個物件的資料,Unity內建JsonUtility解析JSON格式,若有不了解的地方,請先看看以下文章:
[UNITY] 使用內建的JSONUTILITY 遊戲讀存檔案 --2017.11.20更新
http://sammaru.blogspot.tw/2017/03/unity-jsonutility.html
JSON Serialization
https://docs.unity3d.com/Manual/JSONSerialization.html
當然大家也可以考慮使用XML、SQL、NoSQL等各種不同的資料儲存方式,我認為使用JSON傳輸資料最方便,需要透過網路更新時,使用Web Service的方式取得JSON資料,再寫入到本地的資料庫中。XML格式也可以考慮,但是撰寫的格式繁瑣了點,而且目前最流行的規格是JSON嘛!
先來自行寫一個簡單的JSON資料吧,取名叫Items.json,並放在Resources資料夾中。我們會使用Resource.Load方法讀取JSON資料。
Items.json:
{"ItemEntityList":[ { "ID":1, "Name":"血量瓶", "ItemTypeString":"Consumable", "ItemQualityString":"Common", "Description":"+ 25 HP", "Capacity":10, "BuyPrice":10, "SellPrice":10, "Sprite":"Sprites/Items/hp", "HP":10, "MP":0 }, { "ID":1, "Name":"能量瓶", "ItemTypeString":"Consumable", "ItemQualityString":"Common", "Description":"+ 50 MP", "Capacity":10, "BuyPrice":10, "SellPrice":10, "Sprite":"Sprites/Items/mp", "HP":0, "MP":10 } ]}
然後新增五個Script,分別是負責讀取資料的InventorySystem.cs、物件的基礎類別Item.cs、消耗品Consumable.cs、裝備Equipment.cs、鍛造素材Materials.cs。
以下提供程式碼,說明也寫在註解中了,這一步驟沒有很難就不需要太多說明。
InventorySystem.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; namespace RPG.Inventory{ public class InventorySystem : MonoBehaviour { ItemList itemList; void Start () { ParseItemsJson (); } void Update () { } private void ParseItemsJson(){ // 從Resource資料夾中讀取Items.json TextAsset json = Resources.Load("Items"); // 解析Json格式 itemList = JsonUtility.FromJson (json.text); // 使用foreach迴圈讀取List中的Item資料 foreach (Item entity in itemList.ItemEntityList) { print (entity.Name); print (entity.Type); print (entity.Quality); print (entity.Sprite); } } } }
Item.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; namespace RPG.Inventory{ [Serializable] public class ItemList{ public List- ItemEntityList; } [Serializable] public class Item : ISerializationCallbackReceiver{ public int ID; public string Name; public string ItemTypeString; public string ItemQualityString; // 目前Unity提供的JsonUtility不支援enum型別的轉換,所以此處指定為NonSerialized代表不解析 [NonSerialized] public ItemType Type; [NonSerialized] public ItemQuality Quality; public string Description; public int Capacity; public int BuyPrice; public int SellPrice; public string Sprite; public void OnAfterDeserialize(){ // JSON格式解析後,將ItemTypeString,ItemQualityString轉換成enum型別 Type = (ItemType)System.Enum.Parse (typeof(ItemType), ItemTypeString); Quality = (ItemQuality)System.Enum.Parse (typeof(ItemQuality), ItemQualityString); } public void OnBeforeSerialize(){} } public enum ItemType{ Consumable, Equipment, Weapon, Material } public enum ItemQuality{ Common, Uncommon, Rare, Epic, Legendary, Artifact } }
Consumable.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; namespace RPG.Inventory{ [Serializable] public class Consumable{ public int HP; public int MP; } }
Equipment.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; namespace RPG.Inventory{ [Serializable] public class Equipment : ISerializationCallbackReceiver { public int Strength; public int Intellect; public int Agility; public int Stamina; public string EquipmentTypeString; [NonSerialized] public EquipmentType TheEquipmentType; public void OnAfterDeserialize(){ TheEquipmentType = (EquipmentType)System.Enum.Parse (typeof(EquipmentType), EquipmentTypeString); } public void OnBeforeSerialize(){} } public enum EquipmentType{ Head, Neck, Ring, Leg, Bracer, Boots, Trinket, Shoulder, Belt, OffHand } }
Materials.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; namespace RPG.Inventory{ [Serializable] public class Material : Item { } }
於場景中新增一個Empty GameObject取名為InventorySystem。
將InventorySystem.cs拉進去。
留言
張貼留言