不同类型的字典,其中拉出的对象必须记住其类型,最佳方法?

时间:2017-09-19 13:12:54

标签: c# generics unity3d collections scripting

我正在尝试找到创建字典的最佳方法,该字典可以容纳6种不同的抽象奖励类型的子类型,同时还要记住单个项目的原始子类型再次拉出时。有几种方法可行,但我觉得它们都是低于标准的,必须有更好的解决方案。

有效的解决方案,但我认为可以改进:

  • 每个奖励子类型的列表。 (因为我添加了大量的子类型,所以不会很好地扩展)

  • 列表清单。 (这既丑陋又效率低下)

  • 多维数组。 (与列表一样的问题)

以下是我的方案的相关课程片段:

 public class RewardAssetContainer : MonoBehaviour
{
// Sounds
private static AudioClip losenedBowels = new AudioClip();
public static AudioClip LosenedBowels { get { return losenedBowels; } }
}
public abstract class Reward 
{
protected EffectTypes effectType;
protected Rareity rareity;
protected Sprite itemIcon;
protected string itemName;
protected GameObject specialEffect;
}
interface iSoundEffect
{
void SetVolume(float _newVol);
void PlaySound();
void StopSound();
}
class DeathSoundEffect: Reward, iSoundEffect
{
    private AudioSource sound;

public DeathSoundEffect(string _itemName, AudioClip _sound, float _vol, EffectTypes _effectType, Rareity _rareity, Sprite _itemIcon)
{
    sound = new AudioSource();

    itemName = _itemName;
    sound.volume = _vol;
    sound.clip = _sound;
    effectType = _effectType;
    rareity = _rareity;
    itemIcon = _itemIcon;
}

public void PlaySound()
{
    sound.Play();
}
}
public class Item_Inventory : MonoBehaviour
{
private static Dictionary<string, Reward> rewardItemsOwned = new Dictionary<string, Reward>();
public static Reward GetSpecificItem(string _keyValue) { return rewardItemsOwned[_keyValue]; }

   private void TestPutToInventory()
{
    rewardItemsOwned.Add("LosenedBowels", new DeathSoundEffect("LosenedBowels", RewardAssetContainer.LosenedBowels, 0.5f, EffectTypes.DeathSoundEffect, Rareity.Rare, RewardAssetContainer.EpicExample));

}
}

我想,在另一个班级,能够做类似的事情:

  var tempRewardItem = Item_Inventory.GetSpecificItem("LosenedBowels");

    tempRewardItem .PlaySound();

但我无法想出一个优雅的方式来做一个集合。

1 个答案:

答案 0 :(得分:0)

在提取项目时,您是否始终知道您预期的原始子类型,例如您的示例?如果是这样,您可以在使用之前尝试投射您拉出的对象:

var tempRewardItem = Item_Inventory.GetSpecificItem("LosenedBowels") as DeathSoundEffect; // Could also use 'as isSoundEffect'
if (tempRewardItem != null) 
{
    tempRewardItem.PlaySound();
}