来自一个字典的类通过函数从另一个字典中的类获取数据

时间:2014-09-21 17:29:21

标签: c# class dictionary unity3d

将数据从放置在字典中的一个类转换为第二类(在另一个字典中)时,我没什么问题。

                if(GUI.Button(new Rect(Screen.width * 0.40f, Screen.height * 0.1f,Screen.width * 0.1f,Screen.height *0.1f), "Pistol")){
            ChangeWeapon (ChangedWeapon, 01);
            }

按钮的示例,触发该功能。

    void ChangeWeapon(int ChangedWeapon, int ID){
    string WeaponSlotList[ChangedWeapon].weaponName = WeaponList[ID].weaponName;
}

继承人的功能。更改的武器是数字,表示应更改哪个插槽信息。 ID是应该使用哪种武器信息的ID。

    public class Weapon{
    public string weaponName;
    public int maxClip;
    public int spread;
    public float speed;
    public int ID;
    public Weapon(string weaponName, int maxClip, int spread, float speed, int ID){
    }
}
public Weapon Pistol = new Weapon("Pistol",15,1,0.5f,01);
public Weapon Smg = new Weapon("Smg",30,1,0.1f,01);
public Weapon AssalutRifle = new Weapon("AssalutRifle",30,1,0.2f,01);
public Weapon Shotgun = new Weapon("Shotgun",8,1,0.5f,01);
public Weapon SniperRifle = new Weapon("SniperRifle",2,1,1.0f,01);

这里的武器类构造函数。

    public class WeaponSlot{
    public string weaponName;
    public int maxClip;
    public int spread;
    public float speed;
    public int ammo;
    public WeaponSlot(string weaponName, int maxClip, int spread, float speed, int ammo)
    {
    }
}
public WeaponSlot WeaponSlot1 = new WeaponSlot("",0,0,0.0f,0);
public WeaponSlot WeaponSlot2 = new WeaponSlot("",0,0,0.0f,0);
public WeaponSlot WeaponSlot3 = new WeaponSlot("",0,0,0.0f,0);
public WeaponSlot WeaponSlot4 = new WeaponSlot("",0,0,0.0f,0);
public WeaponSlot WeaponSlot5 = new WeaponSlot("",0,0,0.0f,0);

这里是插槽构造函数。 任何人都知道应该如何编写函数? 也很抱歉英语不好,我是外国人。

1 个答案:

答案 0 :(得分:0)

首先,为什么当它们看起来大部分相同时,你使用两个不同的类?你的WeaponsList和WeaponsSlotList都可以拥有相同的Weapon对象,而WeaponsList中的武器可以将弹药设置为0

如果您按照本课程学习,您有几种选择。一种是直接将值分配给WeaponSlotList,如下所示:

void ChangeWeapon(int ChangedWeapon, int ID)
{
    string WeaponSlotList[ChangedWeapon] = WeaponList[ID];
}

问题在于WeaponSlotList中对武器的任何更改也将发送到WeaponList中的武器,因为它们指向同一个对象。处理弹药时这会有问题!

或者,您可以根据WeaponList对象属性创建新的Weapon对象,并将其分配给WeaponSlotList

void ChangeWeapon(int ChangedWeapon, int ID)
{
    WeaponSlotList[ChangedWeapon] = 
        new Weapon(WeaponList[ID].weaponName, WeaponList[ID].maxClip, 
            WeaponList[ID].spread, WeaponList[ID].speed, WeaponList[ID].ID);
}

或者只是将WeaponList武器中的所有属性值复制到WeaponSlotList

void ChangeWeapon(int ChangedWeapon, int ID)
{
    WeaponSlotList[ChangedWeapon].weaponName = WeaponList[ID].weaponName;
    WeaponSlotList[ChangedWeapon].maxClip = WeaponList[ID].maxClip;
    WeaponSlotList[ChangedWeapon].spread = WeaponList[ID].spread;
    WeaponSlotList[ChangedWeapon].speed = WeaponList[ID].speed;
    WeaponSlotList[ChangedWeapon].ID = WeaponList[ID].ID;
}

另一种选择是在你的武器类上实现一个ShallowCopy方法,这使得客户端更容易获得现有武器的副本。像这样:

public class Weapon
{
    public string weaponName;
    public int maxClip;
    public int spread;
    public float speed;
    public int ID;

    public Weapon(string weaponName, int maxClip, int spread, float speed, int ID)
    {
    }

    public Weapon GetShallowCopy()
    {
        return (Weapon) this.MemberwiseClone();
    }
}

// Calling code:
void ChangeWeapon(int ChangedWeapon, int ID)
{
    WeaponSlotList[ChangedWeapon] = WeaponList[ID].GetShallowCopy();
}

另一种选择,如果你想为WeaponSlot创建一个单独的类,那就是使用Weapon属性和任何其他属性来创建它。

public class WeaponSlot
{
    public Weapon weapon;
    public int ammo;
    public WeaponSlot(Weapon weapon, int ammo)
    {
    }
}

或者你可以使用继承,并使WeaponSlot派生自武器。很多选择!!!

顺便说一下,将'List'作为Dictionary对象名称的一部分有点令人困惑!您可以考虑使用WeaponInventorySelectedWeapons之类的东西。但那只是我的个人意见。 : - )