2016-07-03 12 views
1

ich die folgende Klasse haben:Instantiate Klasse und legen Sie die Eigenschaften aus der Editor-Ansicht Unity C#

[Serializable] 
public class BaseDamage : MonoBehaviour 
{ 
    public int MaximumDamage; 
    public int MinimumDamage; 
    public short SpellScaling; 
} 

und eine Klasse, die die Klasse enthält:

public class SpellDamage : MonoBehaviour 
{ 
    public BaseDamage SpellBaseDamage; 
} 

Wenn ich SpellDamage Skript zu einem Gameobject befestigen Ich möchte in der Editor-Ansicht den Wert BaseDamage einstellen können, aber ich kann nur ein Skript anhängen.

Wie kann ich das tun?

+0

Ich bin nicht sicher, ob das möglich ist, aber wenn ja, es höchstwahrscheinlich erfordert einige benutzerdefinierte Editor Skripte. Eine Option wäre auch, 'SpellDamage' von' BaseDamage' zu ​​erben (diese Klasse benötigt übrigens 'Serializable' nicht). –

+0

Auch wenn es erbt, habe ich noch die 'SpellDamage' Klasse in einer anderen Klasse, so dass es immer noch unmöglich ist, es aus dem Editor zu instanziieren – PetqImaQkaputka

+1

In diesem Fall sollten Sie sich daran erinnern, dass die Einheit ein komponentenbasiertes System ist. Machen Sie die 'Damage'-Klasse zu einer Komponente (verbinden Sie diese einfach mit dem entsprechenden Spielobjekt (z. B. dem Player) und legen Sie die Werte fest) und lassen Sie andere Skripte einen Verweis auf diese Komponente haben. –

Antwort

2

Sie sind auf dem richtigen Weg. Sie können das BaseDamage-Skript an dasselbe Spielobjekt anhängen, an das das SpellDamage-Skript angehängt ist.

Sie haben das Attribut Serializable hinzugefügt. Was Sie tun müssen, ist eine benutzerdefinierte Eigenschaft Schublade für BaseDamage Klasse in Editor Ordner zu schreiben.

Etwas wie folgt aus:

[CustomPropertyDrawer(typeof(BaseDamage))] 
public class BaseDamageDrawer : PropertyDrawer 
{ 


static string[] propNames = new[] 
{ 
    "MaximumDamage", 
    "MinimumDamage", 
    "SpellScaling", 
}; 



public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) 
{ 
    // Using BeginProperty/EndProperty on the parent property means that 
    // prefab override logic works on the entire property. 
    EditorGUI.BeginProperty(position, label, property); 

    // Draw label 
    position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); 

    // Don't make child fields be indented 
    var indent = EditorGUI.indentLevel; 
    EditorGUI.indentLevel = 0; 

    SerializedProperty[] props = new SerializedProperty[propNames.Length]; 
    for (int i = 0; i < props.Length; i++) 
    { 
     props[i] = property.FindPropertyRelative(propNames[i]); 
    } 


    // Calculate rects 
    float x = position.x; 
    float y = position.y; 
    float w = position.width/props.Length; 
    float h = position.height; 
    for (int i = 0; i < props.Length; i++) 
    { 
     var rect = new Rect(x, y, w, h); 
     EditorGUI.PropertyField(rect, props[i], GUIContent.none); 
     x += position.width/props.Length; 
    } 

    // Set indent back to what it was 
    EditorGUI.indentLevel = indent; 

    EditorGUI.EndProperty(); 
}