ã¯ããã«
ååã®èšäºã§ã¯ ãéç¥ã«åºã¥ããŠã²ãŒã ããžãã¯ã®ã³ã³ããŒãã³ãéã§ããœãããéä¿¡ãæäŸãããµãã¹ã¯ã©ã€ãããæ¹æ³ã説æããŸããã äžè¬çãªæå³ã§ã¯ããã®ãããªéç¥ã¯ãå€æ°ã®å€æŽããããè€éãªãã®ãžã®ã³ã³ããŒãã³ãã®äœæ¥ã§çºçãããå¿ èŠãªã¢ã¯ã·ã§ã³ãŸãã¯ã€ãã³ãã«éä¿¡ã§ããŸãã ãã ããç¹å®ã®ã€ãã³ãã§ã¯ãå§ä»»ããããšã¯æšå¥šãããªãäžé£ã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¿ èŠããããŸãã æãåçŽãªäŸã¯ãµãŠã³ããã¶ã€ã³ã§ãããµãŠã³ãã®äŒŽå¥ãå¿ èŠãšããã³ã³ããŒãã³ãã§ã€ãã³ããçºçããŸããã æãåçŽãªããŒãžã§ã³ã§ã¯ãAudioSource.PlayïŒïŒé¢æ°ãåŒã³åºããŸãããããå°ãè€éãªãã®ãšããŠããµãŠã³ãã·ã¹ãã ã®ã©ãããŒé¢æ°ãåŒã³åºããŸãã ãããžã§ã¯ããå°ãããããŒã ã«å€ãã®åœ¹å²ãå Œãåãã人ãã»ãšãã©ããªãå ŽåãååãšããŠããã«åé¡ã¯ãããŸããããè€æ°ã®ããã°ã©ããšãµãŠã³ããã¶ã€ããŒããã倧èŠæš¡ãªãããžã§ã¯ãã®å Žåãç¹ã«ãµãŠã³ãã®ãã¥ãŒãã³ã°ã¯ããã°ã©ãã«å€ãããŸãæªå€¢ã 責任ã®ããã¹ãã·ã£ãªã¹ããç§ãã¡ã§ã¯ãªããããè¡ããšããæ£ç¢ºã«ãªãã®ã§ãã³ã³ãã³ãããæœè±¡åããŠã«ã¹ã¿ãã€ãºã®èŠ³ç¹ããäœæ¥ãå°ãªãããããšããã®ã¯ç§å¯ã§ã¯ãããŸããã
äžèšã®äŸã¯ãé³ã ãã§ãªããä»ã®å€ãã®ãã®ã«ãé©çšãããŸãïŒã¢ãã¡ãŒã·ã§ã³ããšãã§ã¯ããGUIèŠçŽ ã䜿çšããã¢ã¯ã·ã§ã³ãªã©ã ãããã¯ãã¹ãŠãæ¯èŒç倧ããªãããžã§ã¯ãã§ã¯å€§ããªåé¡ãè¡šããŠããŸãã ä»äºäžã«äœåºŠãåºããããŸããããã³ã³ãã³ã管çã¯ãã¶ã€ããŒããå®å šã«åãé¢ãããŠãããããåºæ¬çã«ãã¹ãŠã®æ±ºå®ã¯ä»äºãä¿é²ããããšã«ãªããŸãããããã¯æ¬è³ªçã«è¡ãæ¢ãŸãã®ãªãã·ã§ã³ã§ãã çµå±ãããã°ã©ããŒã®é¢äžãæå°éã«æããŠãæ åœè ããã®ãããªããšã管çã§ãããããªã·ã¹ãã ãèæ¡ããããšã決å®ãããŸããã ãã®èšäºã§ã¯ããã®ã·ã¹ãã ã«ã€ããŠèª¬æããŸãã
ã€ãã³ããšãã£ãŒãããã¯
ã¡ãã£ãšãã玹ä»
ããã°ã©ããŒã®èŠ³ç¹ãããã²ãŒã ãã¬ã€ãäœã§ãããã¯èª°ã«ãç§å¯ã§ã¯ãªããšæããŸãã ãã ããèªè ãç§ã®èŠç¹ãç解ã§ããããã«èª¬æããŸãã
ãããã£ãŠãã²ãŒã ããã»ã¹ã®å®è£ çšã«èšè¿°ãããã¹ãŠã®ã³ãŒãã¯ãæåã¯ã³ã³ããŒãã³ãã®ã»ããã§ãããåã³ã³ããŒãã³ãã¯ãã²ãŒã ã¯ãŒã«ãã§çºçããã²ãŒã ã¯ãŒã«ããŸãã¯ä»ã®ã³ã³ããŒãã³ãã«åœ±é¿ãäžããå€æ°ã®ã€ãã³ãã®ãžã§ãã¬ãŒã¿ã§ãã æãåçŽãªããŒãžã§ã³ã§ã¯ãããžãã¯ã¯ãœãŒã¹ã®åºæºã«åŸã£ãŠã°ã«ãŒãåãããã€ãã³ãã«å¿ããŠã³ã³ããŒãã³ãã«åå²ãããŸãïŒãã£ã©ã¯ã¿ãŒã察æŠçžæãã€ã³ã¿ãŒãã§ã€ã¹ãã€ã³ã¿ãŒãã§ã€ã¹ãŠã£ã³ããŠãªã©ã ãã ããã€ãã³ãèªäœã¯ãŸã ã²ãŒã ãã¬ã€ã圢æããŠããªããããã€ãã³ãã«å¿ããŠå¿ èŠãªã¢ã¯ã·ã§ã³ïŒå¿çïŒãå®è¡ããå¿ èŠããããŸãã ããšãã°ããã£ã©ã¯ã¿ãŒãäžæ©èžã¿åºãã察å¿ããã€ãã³ããçæããå Žåãããã«å¿ããŠãµãŠã³ããåçãã足ã®äžããã»ããã®å¹æãåçããã«ã¡ã©ãæ¯ãå¿ èŠããããŸãã ããè€éãªããŒãžã§ã³ã§ã¯ãã€ãã³ãã«å¿ããŠå®è¡ãããã¢ã¯ã·ã§ã³ãæ°ããã€ãã³ããçæã§ããŸãããããããµãŠã³ããŠã§ãŒããšãã§ã¯ãããšåŒã³ãŸãã ãããã£ãŠãã²ãŒã ããã»ã¹ã®ãè¡šé¢ãã¯ãäžé£ã®ã€ãã³ããšå¿çãšããŠåœ¢æãããŸãã
ã»ãšãã©ã®å Žåãäžèšã®ã¡ã«ããºã ã¯ã³ãŒãã§çŽæ¥åœ¢æãããŸãããåè¿°ã®ããã«ãå€ãã®ã€ãã³ãã¯ãã²ãŒã ã®ã¢ãã¡ãŒã·ã§ã³ãšèªèãæäŸããã³ã³ãã³ãã«é¢é£ä»ããããšãã§ããŸãïŒãããŠãã¢ãŒãã£ã¹ããšãã¶ã€ããŒãæ åœããéšåïŒã ééã£ããããžã§ã¯ã管çããã»ã¹ãšã²ãŒã å¶äœãžã®ééã£ãã¢ãããŒãã«ããããããã®ã¿ã¹ã¯ã®ã»ãšãã©ã¯ããã°ã©ããŒãç ç²ã«ããŠè§£æ±ºãããŸãã ã¢ãŒãã£ã¹ãã¯æ ãè ã§ã-ããã°ã©ããŒã¯ãããã¯ããæžããŠããã¹ãŠãããŸãããã§ãããã ãã·ã¢ã®ã²ãŒã éçºè ã®èªçã®ææã«ã¯è¯ãã£ãã®ã§ãããå質ãé床ãæè»æ§ãå¿ èŠã«ãªã£ãã®ã§ãç§ã¯å¥ã®æ¹æ³ã«é²ãããšã«ãããã®æ¹æ³ã¯Unity Editorã«æ¥ç¶ãããŸãã
æ¡åŒµæ©èœ
ã¢ãŒããã¯ãã£ã«é¢ããããã€ãã®èšè
以äžã¯ãã€ãã³ããšå¿çã®ã¡ã«ããºã ãå®è£ ããããã«å¿ èŠãªåºæ¬èŠçŽ ã瀺ãå°ããªãããã¯å³ã§ããããã«ãããèšèšè ã¯ã²ãŒã ããžãã¯ã®ç¹å®ã®èŠçŽ ãç¬èªã«æ§æã§ããŸãã

ãããã£ãŠãã·ã¹ãã ã®åºæ¬èŠçŽ ã¯ã EventPoint ïŒã³ã³ããŒãã³ãå ã®ã€ãã³ããã€ã³ãïŒãšAction ïŒã€ãã³ããžã®å¿çïŒã§ãã ãããã®åèŠçŽ ã«ã¯ããšãã£ã¿ãŒæ¡åŒµæ©èœããã®å Žåã¯ã«ã¹ã¿ã ã€ã³ã¹ãã¯ã¿ãŒã䜿çšããŠå®è£ ãããç¹å¥ãªãšãã£ã¿ãŒãæ§æããå¿ èŠããããŸãïŒããã«ã€ããŠã¯ãå¥ã®ã»ã¯ã·ã§ã³ã§èª¬æããŸãïŒã
åºæ¬çãªã·ããªãªã§ã¯ãåã€ãã³ããã€ã³ãã¯1ã€ã®å¿çã§ã¯ãªãå€æ°ãçæã§ããåå¿çã¯ã€ãã³ããžã§ãã¬ãŒã¿ãŒã§ãããããããžã®ãšã³ããªãã€ã³ããå«ãããšãã§ããŸãã ããã«ãå¿çã¯Unity3Dãšã³ãžã³ã®åºæ¬ãšã³ãã£ãã£ãåŠçã§ããå¿ èŠããããŸãã
äžèšã«åºã¥ããŠãæãç°¡åãªãªãã·ã§ã³ã¯ã ActionãMonoBehaviour ã®çžç¶äººã«ããæšæºã®Unity3Dã¡ã«ããºã ã§ã·ãªã¢ã«åããå¿ èŠããããããªãã¯ãã£ãŒã«ãã®åœ¢ã§EventPointãã³ã³ããŒãã³ãããžãã¯ã®äžéšã«ããããšã§ãããšå€æããŸããã
ãããã®èŠçŽ ã«ã€ããŠè©³ããèŠãŠã¿ãŸãããã
ã€ãã³ããã€ã³ã
[Serializable] public class EventPoint { public List<ActionBase> ActionsList = new List<ActionBase>(); public void Occurrence() { foreach (var action in ActionsList) { action.Execute(); } } }
ã³ãŒããããããããã«ããã¹ãŠãéåžžã«ç°¡åã§ãã EventPointã¯åºæ¬çã«ãããã«é¢é£ä»ããããäžé£ã®ã¢ã¯ã·ã§ã³ãæ ŒçŽãããªã¹ãã§ãã Occurenceé¢æ°ãåŒã³åºããšãã³ãŒãã«ã€ãã³ããã€ã³ããå ¥åãããŸãã ActionsListã¯ãUnity3DããŒã«ã䜿çšããŠã·ãªã¢ã«åã§ããããã«ãããªãã¯ãã£ãŒã«ãã«ãªããŸãã
ã³ãŒãã§äœ¿çš
public class CustomComponent : MonoBehaviour { [HideInInspector] public EventPoint OnStart; void Start () { OnStart.Occurrence(); } }
åè¿°ã®ããã«ãã¢ã¯ã·ã§ã³ã¯MonoBehaviourã®çžç¶äººã§ããå¿ èŠããããã€ãã³ãã®ãã€ã³ãã¯ãããåŒãèµ·ããå¿çã®çš®é¡ãåããªãããããã®ã¯ã©ã¹ãæœè±¡ãšããŠã©ããããŸãã
ã¢ã¯ã·ã§ã³ããŒã¹
public abstract class ActionBase : MonoBehaviour { public abstract void Execute(); }
æ§ããã§åå§çã ã€ãã³ããã€ã³ããå ¥åãããšãã«å¿çããžãã¯ãããªã¬ãŒããã«ã¯ã Executeé¢æ°ãå¿ èŠã§ãã
ããã§ãå¿çãå®è£
ã§ããŸãïŒäŸ-ã·ãŒã³ãªããžã§ã¯ãã®ãªã³/ãªãïŒ
public class ActionSetActive : ActionBase { public GameObject Target; public bool Value; public override void Execute() { Target.SetActive(Value); } }
ã·ã¹ãã ã®åºç€ãå®å šã«åçŽã§ãããäžè¬ã«ããªããã£ãã§ããããšãèªèããããšã¯é£ãããããŸããã ãã¹ãŠã®åé¡ã¯ãã€ã³ã¹ãã¯ã¿ãŒã«é¢é£ä»ããããã·ã¹ãã ã®èŠèŠéšåã®å®è£ ãåå ã§ãã 詳现ã«ã€ããŠã¯ã以äžãã芧ãã ããã
ãšãã£ã¿ãŒ
ç·šéè ã®å®è£ ã³ãŒãã®åæã«é²ãåã«ãç§ãã¡ãäœãç®æããŠããããèŠèŠçã«ç€ºãããããå®çŸããæ¹æ³ãæ€èšããŸãã 以äžã¯ãã€ãã³ããã€ã³ããšããããžã®å¿çãå«ãæ€æ»å®ã®ç»åã§ãã


é çªã«å§ããŸãããïŒ
ã³ã³ããŒãã³ãã®ã€ã³ã¹ãã¯ã¿ãŒãªãŒããŒã©ã€ã ã
æè»æ§ãå¿ èŠãªãããã€ãã³ããã€ã³ãã®ã€ã³ã¹ãã¯ã¿ãŒã§ãšãã£ã¿ãŒã®ãªãŒããŒã©ã€ããçµ±åããæ¹æ³ã¯2ã€ãããŸãã
- ç¹å®ã®ããããã£ã¿ã€ãã®ã€ã³ã¹ãã¯ã¿ãŒãªãŒããŒã©ã€ãïŒãã®å Žåã¯EventPoint ïŒ
- ã³ã³ããŒãã³ãå šäœã®ã€ã³ã¹ãã¯ã¿ãŒããªãŒããŒã©ã€ãããŸãïŒãã®å Žåã MonoBehaviourã®ç¶æ¿è ïŒ
äžè¬ã«ãäž¡æ¹ã®ãªãã·ã§ã³ãåãå ¥ããããŸããã€ã³ã¹ãã¯ã¿ãŒã§ã³ã³ããŒãã³ãã®ãããªãã¯ãã£ãŒã«ãã衚瀺ããããã®æãŸããé åºãèšå®ã§ããããã2çªç®ã®ãªãã·ã§ã³ãéžæããŸããã
MonoBehaviourã®ãã¹ãŠã®çžç¶äººã®ããã®ã«ã¹ã¿ã ãšãã£ã¿ãŒ
[CustomEditor(typeof(MonoBehaviour), true)] public class CustomMonoBehaviour_Editor : Editor { // }
å¿çã®ååŸãšäžèŠ§è¡šç€º
ã·ã¹ãã ãã§ããã ãæè»ã«ããããã«ãå®è£ ãããã¹ãŠã®å¿çïŒ ActionBaseãã掟çããã¯ã©ã¹ïŒãã€ã³ã¹ãã¯ã¿ãŒã«è¡šç€ºãããªã¹ãããç°¡åã«éžæããŠã€ãã³ããã€ã³ãã«è¿œå ããå¿ èŠããããŸãã
次ã®ããã«å®è£
ãããŸã
void OnEnable() { var runtimeAssembly = Assembly.GetAssembly(typeof(ActionBase)); m_actionList.Clear(); foreach (var checkedType in runtimeAssembly.GetTypes()) { if (typeof(ActionBase).IsAssignableFrom(checkedType) && checkedType != typeof(ActionBase)) { m_actionList.Add(checkedType.FullName, checkedType); } } }
ã芧ã®ãšãããActionBaseãããã¹ãŠã®åå«ã®ãªã¹ããååŸãããªã¹ãèªäœããã¢ã»ã³ããé€å€ããŸãã å¿çåã¯ã¯ã©ã¹åããååŸãããŸãã ããã§ã¯ãããè€éãªæ¹æ³ã§ã¯ã©ã¹å±æ§ãä»ããŠååãååŸããå±æ§ãä»ããŠçã説æãæå®ããŠå¿çããããšãã§ããŸãã ã¯ã©ã¹ã«è©³çŽ°ã«ååãä»ããã®ã§ãç§ã¯ããåçŽãªæ¹æ³ãæ¡çšããããšã«ããŸããã
ã€ãã³ããã€ã³ããšã³ã³ããŒãã³ãã®ãããªãã¯ãã£ãŒã«ãã®ãªã¹ã
ã€ãã³ããã€ã³ãã®ã¿ãåºåããæ¹æ³ãåå®çŸ©ããå¿ èŠããããããã€ã³ã¹ãã¯ã¿ãŒã®æç»é¢æ°ã¯æ¬¡ã®åœ¢åŒãåããŸãã
ã€ã³ã¹ãã¯ã¿ãŒGUIã¬ã³ããªã³ã°é¢æ°
public override void OnInspectorGUI() { serializedObject.Update(); base.OnInspectorGUI(); // FindAndEditEventPoint(target); // serializedObject.ApplyModifiedProperties(); }
ã€ãã³ããã€ã³ããèŠã€ããããã®é¢æ°ïŒEventPointsïŒ
void FindAndEditEventPoint(UnityEngine.Object editedObject) { var fields = editedObject.GetType().GetFields(); foreach (var fieldInfo in fields) { if (fieldInfo.FieldType == typeof(EventPoint)) { EventPointInspector(fieldInfo, editedObject); // } } }
ãã®ã³ãŒããèŠããšãã«çããäž»ãªçåã¯ã SerializedPropertyã§ã¯ãªãããªãã¬ã¯ã·ã§ã³ã䜿çšãããçç±ã§ãã çç±ã¯ç°¡åã§ããMonoBehaviourã®ãã¹ãŠã®çžç¶äººã«å¯ŸããŠã€ã³ã¹ãã¯ã¿ãŒãåå®çŸ©ãããããã³ã³ããŒãã³ããã£ãŒã«ãã®ååãšãããã®åã®é¢ä¿ã«ã€ããŠã¯ããããªãããã serializedObject.FindPropertyïŒïŒé¢æ°ã䜿çšã§ããŸããã
次ã«ãã€ãã³ããã€ã³ãã®ã€ã³ã¹ãã¯ã¿ãŒã®å³æã¬ã³ããªã³ã°ã«ã€ããŠèª¬æããŸãã ããã§ã¯ãã¹ãŠãéåžžã«åçŽãªã®ã§ãã³ãŒãå šäœã説æããŸãããFoldOutã¹ã¿ã€ã«ã¯ãå¿çã«é¢ããæ å ±ã®æãããã¿ãšå±éã«äœ¿çšãããŸãã ããŒãã€ã³ãã«ã€ããŠèª¬æããŸãããã
EventPointã€ã³ã¹ã¿ã³ã¹ããŒã¿ã®ååŸ
var eventPoint = (EventPoint)eventPointField.GetValue(editedObject);
å¿çããªã¹ãããããããã€ãã³ããã€ã³ãã«è¿œå ãã
var selectIndex = EditorGUILayout.Popup(-1, actionNames.ToArray()); if (selectIndex >= 0) { var actionType = m_actionList[actionNames [selectIndex]]; var actionObject = (ActionBase)((target as Component).gameObject.AddComponent(actionType)); eventPoint.ActionsList.Add(actionObject); }
å¿çã®ã€ã³ã¹ãã¯ã¿ãŒïŒã¢ã¯ã·ã§ã³ïŒ
äžèšã®ã³ãŒããããããããã«ãå¿çã¯ã³ã³ããŒãã³ãã«ãªããžã§ã¯ããšããŠè¿œå ãããŸãããã®ãããªã¢ã¯ã·ã§ã³ã®çµæããã®ã¯ã©ã¹ã¯ã€ã³ã¹ãã¯ã¿ãŒãŠã£ã³ããŠã«è¡šç€ºãããããã«å¿ããŠåŠçãããŸãïŒãã¹ãŠã®ãã£ãŒã«ãã衚瀺ããããªã©ïŒã ãã©ã¡ãŒã¿ã®èšå®ã«é¢ãããã¹ãŠã®æäœã1ãæã§è¡ããããããã¯äŸ¿å©ã§ã¯ãããŸããã ãŸããUnityãã€ã³ã¹ãã¯ã¿ãŒã«å¿çã¯ã©ã¹ãã©ã¡ãŒã¿ãŒã衚瀺ããã®ãç¡å¹ã«ããŸãã
ããã¯ãActionBaseã®ãã¹ãŠã®åå«ã®ãšãã£ã¿ãŒããªãŒããŒã©ã€ãããããšã«ããè¡ãããŸãã
[CustomEditor(typeof(ActionBase), true)] public class ActionBase_Editor : Editor { public override void OnInspectorGUI() {} }
ããã§ãã€ãã³ããã€ã³ãã«å¯ŸããŠåå®çŸ©ããã€ã³ã¹ãã¯ã¿ãŒã§å¿çã¯ã©ã¹ã®ãã£ãŒã«ãã衚瀺ã§ããŸãïŒåºæ¬ã³ãŒããã¹ã¿ã€ã«ã®è¿œå æ¹æ³ïŒFoldOutïŒã説æããå¿
èŠã¯ãªããšæããŸãïŒ
var destroyingComponent = new List<ActionBase>(); for (var i = 0; i < eventPoint.ActionsList.Count; i++) { EditorGUILayout.BeginHorizontal(); ActionBaseInspector(eventPoint.ActionsList[i]); // , if (GUILayout.Button("-", GUILayout.Width(25))) { destroyingComponent.Add(eventPoint.ActionsList[i]); } EditorGUILayout.EndHorizontal(); }
å¿çïŒã¢ã¯ã·ã§ã³ïŒã®åé€ã¯æ¬¡ã®ãšããã§ã
foreach (ActionBase action in destroyingComponent) { RecursiveFindAndDeleteAction(action); eventPoint.ActionsList.Remove(action); GameObject.DestroyImmediate(action); } void RecursiveFindAndDeleteAction(object obj) { var fields = obj.GetType().GetFields(); var destroyingComponent = new List<ActionBase>(); foreach (var fieldInfo in fields) { if (fieldInfo.FieldType == typeof(EventPoint)) { var eventPoint = (EventPoint)fieldInfo.GetValue(obj); destroyingComponent.AddRange(eventPoint.ActionsList); eventPoint.ActionsList.Clear(); } } foreach (ActionBase action in destroyingComponent) { RecursiveFindAndDeleteAction(action); GameObject.DestroyImmediate(action); } }
ã·ã¹ãã ã¯ã€ãã³ããšå¿çã®ãã§ãŒã³ã®é·ãã«å¶éã¯ãããŸãããïŒããã¯å¯èœã§ããïŒããã§ãŒã³ã®éå§ãŸãã¯äžéã§ã®å¿çã®åé€ã«ã¯ãããäœããã¹ãŠã®å¿çã®åé€ã䌎ãå¿ èŠããããŸãããªããžã§ã¯ãã®ã³ã³ããŒãã³ããå«ããã¹ãŠã®ãã®ãåé€ããããŒã¹ã¬ã¹ãã³ã¹ãåé€ããŸãã
泚ïŒ
ããã«ãç§ããŸã å
æã§ããªãæãå¥åŠãªç¬éããããŸãïŒUnityããšãã£ã¿ãŒãä»ããŠãªããžã§ã¯ãããã³ã³ããŒãã³ããåé€ããããã«DestroyImmediateã䜿çšããããšãæšå¥šããŠããã«ããããããããšãã£ã¿ãŒã§MissingReferenceExceptionãšã©ãŒãçºçããŸãã ãã ããã³ãŒãã®æ£ããåäœã«ã¯åœ±é¿ããŸããã ãã°ã¯ç§ã®ãã®ãUnityã§ãããç§ã¯ãŸã ããã解æããããšããŠããŸãã 誰ããåé¡ãç¥ã£ãŠãããªããã³ã¡ã³ãã«æžããŠãã ããã
å¿çãå®è£ ããã¯ã©ã¹ã®ãã£ãŒã«ãã®æç»ïŒã¢ã¯ã·ã§ã³ïŒ
åè¿°ã®ããã«ããã£ãŒã«ãåã¯äœ¿çšã§ããã serializedObjectã¯å¿çã«äœ¿çšã§ããªããããã³ãŒãã§serializedObject.FindPropertyïŒïŒã䜿çšã§ããŸããããããã£ãŠã EventPointã®ããã«ããªãã¬ã¯ã·ã§ã³ã䜿çšããããããæãäžäŸ¿ã§ãã·ã¹ãã å šäœã®ç¬éã
å¿çã®ã€ã³ã¹ãã¯ã¿ãŒãæã
void ActionBaseInspector(ActionBase action) { var fields = action.GetType().GetFields(); EditorGUILayout.BeginVertical(); EditorGUILayout.Space(); EditorGUILayout.Space(); EditorGUILayout.Space(); foreach (FieldInfo fieldInfo in fields) { if (fieldInfo.FieldType == typeof(int)) { var value = (int)fieldInfo.GetValue(action); value = EditorGUILayout.IntField(fieldInfo.Name, value); fieldInfo.SetValue(action, value); } else if (fieldInfo.FieldType == typeof(float)) { var value = (float)fieldInfo.GetValue(action); value = EditorGUILayout.FloatField(fieldInfo.Name, value); fieldInfo.SetValue(action, value); } // .. , } FindAndEditEventPoint(action); // . EditorGUILayout.EndVertical(); }
ã芧ã®ãšãããå¿ èŠãªãã¹ãŠã®ãã£ãŒã«ãã¿ã€ãã«ã€ããŠããã³ã䜿çšããŠãšãã£ã¿ãŒã®åºåã決å®ããå¿ èŠããããŸãã äžæ¹ã§ãããã¯ããªãã§ãããä»æ¹ã§ããã£ãŒã«ããšãã£ã¿ãŒãåå®çŸ©ããããšãã§ããŸããããã¯ãããšãã°ãµãŠã³ãã«äœ¿çšããŸãã
ãŸãšã
ã·ã¹ãã å šäœãèŠããšãè€éãªããšã¯äœããããŸãããããããããããå©ç¹ã¯åã«å¹æµãããã®ã§ã¯ãããŸããã æéãšãšãã«ã®ãŒã®ç¯çŽã¯å·šå€§ã§ãã å®éãããã°ã©ããŒã¯ããã¶ã€ããŒããã®èŠæ±ã«å¿ããŠãã€ãã³ããã€ã³ããšãã®å ¥ãå£ãäœæããå¿ èŠããããŸãããããŠããããããæãæŽãããšåŒã°ãããã®ããã¡ãããå¿çã³ãŒããèšè¿°ããå¿ èŠããããŸããããã§ã¯ãã¹ãŠãæ³ååã«ãã£ãŠã®ã¿å¶éãããŸãã倧ããªè€éãªããšãããããšãã§ããå°ããªåé³ç¯ãããããããããšãã§ããŸãã
èšäºã®åé ã§ãã€ãã³ãåŠçãä»ã®ã³ã³ããŒãã³ãã«å§ä»»ããããšã¯å®çšçã§ã¯ãªãããšã説æããŸããããå®éãããã«ã¯ãã€ãã©ã€ã³ã®èŠ³ç¹ããå©ç¹ããããŸãã ã¡ãã»ãŒãžã·ã¹ãã ïŒåã®èšäºãåç §ïŒã䜿çšããŠãã€ãã³ããã€ã³ããžã®å ¥åãäœæã§ããããã«ããããã«ããã®åŠçã«ç¹åããã³ã³ããŒãã³ããå®çŸ©ããããšãã§ããŸãã ãã®ãããªã³ã³ããŒãã³ããæå®ã®å Žæã«é 眮ãããšãèšèšè ã¯ãªããžã§ã¯ãã®éå±€ã粟æ»ããå¿ èŠããªããªããŸãã ãã®ã¢ãããŒãã¯ãããšãã°ããµã©ãŠã³ããµãŠã³ãã®èª¿æŽã«äœ¿çšã§ããŸãã
åè¿°ã®ããã«ãã·ã¹ãã ã¯ã€ãã³ããšå¿çã®é·ããã§ãŒã³ã«éå®ããããå®éããã¶ã€ããŒã¯åäœã®ä»»æã®å€§èŠæš¡ã§è€éãªããžãã¯ïŒ Visual Scriptingãåç §ïŒãäœæã§ããŸãããå®éã«ã¯äŸ¿å©ã§èªã¿ã«ãããããå°ãªããšããã§ãŒã³ãå¶éããããšããå§ãããŸãå£é æé ã ç§ãã¡ã®ä»äºã®éçšã§ãç§ã®ããŒãããŒãšç§ã¯ãã®ãããªãã§ãŒã³ãæ¡åŒµããŒãžã§ã³ã§äœ¿çšããŸãã-ããã§ãç·šéã®ããã«å¥ã®ãŠã£ã³ããŠïŒ EdtiorWindow ïŒã䜿çšããŸããã ããžãã¯ã«è€éãªåå²ãäœæããå¿ èŠãçãããŸã§ããã¹ãŠãé 調ã§ããã ãã®æ··ä¹±ã§ãã°ããããŠç解ããããšã¯ãåã«éçŸå®çã§ããã ãããç§ã®ã·ã¹ãã ã§ãã€ã³ã¹ãã¯ã¿ãŒã«åºã¥ããåçŽãªãœãªã¥ãŒã·ã§ã³ã®åŽé¢ã«è¡ã£ãçç±ã§ãã
å šäœçãªVisual Scriptingã«é¢ããŠãUnityã³ã³ããŒãã³ããä»ããã€ãã³ããšå¿çã®ã¢ãããŒãããã³ãããã®å®è£ ã«ã¯ç¬èªã®å©ç¹ããããæçµçã«ãããŒãããŒãšç§ã¯ãããã€ãã®ãããžã§ã¯ãã§ã®äœæ¥ã®éçšã§ãæ¬æ Œçãªããžã¥ã¢ã«ããžãã¯ãšãã£ã¿ãŒãéçºããããšã«ããŸããã ããããåºãŠããã®ã¯å¥ã®èšäºã®ãããã¯ã§ãããçµè«ãšããŠãuGUIã®äŸã䜿çšããŠã説æããã·ã¹ãã ã®åäœã瀺ãçããããªãæäŸããããšæããŸãã
https://youtu.be/sfZ9Tf_EVYE