These are the modifications included in the Inventory System Package
The following scripts contain updated code that is already integrated the Inventory System Unity Package.
IMPORTANT: You may get a compile error in your code when importing the InventorySystem Package due to inconsistencies between using the GameData variable: score, sometimes the variable totalScore was used with the same meaning. Fix the error: I recommend using score / Score, instead of totalScore/TotalScore, because it is what is used in subsequent code for Project 3 - LevelManager.cs
The error above may show up in PlayerStats.cs: Make the following change
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//combines frontEnd UI and BackEnd
public class PickUp : MonoBehaviour {
public ItemInstance itemInstance;
private int value;
//read-only property
public int Value
{
get { return value; }
}
private void Start()
{
this.value = itemInstance.item.value;
}
/// <summary>
/// Adds the item to GameData Inventory
/// Can be executed by button.onClick
/// when added as a listener
/// </summary>
public void AddItem( ) //can be called onClick for a button
{
GameData.instanceRef.AddItem(this.itemInstance);
}
}//end class PickUp
GameData Changes:
Updated Class GameData with CustomEvent and Inventory, AddItem(ItemInstance), BoostHealth( ), BoostExperience( )
IMPORTANT: You may get a compile error in your code due to inconsistencies between using the GameData variable: score, sometimes the variable totalScore was used with the same meaning. Fix the error: I recommend using score / Score, instead of totalScore/TotalScore, because it is what is used in subsequent code for Project 3 - LevelManager.cs
GameData: Final Version
updated Apr 3,2020
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
///4/3/2020
//Singleton - one and only 1 ever in existance
//global variable to allow easy access
public class GameData : MonoBehaviour
{
/// static means it belongs to the Class, and not to an object instance of the class
public UnityEvent onPlayerDataUpdate = new UnityEvent();
public static GameData instanceRef; ///Global variable
public Inventory inventory;//Scriptable Object
private Dictionary<string, string> choiceData = new Dictionary<string, string>();
/// <summary>
/// Properties - provide read/write access to variables
/// </summary>
private int levelScore;
private int score; //some versions use totalScore
private int health;
private int experience;
private int lives;
private int maxExperience = 100;
public bool miniGameWinner = false;
//Properties - Support Encapsulation - protect inner workings of our class
public int Score //some versions use TotalScore
{
get { return score; } //read only access
}
public int LevelScore
{
get { return levelScore; }
set { levelScore = value; }
}
public int Lives
{
get { return lives; }
set { lives = value; }
}
public int Experience
{
get { return experience; } //read only access
}
public int Health
{
get { return health; } //read only access
}
private void Awake()
{
health = 100; //initialize
score = 0;
if (instanceRef == null)
{
instanceRef = this; //point to itself
DontDestroyOnLoad(this.gameObject); //this will never be destroyed
}
else
{
Destroy(this.gameObject);
Debug.Log("Duplicate GameData is Destroyed");
}
}
/// <summary>
/// Add the specified item.
/// Overloaded method
/// takes the ItemInstance item as input parameter
/// </summary>
/// <param name="item">Item.</param>
///
public void AddItem(ItemInstance item)
{
inventory.InsertItem(item);
//inventory invokes onInventoryUpdate event
}
/// <summary>
/// Add the specified value.
/// Overloaded method
/// takes the PickUp item's value as input parameter
/// </summary>
/// <param name="value">Value.</param>
public void Add(int value)
{
score += value;
levelScore += value; //Make sure you have this line of code
Debug.Log("Score is updated " + score);
InvokePlayerDataUpdate();
}
public void BoostHealth(int value)
{
health += value;
health = Mathf.Min(health, 100);
Debug.Log("boosting health, new health " + health);
InvokePlayerDataUpdate();
}
public void BoostExperience(int value)
{
experience += value;
experience = Mathf.Min(experience, maxExperience);
Debug.Log("boosting experience: " + experience);
InvokePlayerDataUpdate();
}
//updated TakeDamage: 4/24/19
public void TakeDamage(int value)
{
health -= value;
if (health < 0) health = 0; //makes sure health !< 0
Debug.Log("Health is updated " + health);
InvokePlayerDataUpdate();
}
public void InvokePlayerDataUpdate()
{
if (onPlayerDataUpdate != null)
{
onPlayerDataUpdate.Invoke();
}
}
public void SaveChoice(string choiceKey, string choiceValue)
{
if (choiceData.ContainsKey(choiceKey))
{
choiceData[choiceKey] = choiceValue; //change stored value
Debug.Log("Choice Changed" + choiceKey + " : " + choiceValue);
}
else
{
choiceData.Add(choiceKey, choiceValue); //adds key,value pair
Debug.Log("Choice Data Created" + choiceKey + " : " + choiceValue);
}
}
public string GetChoice(string choiceKey)
{
string choiceValue = "None";
choiceData.TryGetValue(choiceKey, out choiceValue);
Debug.Log("Choice Data Accessed" + choiceKey + " : " + choiceValue);
return choiceValue;
}
//to restart entire game
public void ResetGameData()
{
health = 100; //initialize
score = 0;
experience = 0;
//inventory.inventory.Clear();
miniGameWinner = false;
}
//to restart miniGame
public void ResetMiniGameData()
{
health = 100; //initialize
score = 0;
levelScore = 0;
}
} //end class