How to perform an action when a specific string is removed from a list of strings?
Hi, I'm trying to use items through my inventory. I'm attempting to do it in a way that when, say "Health +10" is removed from the list it will add plus 10 to my player's health. The problem is that I'm using Gui.Button and it will remove but it won't add the health. I don't know if this is due to the way I've written the "If removed" or if I just am not using buttons properly. Thank you.
Ex.
At Inventory[0] is the string "Health +10".
if (GUI.Button(new Rect(100, 75, 135, 20), i1)) { Inventory.Remove(Inventory[0]); }
Then.
if(Inventory.Remove("Health +10") { pHealth += 10; }
Answer by Statement · Oct 25, 2015 at 03:17 PM
You could handle it in the place you remove it.
if (GUI.Button(new Rect(100, 75, 135, 20), i1))
{
pHealth += 10;
Inventory.Remove(Inventory[0]);
}
If the Inventory is being changed from other places, you need to wrap the List in a class that fire events when you add or remove stuff.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Example : MonoBehaviour
{
// Instead of using List<string>, we use InventoryList
InventoryList list = new InventoryList();
void Start()
{
// register event handlers
list.onValueAdded += (sender, value) => print("Added " + value);
list.onValueRemoved += (sender, value) => print("Removed " + value);
list.onValueChanged += (sender, index) => print("Changed list[" + index + "] " + sender[index]);
// use the list
list.Add("Pasta");
list.Add("Dog");
list.Add("Student");
list.Remove("Student Loan"); // won't be logged because it doesnt exist.
list[1] = "Creepy Dog";
list.Remove("Creepy Dog");
// Dump some data so we can see what happened
print("List is now accurate. Let's review its contents");
foreach (var item in list)
{
print("Item: " + item);
}
}
}
Let's pause and look at the output before we look at InventoryList.
public class InventoryList : IEnumerable<string>
{
private List<string> list = new List<string>();
public delegate void ValueEvent(InventoryList list, string value);
public delegate void ValueChangedEvent(InventoryList list, int index);
public event ValueEvent onValueAdded;
public event ValueEvent onValueRemoved;
public event ValueChangedEvent onValueChanged;
public InventoryList() { }
public InventoryList(IEnumerable<string> source)
{
list = new List<string>(source);
}
public void Add(string value)
{
list.Add(value);
if (onValueAdded != null)
onValueAdded(this, value);
}
public bool Remove(string value)
{
bool removed = list.Remove(value);
if (removed && onValueRemoved != null)
onValueRemoved(this, value);
return removed;
}
public IEnumerator<string> GetEnumerator()
{
return ((IEnumerable<string>)list).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<string>)list).GetEnumerator();
}
public string this[int index]
{
get { return list[index]; }
set
{
if (list[index] != value)
{
list[index] = value;
onValueChanged(this, index);
}
}
}
}
If you got questions regarding anything, please reply to this comment and I will update the answer.