Phản ứng

0
267

Phản ứng
Đã kiểm tra với phiên bản: 5.5
– –
Độ khó: Trung cấp
Giai đoạn 4 tiếp tục dạy cách xây dựng một hệ thống tương tác tập trung vào các phản ứng. Chúng tôi sẽ tạo ra một hệ thống để thực hiện các hành động dựa trên trạng thái điều kiện bằng cách sử dụng đa hình, tiếp tục viết kịch bản và thảo luận về việc tuần tự hóa. Tải xuống gói nội dung cho Giai đoạn 4 tại đây.https://www.assetstore.unity3d.com/en/?&_ga=2.154116536.1082230255.1536856804-659907597.1536596969#!/content/76787
Tải xuống gói nội dung cho Giai đoạn 4 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.134062606.1082230255.1536856804-659907597.1536596969#!/content/76787

ReactionCollectionEditor

Expand view

Copy code
using System;
using UnityEngine;
using System.Collections.Generic;
using UnityEditor;
[CustomEditor(typeof(ReactionCollection))]
public class ReactionCollectionEditor : EditorWithSubEditors<ReactionEditor, Reaction>
{
private ReactionCollection reactionCollection;
private SerializedProperty reactionsProperty;
private Type[] reactionTypes;
private string[] reactionTypeNames;
private int selectedIndex;
private const float dropAreaHeight = 50f;
private const float controlSpacing = 5f;
private const string reactionsPropName = "reactions";
private readonly float verticalSpacing = EditorGUIUtility.standardVerticalSpacing;
private void OnEnable ()
{
reactionCollection = (ReactionCollection)target;
reactionsProperty = serializedObject.FindProperty(reactionsPropName);
CheckAndCreateSubEditors (reactionCollection.reactions);
SetReactionNamesArray ();
}
private void OnDisable ()
{
CleanupEditors ();
}
protected override void SubEditorSetup (ReactionEditor editor)
{
editor.reactionsProperty = reactionsProperty;
}
public override void OnInspectorGUI ()
{
serializedObject.Update ();
CheckAndCreateSubEditors(reactionCollection.reactions);
for (int i = 0; i < subEditors.Length; i++)
{
subEditors[i].OnInspectorGUI ();
}
if (reactionCollection.reactions.Length > 0)
{
EditorGUILayout.Space();
EditorGUILayout.Space ();
}
Rect fullWidthRect = GUILayoutUtility.GetRect(GUIContent.none, GUIStyle.none, GUILayout.Height(dropAreaHeight + verticalSpacing));
Rect leftAreaRect = fullWidthRect;
leftAreaRect.y += verticalSpacing * 0.5f;
leftAreaRect.width *= 0.5f;
leftAreaRect.width -= controlSpacing * 0.5f;
leftAreaRect.height = dropAreaHeight;
Rect rightAreaRect = leftAreaRect;
rightAreaRect.x += rightAreaRect.width + controlSpacing;
TypeSelectionGUI (leftAreaRect);
DragAndDropAreaGUI (rightAreaRect);
DraggingAndDropping(rightAreaRect, this);
serializedObject.ApplyModifiedProperties ();
}
private void TypeSelectionGUI (Rect containingRect)
{
Rect topHalf = containingRect;
topHalf.height *= 0.5f;

Rect bottomHalf = topHalf;
bottomHalf.y += bottomHalf.height;
selectedIndex = EditorGUI.Popup(topHalf, selectedIndex, reactionTypeNames);
if (GUI.Button (bottomHalf, "Add Selected Reaction"))
{
Type reactionType = reactionTypes[selectedIndex];
Reaction newReaction = ReactionEditor.CreateReaction (reactionType);
reactionsProperty.AddToObjectArray (newReaction);
}
}
private static void DragAndDropAreaGUI (Rect containingRect)
{
GUIStyle centredStyle = GUI.skin.box;
centredStyle.alignment = TextAnchor.MiddleCenter;
centredStyle.normal.textColor = GUI.skin.button.normal.textColor;
GUI.Box (containingRect, "Drop new Reactions here", centredStyle);
}
private static void DraggingAndDropping (Rect dropArea, ReactionCollectionEditor editor)
{
Event currentEvent = Event.current;
if (!dropArea.Contains (currentEvent.mousePosition))
return;
switch (currentEvent.type)
{
case EventType.DragUpdated:
DragAndDrop.visualMode = IsDragValid () ? DragAndDropVisualMode.Link : DragAndDropVisualMode.Rejected;
currentEvent.Use ();
break;
case EventType.DragPerform:

DragAndDrop.AcceptDrag();

for (int i = 0; i < DragAndDrop.objectReferences.Length; i++)
{
MonoScript script = DragAndDrop.objectReferences[i] as MonoScript;
Type reactionType = script.GetClass();
Reaction newReaction = ReactionEditor.CreateReaction (reactionType);
editor.reactionsProperty.AddToObjectArray (newReaction);
}
currentEvent.Use();
break;
}
}
private static bool IsDragValid ()
{
for (int i = 0; i < DragAndDrop.objectReferences.Length; i++)
{
if (DragAndDrop.objectReferences[i].GetType () != typeof (MonoScript))
return false;

MonoScript script = DragAndDrop.objectReferences[i] as MonoScript;
Type scriptType = script.GetClass ();
if (!scriptType.IsSubclassOf (typeof(Reaction)))
return false;
if (scriptType.IsAbstract)
return false;
}
return true;
}
private void SetReactionNamesArray ()
{
Type reactionType = typeof(Reaction);
Type[] allTypes = reactionType.Assembly.GetTypes();
List<Type> reactionSubTypeList = new List<Type>();
for (int i = 0; i < allTypes.Length; i++)
{
if (allTypes[i].IsSubclassOf(reactionType) && !allTypes[i].IsAbstract)
{
reactionSubTypeList.Add(allTypes[i]);
}
}
reactionTypes = reactionSubTypeList.ToArray();
List<string> reactionTypeNameList = new List<string>();
for (int i = 0; i < reactionTypes.Length; i++)
{
reactionTypeNameList.Add(reactionTypes[i].Name);
}
reactionTypeNames = reactionTypeNameList.ToArray();
}
}


1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


1 9


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40


41


42


43


44


45


46


47


48


49


50


51


52


53


54


55


56


57


58


59


60


61


62


63


64


65


66


67


68


69


70


71


72


73


74


75


76


77


78


79


80


81


82


83


84


85


86


87


88


89


90


91


92


93


94


95


96


97


98


99


100


101


102


103


104


105


106


107


108


109


110


111


112


113


114


115


116


117


118


119


120


121


122


123


124


125


126


127


128


129


130


131


132


133


134


135


136


137


138


139


140


141


142


TextReaction

Expand view

Copy code
using UnityEngine;
public class TextReaction : Reaction
{
public string message;
public Color textColor = Color.white;
public float delay;
private TextManager textManager;
protected override void SpecificInit()
{
textManager = FindObjectOfType<TextManager> ();
}
protected override void ImmediateReaction()
{
textManager.DisplayMessage (message, textColor, delay);
}
}


1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


TextReactionEditor

Expand view

Copy code
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(TextReaction))]
public class TextReactionEditor : ReactionEditor
{
private SerializedProperty messageProperty;
private SerializedProperty textColorProperty;
private SerializedProperty delayProperty;
private const float messageGUILines = 3f;
private const float areaWidthOffset = 19f;
private const string textReactionPropMessageName = "message";
private const string textReactionPropTextColorName = "textColor";
private const string textReactionPropDelayName = "delay";
protected override void Init ()
{
messageProperty = serializedObject.FindProperty (textReactionPropMessageName);
textColorProperty = serializedObject.FindProperty (textReactionPropTextColorName);
delayProperty = serializedObject.FindProperty (textReactionPropDelayName);
}
protected override void DrawReaction ()
{
EditorGUILayout.BeginHorizontal ();
EditorGUILayout.LabelField ("Message", GUILayout.Width (EditorGUIUtility.labelWidth - areaWidthOffset));
messageProperty.stringValue = EditorGUILayout.TextArea (messageProperty.stringValue, GUILayout.Height (EditorGUIUtility.singleLineHeight * messageGUILines));
EditorGUILayout.EndHorizontal ();
EditorGUILayout.PropertyField (textColorProperty);
EditorGUILayout.PropertyField (delayProperty);
}
protected override string GetFoldoutLabel ()
{
return "Text Reaction";
}
}


1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


LEAVE A REPLY

Please enter your comment!
Please enter your name here