private IEnumerator ExecuteScenario() { Debug.Log("[EventSystem] Started execution of " + gameObject.name); _time = 0f; var totalDuration = _actions.Any () ? _actions.Max (action => action.EndTime) : 0f; var isPlaying = true; while (isPlaying) { for (var i = 0; i < _actions.Count; i++) { var action = _actions.ElementAt(i); if (_time >= action.StartTime && _time < action.EndTime) { if (action.NowPlaying) action.ActionUpdate(ref _time); // // , "" else action.ActionStart(_time); } else if (_time >= action.EndTime) { if (!action.NowPlaying) continue; action.Stop(); } } if(_time >= totalDuration) isPlaying = false; _time += Time.deltaTime; yield return null; } foreach (var eventAction in _actions.Where(eventAction => eventAction.NowPlaying)) eventAction.Stop(); // - _coroutine = null; if(_callback != null) // - _callback(); Debug.Log("[EventSystem] Finished executing " + gameObject.name); _canPlay = !PlayOnce; }
using System; using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif namespace Visc { public abstract class EventAction : ScriptableObject { // [SerializeField] protected string _description; [SerializeField] protected GameObject _actor; [SerializeField] protected float _startTime; [SerializeField] protected float _duration = 1f; public GameObject Actor { get { return _actor; } } public string Description { get { return _description; } } public float StartTime { get { return _startTime; } set { _startTime = value >= 0f ? value : 0f; } } public float Duration { get { return _duration; } set { _duration = value >= 0.1f ? value : 0.1f; } } public float EndTime { get { return _startTime + _duration; } } public bool NowPlaying { get; protected set; } public void ActionStart(float starTime) { Debug.Log("[EventSystem] Started event " + _description); NowPlaying = true; OnStart(starTime); } public void ActionUpdate(ref float timeSinceActionStart) { OnUpdate(ref timeSinceActionStart); } public void Stop() { Debug.Log("[EventSystem] Finished event " + _description); NowPlaying = false; OnStop(); } // // protected virtual void OnEditorGui() { } protected virtual void OnStart(float startTime) { } protected virtual void OnUpdate(ref float currentTime) { } protected virtual void OnStop() { } } }
private void OnGUI() { if (CurrentScenario != null) { // - GUILayout.BeginHorizontal(); if(Application.isPlaying) if(GUILayout.Button("PLAY")) _currentScenario.Execute(); GUILayout.BeginHorizontal(); // CurrentScenario.VisibleScale = EditorGUILayout.Slider("Scale", CurrentScenario.VisibleScale, 0.1f, 100f); CurrentScenario.MaximumDuration = EditorGUILayout.FloatField("Max duration (seconds)", CurrentScenario.MaximumDuration); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); CurrentScenario.MaximumTracks = EditorGUILayout.IntField("Max tracks", CurrentScenario.MaximumTracks); BoxHeight = EditorGUILayout.IntSlider("Track height", BoxHeight, 20, 50); if (_draggedAction == null) { var newVisibleDuration = CurrentScenario.MaximumDuration/CurrentScenario.VisibleScale; var newScale = newVisibleDuration*CurrentScenario.VisibleScale/_visibleDuration; _visibleDuration = newVisibleDuration; CurrentScenario.VisibleScale = newScale; } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); CurrentScenario.PlayOnce = EditorGUILayout.Toggle("Play once", CurrentScenario.PlayOnce); GUILayout.EndHorizontal(); if (GUILayout.Button("Save")) EditorSceneManager.MarkAllScenesDirty(); GUILayout.EndHorizontal(); } else { _eventActionTypes = null; GUILayout.Label("Select scenario"); } {
// if(action.EditingTrack < _trackOffset || action.EditingTrack >= _trackOffset + maxVisibleTracks) continue; var horizontalPosStart = position.width * (action.StartTime / duration) - hOffset; var horizontalPosEnd = position.width * (action.EndTime / duration) - hOffset; var width = horizontalPosEnd - horizontalPosStart; // var boxRect = new Rect (horizontalPosStart + HandleWidth, offset + BoxHeight * (action.EditingTrack - _trackOffset), width - HandleWidth * 2, BoxHeight); EditorGUIUtility.AddCursorRect (boxRect, MouseCursor.Pan); // , "" var boxStartHandleRect = new Rect (horizontalPosStart, offset + BoxHeight * (action.EditingTrack - _trackOffset), HandleWidth, BoxHeight); EditorGUIUtility.AddCursorRect (boxStartHandleRect, MouseCursor.ResizeHorizontal); GUI.Box (boxStartHandleRect, "<"); // var boxEndHandleRect = new Rect (horizontalPosEnd - HandleWidth, offset + BoxHeight * (action.EditingTrack - _trackOffset), HandleWidth, BoxHeight); EditorGUIUtility.AddCursorRect (boxEndHandleRect, MouseCursor.ResizeHorizontal); GUI.Box (boxEndHandleRect, ">"); // , , , action.DrawTimelineGui (boxRect);
#if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; namespace Platformer { public class CameraTargetControl : EventAction { [SerializeField] private bool _turnOffTargetingAtStart; [SerializeField] private bool _turnOnTargetingAtEnd; [SerializeField] private bool _targetActorInstedOfPlayerAtStart; [SerializeField] private bool _targetPlayerInTheEnd; protected override void OnStart(float startTime) { if(_turnOffTargetingAtStart) GameManager.CameraController.SetTarget(null); else if (_targetActorInstedOfPlayerAtStart) GameManager.CameraController.SetTarget(_actor.transform); } protected override void OnStop() { if(_turnOnTargetingAtEnd || _targetPlayerInTheEnd) GameManager.CameraController.SetTarget(GameManager.PlayerController.transform); } #if UNITY_EDITOR protected override void OnEditorGui() { _turnOffTargetingAtStart = EditorGUILayout.Toggle("Camera targeting off", _turnOffTargetingAtStart); if (_turnOffTargetingAtStart) _turnOnTargetingAtEnd = EditorGUILayout.Toggle("Targeting on in the end", _turnOnTargetingAtEnd); else { _turnOnTargetingAtEnd = false; _targetActorInstedOfPlayerAtStart = EditorGUILayout.Toggle("Target actor", _targetActorInstedOfPlayerAtStart); if (_targetActorInstedOfPlayerAtStart) _targetPlayerInTheEnd = EditorGUILayout.Toggle("Target player in the end", _targetPlayerInTheEnd); } } #endif } }
Source: https://habr.com/ru/post/281571/
All Articles