I am just getting into this whole Wrapping aspect to JsonUtility and I am having a slight issue. When I am looking at my RewardItem they always seem to be empty. Here are my classes.
[Serializable]
public class QuestData {
public int ID;
public string Name;
public int MinimumLevel;
public int[] QuestsNeeded;
public string Description;
public string ShortDescription;
public string WaitingDialogue;
public string FinishedDialogue;
public int Experience;
// The Items received from the quest.
public RewardItem ChooseItemData;
public RewardItem RewardItemData;
public string QuestType;
public KillType QuestKillCount;
public TalkType QuestTalk;
public bool Retired;
/// <summary>
/// Quest Data for a Kill Quest.
/// </summary>
public QuestData (int id, string questName, int minlevel, string questsNeeded, string description, string shortDescription, string waitingDialogue, string finishedDialogue,
int experience, string rewardItemIDs, string rewardItemAmounts, string chooseItemIDs, string chooseItemAmounts, string questType, string killNames, string killAmounts,
string talkNpcNames, string talkSceneNames, bool isRetired) {
this.ID = id;
this.Name = questName;
this.MinimumLevel = minlevel;
this.QuestsNeeded = Array.ConvertAll(questsNeeded.Split(','), int.Parse);
this.Description = description;
this.ShortDescription = shortDescription;
this.WaitingDialogue = waitingDialogue;
this.FinishedDialogue = finishedDialogue;
this.Experience = experience;
this.QuestType = questType;
this.Retired = isRetired;
// IF we dont have an empty string letting us know we want to give rewards this way,
// ELSE we have an empty string so we make a empty RewardItem.
if (!String.IsNullOrEmpty (rewardItemIDs)) {
this.RewardItemData = new RewardItem (Array.ConvertAll (rewardItemIDs.Split (','), int.Parse), Array.ConvertAll (rewardItemAmounts.Split (','), int.Parse));
} else {
this.RewardItemData = new RewardItem ();
}
// IF we dont have an empty string letting us know we want to give rewards this way,
// ELSE we have an empty string so we make a empty Choose Reward Item.
if (!String.IsNullOrEmpty (chooseItemIDs)) {
this.ChooseItemData = new RewardItem (Array.ConvertAll (chooseItemIDs.Split (','), int.Parse), Array.ConvertAll (chooseItemAmounts.Split (','), int.Parse));
} else {
this.ChooseItemData = new RewardItem ();
}
// IF we dont have an empty string letting us know we have a Kill Quest,
// ELSE no kill quest.
if (!String.IsNullOrEmpty (killNames)) {
this.QuestKillCount = new KillType (killNames.Split (','), new int[killNames.Split(',').Length], Array.ConvertAll(killAmounts.Split(','), int.Parse));
} else {
this.QuestKillCount = new KillType ();
}
// IF we dont have an empty string letting us know we have a Talk Quest,
// ELSE no talk quest.
if (!String.IsNullOrEmpty (talkNpcNames)) {
this.QuestTalk = new TalkType (talkNpcNames.Split (','), talkSceneNames.Split (','));
} else {
this.QuestTalk = new TalkType ();
}
}
}
This Quest_List code here is what I put into a JsonUtility method and then save to PlayerPrefs.
[Serializable]
public class Quest_List {
// The Lists of quests that fall into the Accepted section.
public List<QuestData> questAccepted = new List<QuestData> ();
public List<QuestData> questReadyToTurnIn = new List<QuestData> ();
public List<QuestData> questCompleted = new List<QuestData> ();
// The Lists of quests that fall into the Not Accepted section.
public List<QuestData> questAcceptable = new List<QuestData> ();
public List<QuestData> questSoon = new List<QuestData> ();
public List<QuestData> questTooHigh = new List<QuestData> ();
}
My class I use for my rewards.
[Serializable]
public class RewardItem {
private int[] rewardItemIDs;
private int[] rewardItemAmounts;
public RewardItem (int[] itemID, int[] itemAmount) {
this.rewardItemIDs = itemID;
this.rewardItemAmounts = itemAmount;
}
public RewardItem () {
this.rewardItemIDs = new int[0];
this.rewardItemAmounts = new int[0];
}
public int[] GetItemIDs () {
return this.rewardItemIDs;
}
public int[] GetItemAmounts () {
return this.rewardItemAmounts;
}
}
The wrapper that I use currently :
public static class JsonHelper {
public static string ToJson<T> (T items) {
Wrapper<T> wrapper = new Wrapper<T>();
wrapper.Items = items;
return JsonUtility.ToJson(wrapper, true);
}
[Serializable]
private class Wrapper<T> {
public T Items;
}
}
How I initialize my DB.
private void ConstructQuestDatabase (int level) {
// Loop the amount of quest we have.
for (int i = 0; i < questJsonData.Count; i++) {
// Add to our Quest Data.
questDatabase.Add (new QuestData (
QuestDataInt (i, "id"),
QuestDataString (i, "name"),
QuestDataInt (i, "minimumlevel"),
QuestDataString (i, "questsneeded"),
QuestDataString (i, "description"),
QuestDataString (i, "shortdescription"),
QuestDataString (i, "waitingdialogue"),
QuestDataString (i, "finishdialogue"),
QuestDataInt (i, "experience"),
QuestDataString (i, "ChooseItemData"),
QuestDataString (i, "RewardItemData"),
QuestDataString (i, "questtype"),
QuestDataString (i, "killtype", "name"),
QuestDataString (i, "killtype", "amount"),
QuestDataString (i, "talktype", "npcname"),
QuestDataString (i, "talktype", "scenename"),
QuestDataBool (i, "retired")
));
}
}
And now the method/code in which I use the above classes :
public void Save () {
Quest_List questContainer = new Quest_List ();
questContainer.questAccepted = questAccepted;
questContainer.questReadyToTurnIn = questReadyToTurnIn;
questContainer.questCompleted = questCompleted;
string questToJson = JsonHelper.ToJson (questContainer);
// Save the information.
PlayerPrefs.SetString ("Quest_Status", questToJson);
print (questToJson);
}
This is what I see when I print :
Now if we look at the QuestAccepted part you will see 4 in that image that are empty (The 2 rewards and the Kill and Talk based quests) and I know when I solve the issue for one I can apply it to the other ones but at the moment I just cannot figure out how to get that part to not be empty.