Saturday, September 15, 2018

Điều kiện

Điều kiện
Đã kiểm tra với phiên bản: 5.5
- -
Độ khó: Trung cấp
Giai đoạn 3 dạy bạn cách xây dựng một hệ thống tương tác, tập trung vào các điều kiện. Chúng ta sẽ tạo một hệ thống để kiểm tra trạng thái trò chơi hiện tại, thảo luận về các mẫu kịch bản lệnh và sử dụng các đối tượng có thể viết kịch bản, các lớp generic, các phương thức thừa kế và mở rộng. Tải xuống gói nội dung cho Giai đoạn 3 tại đây.https://www.assetstore.unity3d.com/en/?&_ga=2.226797853.1082230255.1536856804-659907597.1536596969#!/content/76786
Tải xuống gói nội dung cho Giai đoạn 3 tại Cửa hàng tài sản hợp nhất tại đây.https://www.assetstore.unity3d.com/en/?&_ga=2.122963595.1082230255.1536856804-659907597.1536596969#!/content/76786

ConditionCollection

Expand view
Copy code
using UnityEngine;
public class ConditionCollection : ScriptableObject
{
public string description;
public Condition[] requiredConditions = new Condition[0];
public ReactionCollection reactionCollection;
public bool CheckAndReact()
{
for (int i = 0; i < requiredConditions.Length; i++)
{
if (!AllConditions.CheckCondition (requiredConditions[i]))
return false;
}
if(reactionCollection)
reactionCollection.React();
return true;
}
}


1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


ConditionCollectionEditor

Expand view
Copy code
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(ConditionCollection))]
public class ConditionCollectionEditor : EditorWithSubEditors<ConditionEditor, Condition>
{
public SerializedProperty collectionsProperty;
private ConditionCollection conditionCollection;
private SerializedProperty descriptionProperty;
private SerializedProperty conditionsProperty;
private SerializedProperty reactionCollectionProperty;
private const float conditionButtonWidth = 30f;
private const float collectionButtonWidth = 125f;
private const string conditionCollectionPropDescriptionName = "description";
private const string conditionCollectionPropRequiredConditionsName = "requiredConditions";
private const string conditionCollectionPropReactionCollectionName = "reactionCollection";
private void OnEnable ()
{
conditionCollection = (ConditionCollection)target;
if (target == null)
{
DestroyImmediate (this);
return;
}
descriptionProperty = serializedObject.FindProperty(conditionCollectionPropDescriptionName);
conditionsProperty = serializedObject.FindProperty(conditionCollectionPropRequiredConditionsName);
reactionCollectionProperty = serializedObject.FindProperty(conditionCollectionPropReactionCollectionName);
CheckAndCreateSubEditors (conditionCollection.requiredConditions);
}
private void OnDisable ()
{
CleanupEditors ();
}
protected override void SubEditorSetup (ConditionEditor editor)
{
editor.editorType = ConditionEditor.EditorType.ConditionCollection;
editor.conditionsProperty = conditionsProperty;
}
public override void OnInspectorGUI ()
{
serializedObject.Update ();
CheckAndCreateSubEditors(conditionCollection.requiredConditions);

EditorGUILayout.BeginVertical(GUI.skin.box);
EditorGUI.indentLevel++;
EditorGUILayout.BeginHorizontal();
descriptionProperty.isExpanded = EditorGUILayout.Foldout(descriptionProperty.isExpanded, descriptionProperty.stringValue);
if (GUILayout.Button("Remove Collection", GUILayout.Width(collectionButtonWidth)))
{
collectionsProperty.RemoveFromObjectArray (conditionCollection);
}
EditorGUILayout.EndHorizontal();

if (descriptionProperty.isExpanded)
{
ExpandedGUI ();
}

EditorGUI.indentLevel--;
EditorGUILayout.EndVertical();
serializedObject.ApplyModifiedProperties();
}
private void ExpandedGUI ()
{
EditorGUILayout.Space();
EditorGUILayout.PropertyField(descriptionProperty);
EditorGUILayout.Space();
float space = EditorGUIUtility.currentViewWidth / 3f;
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Condition", GUILayout.Width(space));
EditorGUILayout.LabelField("Satisfied?", GUILayout.Width(space));
EditorGUILayout.LabelField("Add/Remove", GUILayout.Width(space));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginVertical(GUI.skin.box);
for (int i = 0; i < subEditors.Length; i++)
{
subEditors[i].OnInspectorGUI();
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
GUILayout.FlexibleSpace ();
if (GUILayout.Button("+", GUILayout.Width(conditionButtonWidth)))
{
Condition newCondition = ConditionEditor.CreateCondition();
conditionsProperty.AddToObjectArray(newCondition);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.PropertyField(reactionCollectionProperty);
}
public static ConditionCollection CreateConditionCollection()
{
ConditionCollection newConditionCollection = CreateInstance<ConditionCollection>();
newConditionCollection.description = "New condition collection";
newConditionCollection.requiredConditions = new Condition[1];
newConditionCollection.requiredConditions[0] = ConditionEditor.CreateCondition();
return newConditionCollection;
}
}

No comments:

Post a Comment