C# - 将类的新实例添加到数组

时间:2018-03-22 18:14:35

标签: c# unity3d

我对C#很新,所以请原谅我,如果我问的是愚蠢的问题,或者我的问题不正确。

这是我的代码:

using UnityEngine;
using System;

namespace DuloGames.UI
{
    [Serializable]
    public class UISpellInfo
    {
        public int ID;
        public string Name;
        public Sprite Icon;
        public string Description;
        public float Range;
        public float Cooldown;
        public float CastTime;
        public float PowerCost;
        public float test;

        [BitMask(typeof(UISpellInfo_Flags))]
        public UISpellInfo_Flags Flags;
    }
}

这是我的UIspellDatabase课程:

using UnityEngine;

namespace DuloGames.UI
{
    public class UISpellDatabase : ScriptableObject {

        #region singleton
        private static UISpellDatabase m_Instance;
        public static UISpellDatabase Instance
        {
            get
            {
                if (m_Instance == null)
                    m_Instance = Resources.Load("Databases/SpellDatabase") as UISpellDatabase;

                return m_Instance;
            }
        }
        #endregion

        public UISpellInfo[] spells;

        /// <summary>
        /// Get the specified SpellInfo by index.
        /// </summary>
        /// <param name="index">Index.</param>
        public UISpellInfo Get(int index)
        {
            return (spells[index]);
        }

        /// <summary>
        /// Gets the specified SpellInfo by ID.
        /// </summary>
        /// <returns>The SpellInfo or NULL if not found.</returns>
        /// <param name="ID">The spell ID.</param>
        public UISpellInfo GetByID(int ID)
        {
            for (int i = 0; i < this.spells.Length; i++)
            {
                if (this.spells[i].ID == ID)
                    return this.spells[i];
            }

            return null;
        }
    }
}

以下是我如何预览UISpellInfo的现有实例:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using WorldServer;
using Spells;
using DuloGames.UI;

    public class Character : MonoBehaviour
    {

    private void SeeAllInstances()
        {

        foreach (var item in UISpellDatabase.Instance.spells)
        {
            Debug.Log("ID->" + item.ID + " name: " + item.Name);
        }


    }

我可以清楚地看到我对这个班级UISpellInfo的所有实例。 我想要实现的只是向数组UISpellInfo[] spells;添加更多实例。

据我所知,类UISpellInfo的所有实例都在这里加载UISpellInfo[] spells;然后在SeeAllInstances()的foreach上我可以看到所有实例和数据保持为每个例子。

我的问题是,我是否正确询问如何在UISpellInfo[] spells;中添加更多实例?

有人可以帮我吗?

2 个答案:

答案 0 :(得分:4)

我认为你需要在你的场景中使用List<T>,因为Array是用大小声明的,我们必须在添加删除元素时保持跟踪,以了解其中有多少元素以及插槽具有或不具有值,以便我们可以在最后一个可用索引处添加新项目。

对于我们事先不知道的情况,List<T>中的元素数量是更好的选择,如果您正在使用它,那么您只需要调用{{1}在您的实例上添加新项目的方法。

在这种情况下,您的代码就像:

Add()

这将保存public List<UISpellInfo> spells; 类型的所有项目,现在可以在代码中的某个位置执行以下操作:

UISpellInfo

答案 1 :(得分:2)

要向数组添加对象,您需要使用新元素重建数组,并将其分配给UISpellInfo[] spells;这是一个可用于实现此目的的方法:

public void AddUISpellInfo(UISpellInfo infoToAdd) {
    Array.Resize(ref this.spellInfoArray, this.spellInfoArray.Length + 1);
    this.spellInfoArray[this.spellInfoArray.Length - 1] = infoToAdd;
}

该方法将您希望添加的任何项目作为显式参数,以及通过隐含参数this对现有数组的引用。您可以在Array.Resize() here上看到更多信息。