Я работаю над игрой с использованием Unity Engine и C#. Я новичок.
Я создал пользовательский класс с именем "Item", основанный на объектах, которые можно создавать в сценариях, и является основой для элементов в моей игре. Объект типа Item хранится в «Inventory», другом классе, который содержит функции «Добавить и удалить» для добавления и удаления объектов типа Item из инвентаря. В настоящее время я работаю над функциями сохранения и загрузки для игры, и, поскольку я не могу сохранить объекты типа Item, сериализовав их в двоичный файл и поместив их в постоянный путь данных, я вместо этого создал код, который сохраняет NAME of пункт. У меня такой вопрос: как мне создать и добавить объект Item (Мой пользовательский класс) только из строки его имени. (Свойство Item.name совместно с фактическим именем объекта в Unity) , Я добавил Комментарии к своему коду, чтобы облегчить понимание того, что я пытаюсь сделать.
Вот элемент класса:
public class Item : ScriptableObject
{
new public string name = "New Item";
public Sprite icon = null;
public bool isDefaultItem = false;
public virtual void Use()
{
Debug.Log("USING: " + name);
}
public void RemoveFromInventory()
{
Inventory.instance.Remove(this);
}
}
Вот список классов, который содержит функции Add и Remove, принимая Item:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Text;
public class Inventory : MonoBehaviour
{
public static Inventory instance;
private bool alreadyExists = false;
public static int space = 20;
Vector3 playerPosition;
private void Awake()
{
if (instance != null)
{
Debug.LogWarning("More than 1 inventory");
return;
}
instance = this;
}
public List<Item> items = new List<Item>();
public static List<string> index = new List<string>();
public delegate void OnItemChanged();
public OnItemChanged onItemChangedCallback;
//These are the functions to add and remove an item to the inventory, Taking in an item, of type Item, from my custom class Item.
public bool Add (Item item)
{
if (!item.isDefaultItem)
{
if (items.Count >= space)
{
Debug.Log("NOT ENOUGH SPACE IN INV");
return false;
}
items.Add(item);
index.Add(item.name);
}
if (onItemChangedCallback != null)
onItemChangedCallback.Invoke();
return true;
}
public void Remove(Item item)
{
items.Remove(item);
index.Remove(item.name);
if (onItemChangedCallback != null)
onItemChangedCallback.Invoke();
}
}
Вот класс, который фактически содержит код, в котором лежит проблема; где мне нужно каким-то образом создать экземпляр или создать Предмет и добавить его в инвентарь от имени Предмета. См. LoadInv (), где мне нужно его поместить.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Text;
public class InventoryAttached : MonoBehaviour
{
public string[] invArray;
string all;
//This is the Saving Seperator
char[] delimiter = { '.' };
public void SaveInv()
{
InvSaveSystem.SaveInv(this);
}
public void LoadInv()
{
//Code that gets data for the items that need to be added to the inventory
InvData data = InvSaveSystem.LoadInv(); //This is the Data from my binary formatter
all = ConvertStringArrayToString(data.invSlot);
invArray = all.Split(delimiter);
//For loop that iterates through the inventory array containing the names of the items stored in the inventory
for (int i = 0; i < invArray.Length; i++)
{
Debug.Log(invArray[i]);
//Here, I would like to use my Add function to add the items to the inventory
// It would look something like this: Inventory.instance.Add(invArray[i[]);
}
}
static string ConvertStringArrayToString(string[] array) //Converter Code used to convert to and from string arrays
{
// Concatenate all the elements into a StringBuilder.
StringBuilder builder = new StringBuilder();
foreach (string value in array)
{
builder.Append(value);
builder.Append('.');
}
return builder.ToString();
}
static string ConvertStringArrayToStringJoin(string[] array)
{
// Use string Join to concatenate the string elements.
string result = string.Join(".", array);
return result;
}
}
Просто для справки, здесь есть класс InvData, который содержит строковый массив, который моя система сохранения форматирует в двоичный файл и сохраняет на HD.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using System.Text.RegularExpressions;
[System.Serializable]
public class InvData
{
public string[] invSlot;
public InvData(InventoryAttached inv)
{
invSlot = new string[Inventory.index.Count];
for (int i = 0; i < Inventory.index.Count; i++)
{
invSlot[i] = Inventory.index[i];
}
}
}