Создание объекта моего пользовательского класса из строки - PullRequest
0 голосов
/ 11 марта 2020

Я работаю над игрой с использованием 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];
        }
    }



}

1 Ответ

0 голосов
/ 12 марта 2020

.AddComponent (Type.GetType ( "type_name"));

...