2017-09-22 84 views
0

我在Unity中做游戏,需要将我的结构列表转换为字符串。我的代码放在一个名为MonsterHandler的类中。C#如何将结构类型列表转换为字符串?

public enum S_STATE 
{ 
    S_IDLE, 
    S_PATROL, 
    S_ATTACK, 
    NONE 
} 

public struct MONSTERS 
{ 
    public string Name; 
    public int Health; 
    public int Damage; 
    public S_STATE State; 
}; 

public List<MONSTERS> monsterList= new List<MONSTERS>(); 

void Start() 
{ 
    // add data into the monsterList 
    // Debug.Log(monsterList.Count); // print out 5 

    Debug.Log(monsterList.ToArray()); //printed out "MonsterHandler + MONSTERS" 
    // i want to do something like this 
    // "Monster_Zombie, 100, 20, S_IDLE, Monster_Donkey, 80, 30, S_IDLE, Monster_Chicken, 120 , 10, IDLE,.." 
} 
} 

有没有办法把我的结构列表转换成字符串[],然后转换成字符串?或者有任何其他方式

+0

你想印什么? –

+0

@KeithNicholas我想打印出这样的东西 – Benjan

+0

“Monster_Zombie,100,20,S_IDLE,Monster_Donkey,80,30,S_IDLE,Monster_Chicken,120,10,IDLE,..” – Benjan

回答

3

您可以覆盖怪物ToString,但如果你想灵活性如何得到的东西显示在不同的情况下,那么我让你如何呈现的东西从模型

Debug.Log(string.Join("\r\n", 
    monsterList.Select(monster => $"{monster.Name}, {monster.Health}, whatever") 
    .ToArray())); 

使用控制台分开......

Console.WriteLine(string.Join("\r\n",monsterList.Select(monster => $"{monster.Name} {monster.Health} {monster.Damage} {monster.State}").ToArray())); 

enter image description here

+0

嗯,但它只打印出第一个两个怪物数据,我共有5个怪物。 @Keith Nicholas – Benjan

+0

应该没有什么限制它到两个,,,,我刚把它改成了console并打印出来了,得到了5,debug.log可能有问题\ r \ n,所以也许把|相反或什么 –

+0

啊,|作品!非常感谢 :) – Benjan

4

我首先重命名类型(和枚举值)遵循.NET命名约定,并指出该结构代表一个单个怪物。 不幸的是,可变结构在Unity中很常见,但我会把这一部分放在一边。

我想下一个覆盖ToString()Monster。假设你可以使用C#6特性,字符串插值使得它非常简单。

最后,要将怪物列表转换为字符串,您需要使用string.Join。调用的确切性质取决于你有什么可用 - 如果你仍然瞄准.NET 3.5,它有点难看。但你最终会得到类似的结果:

public enum State 
{ 
    None, // Idiomatically value 0 in .NET 
    Idle, 
    Patrol, 
    Attack 
} 

public struct Monster 
{ 
    public string Name; 
    public int Health; 
    public int Damage; 
    public State State; 

    // Adjust this as required 
    public override string ToString() => 
     $"Name: {Name}; Health: {Health}; Damage: {Damage}; State: {State}"; 
} 

public List<Monster> monsters = new List<Monster>(); 

void Start() 
{ 
    Debug.Log(string.Join(", ", monsters.Select(m => m.ToString().ToArray()); 
} 

请注意,这是一个昂贵的操作 - 您可能只想在调试时执行此操作。 (我不知道Debug.Log电话是否统一是有条件的。)

在.NET 4及以上,你可以只使用

Debug.Log(string.Join(", ", monsters)); 
相关问题