示例#1
0
    ///////////////////////////////////////////////////////////////////////
    //  Name: Invoke
    //  Description:  Callback for asynchronous BeginGetEvent method.
    //
    //  pAsyncResult: Pointer to the result.
    /////////////////////////////////////////////////////////////////////////
    int IMFAsyncCallback.Invoke(IMFAsyncResult pAsyncResult)
    {
        // Make sure we *never* leave this entry point with an exception
        try
        {
            int hr;
            IMFMediaEvent pEvent;
            MediaEventType meType = MediaEventType.MEUnknown;  // Event type
            PropVariant varEventData = new PropVariant();	        // Event data

            // Get the event from the event queue.
            hr = m_pMEG.EndGetEvent(pAsyncResult, out pEvent);
            MFError.ThrowExceptionForHR(hr);

            // Get the event type.
            hr = pEvent.GetType(out meType);
            MFError.ThrowExceptionForHR(hr);

            // Get the event status. If the operation that triggered the event did
            // not succeed, the status is a failure code.
            hr = pEvent.GetStatus(out m_hrStatus);
            MFError.ThrowExceptionForHR(hr);

            if (m_hrStatus == 862022) // NS_S_DRM_MONITOR_CANCELLED
            {
                m_hrStatus = MFError.MF_E_OPERATION_CANCELLED;
                m_state = Enabler.Complete;
            }

            // Get the event data.
            hr = pEvent.GetValue(varEventData);
            MFError.ThrowExceptionForHR(hr);

            // For the MEEnablerCompleted action, notify the application.
            // Otherwise, request another event.
            Debug.WriteLine(string.Format("Content enabler event: {0}", meType.ToString()));

            if (meType == MediaEventType.MEEnablerCompleted)
            {
                PostMessage(m_hwnd, WM_APP_CONTENT_ENABLER, IntPtr.Zero, IntPtr.Zero);
            }
            else
            {
                if (meType == MediaEventType.MEEnablerProgress)
                {
                    if (varEventData.GetVariantType() == PropVariant.VariantType.String)
                    {
                        Debug.WriteLine(string.Format("Progress: {0}", varEventData.GetString()));
                    }
                }
                hr = m_pMEG.BeginGetEvent(this, null);
                MFError.ThrowExceptionForHR(hr);
            }

            // Clean up.
            varEventData.Clear();
            SafeRelease(pEvent);

            return S_Ok;
        }
        catch (Exception e)
        {
            return Marshal.GetHRForException(e);
        }
    }
示例#2
0
    ///////////////////////////////////////////////////////////////////////
    //  Name: CompleteEnable
    //  Description:  Completes the current action.
    //
    //  This method invokes the PMP session's callback.
    /////////////////////////////////////////////////////////////////////////
    public void CompleteEnable()
    {
        int hr;
        m_state = Enabler.Complete;

        // m_pCallback can be NULL if the BeginEnableContent was not called.
        // This is the case when the application initiates the enable action, eg
        // when MFCreatePMPMediaSession fails and returns an IMFActivate pointer.
        if (m_pCallback != null)
        {
            Debug.WriteLine(string.Format("ContentProtectionManager: Invoking the pipeline's callback. (status = 0x{0})", m_hrStatus));
            IMFAsyncResult pResult;

            hr = MFExtern.MFCreateAsyncResult(null, m_pCallback, m_punkState, out pResult);
            MFError.ThrowExceptionForHR(hr);

            hr = pResult.SetStatus(m_hrStatus);
            MFError.ThrowExceptionForHR(hr);

            hr = MFExtern.MFInvokeCallback(pResult);
            MFError.ThrowExceptionForHR(hr);
        }
    }
示例#3
0
    ///////////////////////////////////////////////////////////////////////
    //  Name: DoEnable
    //  Description:  Does the enabler action.
    //
    //  flags: If ForceNonSilent, then always use non-silent enable.
    //         Otherwise, use silent enable if possible.
    ////////////////////////////////////////////////////////////////////////
    public void DoEnable(EnablerFlags flags)
    {
        Debug.WriteLine(string.Format("ContentProtectionManager::DoEnable (flags ={0})", flags.ToString()));

        int hr;
        bool bAutomatic = false;
        Guid guidEnableType;

        try
        {
            // Get the enable type. (Just for logging. We don't use it.)
            hr = m_pEnabler.GetEnableType(out guidEnableType);
            MFError.ThrowExceptionForHR(hr);

            LogEnableType(guidEnableType);

            // Query for the IMFMediaEventGenerator interface so that we can get the
            // enabler events.
            m_pMEG = (IMFMediaEventGenerator)m_pEnabler;

            // Ask for the first event.
            hr = m_pMEG.BeginGetEvent(this, null);
            MFError.ThrowExceptionForHR(hr);

            // Decide whether to use silent or non-silent enabling. If flags is ForceNonSilent,
            // then we use non-silent. Otherwise, we query whether the enabler object supports
            // silent enabling (also called "automatic" enabling).
            if (flags == EnablerFlags.ForceNonSilent)
            {
                Debug.WriteLine(("Forcing non-silent enable."));
                bAutomatic = false;
            }
            else
            {
                hr = m_pEnabler.IsAutomaticSupported(out bAutomatic);
                MFError.ThrowExceptionForHR(hr);
                Debug.WriteLine(string.Format("IsAutomatic: auto = {0}", bAutomatic));
            }

            // Start automatic or non-silent, depending.
            if (bAutomatic)
            {
                m_state = Enabler.SilentInProgress;
                Debug.WriteLine("Content enabler: Automatic is supported");
                hr = m_pEnabler.AutomaticEnable();
                MFError.ThrowExceptionForHR(hr);
            }
            else
            {
                m_state = Enabler.NonSilentInProgress;
                Debug.WriteLine("Content enabler: Using non-silent enabling");
                DoNonSilentEnable();
            }
        }
        catch (Exception e)
        {
            m_hrStatus = Marshal.GetHRForException(e);
            throw;
        }
    }
示例#4
0
 public ConditionalDrawerInternal(Enabler enabler = null, params ActionDrawer[] actionDrawers)
 {
     this.actionDrawers = actionDrawers;
     m_Enabler          = enabler;
 }
示例#5
0
 /// <summary>
 /// Conditioned drawer that will draw something depending of the return of the switch
 /// </summary>
 /// <param name="switch">Chose witch drawing to use</param>
 /// <param name="drawIfTrue">This will be draw if the <see cref="switch"/> is true</param>
 /// <param name="drawIfFalse">This will be draw if the <see cref="switch"/> is false</param>
 /// <returns>A IDrawer object</returns>
 public static IDrawer TernaryConditional(Enabler @switch, ActionDrawer drawIfTrue, ActionDrawer drawIfFalse)
 => new TernaryConditionalDrawerInternal(@switch, drawIfTrue, drawIfFalse);
示例#6
0
 internal static IDrawer ConditionalWithAdditionalProperties(Enabler enabler, AnimFloat animation, params ActionDrawer[] contentDrawers)
 {
     return(new ConditionalDrawerWithAdditionalPropertiesInternal(enabler, animation, contentDrawers));
 }
示例#7
0
 public ContentProtectionManager(IntPtr hNotify)
 {
     m_hwnd  = hNotify;
     m_state = Enabler.Ready;
 }
示例#8
0
 /// <summary>
 /// Conditioned drawer that will only be drawn if its enabler function is null or return true
 /// </summary>
 /// <param name="enabler">Enable the drawing if null or return true</param>
 /// <param name="contentDrawers">The content of the group</param>
 /// <returns>A IDrawer object</returns>
 public static IDrawer Conditional(Enabler enabler, params ActionDrawer[] contentDrawers)
 {
     return(new ConditionalDrawerInternal(enabler, contentDrawers));
 }
示例#9
0
 public DelegateParamterisedCommand(Executable execute, Enabler canExecute)
 {
     _execute    = execute;
     _canExecute = canExecute;
 }
示例#10
0
 public static IDrawer AdvancedFoldoutGroup <TEnum, TState>(GUIContent foldoutTitle, TEnum foldoutMask, ExpandedState <TEnum, TState> foldoutState, Enabler isAdvanced, SwitchEnabler switchAdvanced, IDrawer normalContent, ActionDrawer advancedContent, FoldoutOption options = FoldoutOption.Indent)
     where TEnum : struct, IConvertible
 {
     return(AdvancedFoldoutGroup(foldoutTitle, foldoutMask, foldoutState, isAdvanced, switchAdvanced, normalContent.Draw, advancedContent, options));
 }
示例#11
0
 public static IDrawer AdvancedFoldoutGroup <TEnum, TState>(GUIContent foldoutTitle, TEnum foldoutMask, ExpandedState <TEnum, TState> foldoutState, Enabler isAdvanced, SwitchEnabler switchAdvanced, ActionDrawer normalContent, ActionDrawer advancedContent, FoldoutOption options = FoldoutOption.Indent)
     where TEnum : struct, IConvertible
 {
     return(FoldoutGroup(foldoutTitle, foldoutMask, foldoutState, options, isAdvanced, switchAdvanced, normalContent,
                         Conditional((serialized, owner) => isAdvanced(serialized, owner) && foldoutState[foldoutMask], advancedContent).Draw));
 }
示例#12
0
        // This one is private as we do not want to have unhandled advanced switch. Change it if necessary.
        static IDrawer FoldoutGroup <TEnum, TState>(GUIContent title, TEnum mask, ExpandedState <TEnum, TState> state, FoldoutOption options, Enabler showAdditionalProperties, SwitchEnabler switchAdditionalProperties, params ActionDrawer[] contentDrawers)
            where TEnum : struct, IConvertible
        {
            return(Group((data, owner) =>
            {
                bool isBoxed = (options & FoldoutOption.Boxed) != 0;
                bool isIndented = (options & FoldoutOption.Indent) != 0;
                bool isSubFoldout = (options & FoldoutOption.SubFoldout) != 0;
                bool noSpaceAtEnd = (options & FoldoutOption.NoSpaceAtEnd) != 0;
                bool expended = state[mask];
                bool newExpended = expended;

                if (isSubFoldout)
                {
                    newExpended = CoreEditorUtils.DrawSubHeaderFoldout(title, expended, isBoxed);
                }
                else
                {
                    CoreEditorUtils.DrawSplitter(isBoxed);
                    newExpended = CoreEditorUtils.DrawHeaderFoldout(title, expended, isBoxed,
                                                                    showAdditionalProperties == null ? (Func <bool>)null : () => showAdditionalProperties(data, owner),
                                                                    switchAdditionalProperties == null ? (Action)null : () => switchAdditionalProperties(data, owner));
                }
                if (newExpended ^ expended)
                {
                    state[mask] = newExpended;
                }
                if (newExpended)
                {
                    if (isIndented)
                    {
                        ++EditorGUI.indentLevel;
                    }
                    for (var i = 0; i < contentDrawers.Length; i++)
                    {
                        contentDrawers[i](data, owner);
                    }
                    if (isIndented)
                    {
                        --EditorGUI.indentLevel;
                    }
                    if (!noSpaceAtEnd)
                    {
                        EditorGUILayout.Space();
                    }
                }
            }));
        }
示例#13
0
 public TernaryConditionalDrawerInternal(Enabler @switch, ActionDrawer drawIfTrue, ActionDrawer drawIfFalse)
 {
     this.drawIfTrue  = drawIfTrue;
     this.drawIfFalse = drawIfFalse;
     m_Switch         = @switch;
 }
示例#14
0
 public ConditionalDrawerWithAdditionalPropertiesInternal(Enabler enabler = null, AnimFloat anim = null, params ActionDrawer[] actionDrawers)
 {
     m_ActionDrawers = actionDrawers;
     m_Enabler       = enabler;
     m_Anim          = anim;
 }
示例#15
0
 public ContentProtectionManager(IntPtr hNotify)
 {
     m_hwnd = hNotify;
     m_state = Enabler.Ready;
 }
示例#16
0
    ///////////////////////////////////////////////////////////////////////
    //  Name: Invoke
    //  Description:  Callback for asynchronous BeginGetEvent method.
    //
    //  pAsyncResult: Pointer to the result.
    /////////////////////////////////////////////////////////////////////////

    HResult IMFAsyncCallback.Invoke(IMFAsyncResult pAsyncResult)
    {
        // Make sure we *never* leave this entry point with an exception
        try
        {
            HResult        hr;
            IMFMediaEvent  pEvent;
            MediaEventType meType       = MediaEventType.MEUnknown; // Event type
            PropVariant    varEventData = new PropVariant();        // Event data

            // Get the event from the event queue.
            hr = m_pMEG.EndGetEvent(pAsyncResult, out pEvent);
            MFError.ThrowExceptionForHR(hr);

            // Get the event type.
            hr = pEvent.GetType(out meType);
            MFError.ThrowExceptionForHR(hr);

            // Get the event status. If the operation that triggered the event did
            // not succeed, the status is a failure code.
            hr = pEvent.GetStatus(out m_hrStatus);
            MFError.ThrowExceptionForHR(hr);

            if ((int)m_hrStatus == 862022) // NS_S_DRM_MONITOR_CANCELLED
            {
                m_hrStatus = HResult.MF_E_OPERATION_CANCELLED;
                m_state    = Enabler.Complete;
            }

            // Get the event data.
            hr = pEvent.GetValue(varEventData);
            MFError.ThrowExceptionForHR(hr);

            // For the MEEnablerCompleted action, notify the application.
            // Otherwise, request another event.
            Debug.WriteLine(string.Format("Content enabler event: {0}", meType.ToString()));

            if (meType == MediaEventType.MEEnablerCompleted)
            {
                PostMessage(m_hwnd, WM_APP_CONTENT_ENABLER, IntPtr.Zero, IntPtr.Zero);
            }
            else
            {
                if (meType == MediaEventType.MEEnablerProgress)
                {
                    if (varEventData.GetVariantType() == PropVariant.VariantType.String)
                    {
                        Debug.WriteLine(string.Format("Progress: {0}", varEventData.GetString()));
                    }
                }
                hr = m_pMEG.BeginGetEvent(this, null);
                MFError.ThrowExceptionForHR(hr);
            }

            // Clean up.
            varEventData.Clear();
            SafeRelease(pEvent);

            return(HResult.S_OK);
        }
        catch (Exception e)
        {
            return((HResult)Marshal.GetHRForException(e));
        }
    }
示例#17
0
    ///////////////////////////////////////////////////////////////////////
    //  Name: BeginEnableContent
    //  Description:  Called by the PMP session to start the enable action.
    /////////////////////////////////////////////////////////////////////////
    public int BeginEnableContent(
        IMFActivate pEnablerActivate,
        IMFTopology pTopo,
        IMFAsyncCallback pCallback,
        object punkState
        )
    {
        // Make sure we *never* leave this entry point with an exception
        try
        {
            Debug.WriteLine("ContentProtectionManager::BeginEnableContent");

            if (m_pEnabler != null)
            {
                throw new COMException("A previous call is still pending", E_Fail);
            }

            int hr;

            // Save so we can create an async result later
            m_pCallback = pCallback;
            m_punkState = punkState;

            // Create the enabler from the IMFActivate pointer.
            object o;
            hr = pEnablerActivate.ActivateObject(typeof(IMFContentEnabler).GUID, out o);
            MFError.ThrowExceptionForHR(hr);
            m_pEnabler = o as IMFContentEnabler;

            // Notify the application. The application will call DoEnable from the app thread.
            m_state = Enabler.Ready; // Reset the state.
            PostMessage(m_hwnd, WM_APP_CONTENT_ENABLER, IntPtr.Zero, IntPtr.Zero);

            return S_Ok;
        }
        catch (Exception e)
        {
            return Marshal.GetHRForException(e);
        }
    }
示例#18
0
    private void DrawSelectFunction(NodeOutput outPut, NodeInput inPut)
    {
        var functions = selects[outPut].functions;
        var target    = functions[inPut];

        if (!selects.ContainsKey(outPut) || !functions.ContainsKey(inPut))
        {
            return;
        }
        inPut.DisplayLayout();
        if (isExpanded)
        {
            if (target is SpriteChanger)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Label(selectOptions[0]);
                if (GUILayout.Button("기능 삭제"))
                {
                    if (!selects.ContainsKey(outPut) || !functions.ContainsKey(inPut))
                    {
                        return;
                    }
                    DestroyImmediate((MonoBehaviour)functions[inPut]);
                    DestroyImmediate(target, true);
                    functions.Remove(inPut);
                    try
                    {
                        inPut.connection.connections.Remove(inPut);
                    }
                    catch (NullReferenceException e)
                    {
                    }
                    Inputs.Remove(inPut);
                    Vector2 topLeft = rect.position;
                    rect = new Rect(topLeft.x, topLeft.y, 200, 100);
                    DrawConnectors();
                    return;
                }
                GUILayout.EndHorizontal();
                target.delay = EditorGUILayout.FloatField("발동 딜레이(초)", target.delay);

                SpriteChanger changer = (SpriteChanger)target;
                GUILayout.BeginHorizontal();
                GUILayout.Label("기본 스프라이트");
                changer.baseSprite = EditorGUILayout.ObjectField(changer.baseSprite, typeof(Sprite), true) as Sprite;
                GUILayout.Label("선택 스프라이트");
                changer.selectedSprite = EditorGUILayout.ObjectField(changer.selectedSprite, typeof(Sprite), true) as Sprite;
                GUILayout.EndHorizontal();
            }
            else if (target is Enabler)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Label(selectOptions[1]);
                if (GUILayout.Button("기능 삭제"))
                {
                    if (!selects.ContainsKey(outPut) || !functions.ContainsKey(inPut))
                    {
                        return;
                    }
                    DestroyImmediate((MonoBehaviour)functions[inPut]);
                    DestroyImmediate(target, true);
                    functions.Remove(inPut);
                    try
                    {
                        inPut.connection.connections.Remove(inPut);
                    }
                    catch (NullReferenceException e)
                    {
                    }
                    Inputs.Remove(inPut);
                    Vector2 topLeft = rect.position;
                    rect = new Rect(topLeft.x, topLeft.y, 200, 100);
                    DrawConnectors();
                    return;
                }
                GUILayout.EndHorizontal();
                target.delay = EditorGUILayout.FloatField("발동 딜레이(초)", target.delay);

                Enabler enabler = (Enabler)target;
                enabler.option = (EnableOption)EditorGUILayout.EnumPopup("옵션", enabler.option);
            }
            else if (target is SoundPlayer)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Label(selectOptions[2]);
                if (GUILayout.Button("기능 삭제"))
                {
                    if (!selects.ContainsKey(outPut) || !functions.ContainsKey(inPut))
                    {
                        return;
                    }
                    DestroyImmediate((MonoBehaviour)functions[inPut]);
                    DestroyImmediate(target, true);
                    functions.Remove(inPut);
                    try
                    {
                        inPut.connection.connections.Remove(inPut);
                    }
                    catch (NullReferenceException e)
                    {
                    }
                    Inputs.Remove(inPut);
                    Vector2 topLeft = rect.position;
                    rect = new Rect(topLeft.x, topLeft.y, 200, 100);
                    DrawConnectors();
                    return;
                }
                GUILayout.EndHorizontal();
                target.delay = EditorGUILayout.FloatField("발동 딜레이(초)", target.delay);

                SoundPlayer player = (SoundPlayer)target;
                player.sound = EditorGUILayout.ObjectField("효과음", player.sound, typeof(AudioClip), true) as AudioClip;
            }
            else if (target is MessageDisplayer)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Label(selectOptions[3]);
                if (GUILayout.Button("기능 삭제"))
                {
                    if (!selects.ContainsKey(outPut) || !functions.ContainsKey(inPut))
                    {
                        return;
                    }
                    DestroyImmediate((MonoBehaviour)functions[inPut]);
                    DestroyImmediate(target, true);
                    functions.Remove(inPut);
                    try
                    {
                        inPut.connection.connections.Remove(inPut);
                    }
                    catch (NullReferenceException e)
                    {
                    }
                    Inputs.Remove(inPut);
                    Vector2 topLeft = rect.position;
                    rect = new Rect(topLeft.x, topLeft.y, 200, 100);
                    DrawConnectors();
                    return;
                }
                GUILayout.EndHorizontal();
                target.delay = EditorGUILayout.FloatField("발동 딜레이(초)", target.delay);

                GUILayout.BeginHorizontal();
                MessageDisplayer displayer = (MessageDisplayer)target;
                displayer.inputMessage = EditorGUILayout.TextArea(displayer.inputMessage);
                GUILayout.EndHorizontal();
            }
            else if (target is ItemGainer)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Label(selectOptions[4]);
                if (GUILayout.Button("기능 삭제"))
                {
                    if (!selects.ContainsKey(outPut) || !functions.ContainsKey(inPut))
                    {
                        return;
                    }
                    DestroyImmediate((MonoBehaviour)functions[inPut]);
                    DestroyImmediate(target, true);
                    functions.Remove(inPut);
                    try
                    {
                        inPut.connection.connections.Remove(inPut);
                    }
                    catch (NullReferenceException e)
                    {
                    }
                    Inputs.Remove(inPut);
                    Vector2 topLeft = rect.position;
                    rect = new Rect(topLeft.x, topLeft.y, 200, 100);
                    DrawConnectors();
                    return;
                }
                GUILayout.EndHorizontal();
                target.delay = EditorGUILayout.FloatField("발동 딜레이(초)", target.delay);
            }
            else if (target is DangerChanger)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Label(selectOptions[5]);
                if (GUILayout.Button("기능 삭제"))
                {
                    if (!selects.ContainsKey(outPut) || !functions.ContainsKey(inPut))
                    {
                        return;
                    }
                    DestroyImmediate((MonoBehaviour)functions[inPut]);
                    DestroyImmediate(target, true);
                    functions.Remove(inPut);
                    try
                    {
                        inPut.connection.connections.Remove(inPut);
                    }
                    catch (NullReferenceException e)
                    {
                    }
                    Inputs.Remove(inPut);
                    Vector2 topLeft = rect.position;
                    rect = new Rect(topLeft.x, topLeft.y, 200, 100);
                    DrawConnectors();
                    return;
                }
                GUILayout.EndHorizontal();
                target.delay = EditorGUILayout.FloatField("발동 딜레이(초)", target.delay);

                DangerChanger dChanger = (DangerChanger)target;
                dChanger.newDanger = EditorGUILayout.IntField("새 위험도", dChanger.newDanger);
            }
            else if (target is SpriteShower)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Label(selectOptions[6]);
                if (GUILayout.Button("기능 삭제"))
                {
                    if (!selects.ContainsKey(outPut) || !functions.ContainsKey(inPut))
                    {
                        return;
                    }
                    DestroyImmediate((MonoBehaviour)functions[inPut]);
                    DestroyImmediate(target, true);
                    functions.Remove(inPut);
                    try
                    {
                        inPut.connection.connections.Remove(inPut);
                    }
                    catch (NullReferenceException e)
                    {
                    }
                    Inputs.Remove(inPut);
                    Vector2 topLeft = rect.position;
                    rect = new Rect(topLeft.x, topLeft.y, 200, 100);
                    DrawConnectors();
                    return;
                }
                GUILayout.EndHorizontal();
                target.delay = EditorGUILayout.FloatField("발동 딜레이(초)", target.delay);

                SpriteShower shower = (SpriteShower)target;
                for (int i = 0; i < shower.sprites.Count; i++)
                {
                    shower.sprites[i] = EditorGUILayout.ObjectField(shower.sprites[i], typeof(Sprite), true) as Sprite;
                }
                Sprite newSprite = null;
                newSprite = EditorGUILayout.ObjectField(newSprite, typeof(Sprite), true) as Sprite;
                if (newSprite != null)
                {
                    shower.sprites.Add(newSprite);
                }
            }
            else if (target is EventMaker)
            {
                GUILayout.BeginHorizontal();
                GUILayout.Label(selectOptions[7]);
                if (GUILayout.Button("기능 삭제"))
                {
                    if (!selects.ContainsKey(outPut) || !functions.ContainsKey(inPut))
                    {
                        return;
                    }
                    DestroyImmediate((MonoBehaviour)functions[inPut]);
                    functions.Remove(inPut);
                    try
                    {
                        inPut.connection.connections.Remove(inPut);
                    }
                    catch (NullReferenceException e)
                    {
                    }
                    Inputs.Remove(inPut);
                    Vector2 topLeft = rect.position;
                    rect = new Rect(topLeft.x, topLeft.y, 200, 100);
                    DrawConnectors();
                    return;
                }
                GUILayout.EndHorizontal();
                target.delay = EditorGUILayout.FloatField("발동 딜레이(초)", target.delay);

                GUILayout.BeginHorizontal();
                EventMaker eventMaker = (EventMaker)target;
                eventMaker.eventFlag = EditorGUILayout.TextField("이벤트명", eventMaker.eventFlag);
                GUILayout.EndHorizontal();
            }
            GUILayout.Space(10);
        }
    }