2017-04-07 60 views
0

,我找到了一些老师让玩家提高技能。目前,有12个人,所以我为他们写了一个基础课。在我的游戏中优化Unity CharacterSelection

该类从它自己的“teacherDataClass”中选择正确的数据。数据由编辑器的索引设置。

我的代码:

[SerializeField] 
int teacherIndex; // set an index in the editor -> selection of teacher 

    NpcTeacherData teacherData; // the data class 

    private void Start() 
    { 
     NpcTeacherData[] teachers = // Collection of all teachers 
     { 
      new TeacherAlchemist(), 
      new TeacherBlacksmith(), 
      new TeacherBowyer(), 
      new TeacherButcher(), 
      new TeacherHunter(), 
      new TeacherInnkeeper(), 
      new TeacherJuggler(), 
      new TeacherMessenger(), 
      new TeacherPriest(), 
      new TeacherTamer(), 
      new TeacherThief(), 
      new TeacherTownGuard() 
     }; 

     teacherData = teachers[teacherIndex]; // Get the right teacher by the index 
    } 

所以这看起来很好,并能正常工作。如果你不希望使用编辑器,你可以比较teacherObject的标签像这样

NpcTeacherData teacherData; // the data class 

private void Start() 
{ 
    switch (gameObject.tag) // compare the tag of the teacher and set its class 
     { 
      case "TeacherAlchemist": 
       teacherData = new TeacherAlchemist(); 
       break; 
      case "TeacherBlacksmith": 
       teacherData = new TeacherBlacksmith(); 
       break; 

      //... 
     } 
} 

但我不喜欢这些方式那么多:/有没有更好的机会?像编辑器中的DropDownSelection可能?

我试图

[SerializeField] 
object script; // Place the right data class here 

[SerializeField] 
object script as NpcTeacherData; // Place the right data class here 

但这并没有工作。

我只想优化它:)

回答

0

您可以使用Editor GUI Popup。这里是你如何可以使一个下拉/弹出 -

public string[] options = new string[] {"TeacherAlchemist","TeacherBlacksmith","TeacherBowyer","TeacherButcher","TeacherHunter","TeacherInnkeeper","TeacherJuggler","TeacherMessenger","TeacherPriest","TeacherTamer","TeacherThief","TeacherTownGuar"}; 
public int selectedIndex = 0; 

然后用OnGUI函数存储选定值

void OnGUI() 
{ 
    selectedIndex = EditorGUILayout.Popup("TeacherDataClass", selectedIndex, options); 
} 

你可以找到reference here

+0

对不起,我不希望使用OnGUI :)我要选择的数据类1次。 OnGUI方法将被称为所有游戏。 – peterHasemann

1

也许你可以使用枚举来实现这一目标?

这将是这样的:

public enum TeacherType 
{ 
    TeacherAlchemist, 
    TeacherBlacksmith, 
    TeacherBowyer, 
    TeacherButcher, 
    TeacherHunter, 
    TeacherInnkeeper, 
    TeacherJuggler, 
    TeacherMessenger, 
    TeacherPriest, 
    TeacherTamer, 
    TeacherThief, 
    TeacherTownGuard 
} 

public TeacherType type; 

private NpcTeacherData teacherData; 

private void Start() 
{ 
    switch (type) 
    { 
     case TeacherType.TeacherAlchemist: 
      teacherData = new TeacherAlchemist(); 
      break; 

     //... 
    } 
} 

但是它不会从你的第一个解决方案差别很大(唯一的选择是比较简单,因为该类型显示索引来代替)。

希望这有助于

+1

'gameObject.tag'产生垃圾,比较字符串比较慢。 'Enum'应该可以。更妙的是,使用'Enum' +'Dictionary'来映射,而不是许多if或switch check。 – Programmer

+1

确实,使用字典也可能会更好。并感谢编辑(复制/粘贴错误是最糟糕的)! – Kardux

+1

没问题。只是一种类型。当我说Dictionary我实际上是指这样的东西:'Dictionary dic'。然后,将所有的Enumes与他们的动作一起添加到词典中,就像这样'dic.Add(TeacherType.TeacherAlchemist,()=> {teacherData = new TeacherAlchemist();})''。 – Programmer