Untitled

 avatar
unknown
csharp
2 months ago
10 kB
12
Indexable
using UnityEngine;
using System.Collections.Generic;
using TransitionsPlus;

#if UNITY_EDITOR
using UnityEditor;
#endif

namespace AC
{
    public enum TransitionBackgroundType
    {
        Color,
        Texture
    }

    [System.Serializable]
    public class ActionSceneSwitchTransition : Action
    {
        public ChooseSceneBy chooseSceneBy = ChooseSceneBy.Number;
        public int sceneNumber;
        public int sceneNumberParameterID = -1;
        public string sceneName;
        public int sceneNameParameterID = -1;
        public bool assignScreenOverlay;
        public bool onlyPreload = false;

        // TransitionPlus parameters
        public bool useTransitionPlus = false;
        public TransitionType transitionType = TransitionType.Fade;
        public float transitionDuration = 2f;
        public TransitionBackgroundType transitionBackgroundType = TransitionBackgroundType.Color;
        public Color transitionColor = Color.black;
        public Texture2D transitionTexture;
        public float noiseIntensity = 0.5f;
        public float contrast = 1f;
        public float rotation = 0f;
        
        public bool relativePosition = false;
        public Marker relativeMarker;
        protected Marker runtimeRelativeMarker;
        public int relativeMarkerID;
        public int relativeMarkerParameterID = -1;
        public bool forceReload = false;

        public override ActionCategory Category { get { return ActionCategory.Scene; }}
        public override string Title { get { return "Scene Switch Transition"; }}
        public override string Description { get { return "Moves the Player to a new scene with transition effects using TransitionPlus."; }}
        public override int NumSockets { get { return (onlyPreload || isAssetFile) ? 1 : 0; }}

        public override void AssignValues(List<ActionParameter> parameters)
        {
            sceneNumber = AssignInteger(parameters, sceneNumberParameterID, sceneNumber);
            sceneName = AssignString(parameters, sceneNameParameterID, sceneName);
            runtimeRelativeMarker = AssignFile<Marker>(parameters, relativeMarkerParameterID, relativeMarkerID, relativeMarker);
        }

        public override float Run()
        {
            string runtimeSceneName = "";
            
            switch (KickStarter.settingsManager.referenceScenesInSave)
            {
                case ChooseSceneBy.Name:
                    runtimeSceneName = (chooseSceneBy == ChooseSceneBy.Name) ? sceneName : KickStarter.sceneChanger.IndexToName(sceneNumber);
                    break;

                case ChooseSceneBy.Number:
                default:
                    int runtimeSceneIndex = (chooseSceneBy == ChooseSceneBy.Name) ? KickStarter.sceneChanger.NameToIndex(sceneName) : sceneNumber;
                    if (runtimeSceneIndex >= 0)
                    {
                        runtimeSceneName = KickStarter.sceneChanger.IndexToName(runtimeSceneIndex);
                    }
                    break;
            }

            if (string.IsNullOrEmpty(runtimeSceneName))
            {
                LogWarning("Scene name is empty or invalid");
                return 0f;
            }

            if (onlyPreload)
            {
                if (KickStarter.settingsManager.useAsyncLoading)
                {
                    KickStarter.sceneChanger.PreloadScene(runtimeSceneName);
                }
                return 0f;
            }

            if (useTransitionPlus)
            {
                if (relativePosition && runtimeRelativeMarker != null)
                {
                    KickStarter.sceneChanger.SetRelativePosition(runtimeRelativeMarker);
                }

                // Start transition
                if (transitionBackgroundType == TransitionBackgroundType.Color)
                {
                    TransitionAnimator.Start(
                        transitionType,
                        duration: transitionDuration,
                        color: transitionColor,
                        noiseIntensity: noiseIntensity,
                        contrast: contrast,
                        rotation: rotation,
                        sceneNameToLoad: runtimeSceneName,
                        autoDestroy: true,
                        destroyDelay: 0.1f
                    );
                }
                else if (transitionTexture != null)
                {
                    TransitionAnimator.Start(
                        transitionType,
                        duration: transitionDuration,
                        texture: transitionTexture,
                        noiseIntensity: noiseIntensity,
                        contrast: contrast,
                        rotation: rotation,
                        sceneNameToLoad: runtimeSceneName,
                        autoDestroy: true,
                        destroyDelay: 0.1f
                    );
                }
                
                return transitionDuration;
            }
            else
            {
                if (relativePosition && runtimeRelativeMarker != null)
                {
                    KickStarter.sceneChanger.SetRelativePosition(runtimeRelativeMarker);
                }

                KickStarter.sceneChanger.ChangeScene(runtimeSceneName, true, forceReload, assignScreenOverlay);
                return 0f;
            }
        }

        #if UNITY_EDITOR

        public override void ShowGUI(List<ActionParameter> parameters)
        {
            EditorGUILayout.BeginVertical();
            
            chooseSceneBy = (ChooseSceneBy)EditorGUILayout.EnumPopup("Choose scene by:", chooseSceneBy);
            if (chooseSceneBy == ChooseSceneBy.Name)
            {
                TextField("Scene name:", ref sceneName, parameters, ref sceneNameParameterID);
            }
            else
            {
                IntField("Scene number:", ref sceneNumber, parameters, ref sceneNumberParameterID);
            }

            EditorGUILayout.Space();
            onlyPreload = EditorGUILayout.ToggleLeft("Don't change scene, just preload data?", onlyPreload);

            if (!onlyPreload)
            {
                EditorGUILayout.Space(10);
                EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                
                useTransitionPlus = EditorGUILayout.ToggleLeft("Use TransitionPlus effects?", useTransitionPlus);
                EditorGUILayout.Space(5);

                EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                forceReload = EditorGUILayout.ToggleLeft("Reload even if scene is already open?", forceReload);
                assignScreenOverlay = EditorGUILayout.ToggleLeft("Overlay current screen during switch?", assignScreenOverlay);
                EditorGUILayout.EndVertical();

                if (useTransitionPlus)
                {
                    EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                    EditorGUILayout.LabelField("TransitionPlus Settings", EditorStyles.boldLabel);
                    EditorGUI.indentLevel++;
                    
                    transitionType = (TransitionType)EditorGUILayout.EnumPopup("Transition type:", transitionType);
                    EditorGUILayout.Space(2);
                    transitionDuration = EditorGUILayout.FloatField("Duration (seconds):", transitionDuration);
                    EditorGUILayout.Space(2);

                    transitionBackgroundType = (TransitionBackgroundType)EditorGUILayout.EnumPopup("Background type:", transitionBackgroundType);
                    EditorGUILayout.Space(2);

                    if (transitionBackgroundType == TransitionBackgroundType.Color)
                    {
                        transitionColor = EditorGUILayout.ColorField("Transition color:", transitionColor);
                    }
                    else
                    {
                        transitionTexture = (Texture2D)EditorGUILayout.ObjectField("Transition texture:", transitionTexture, typeof(Texture2D), false);
                    }

                    EditorGUILayout.Space(2);
                    noiseIntensity = EditorGUILayout.Slider("Noise intensity:", noiseIntensity, 0f, 1f);
                    EditorGUILayout.Space(2);
                    contrast = EditorGUILayout.FloatField("Contrast:", contrast);
                    EditorGUILayout.Space(2);
                    rotation = EditorGUILayout.FloatField("Rotation:", rotation);
                    
                    EditorGUI.indentLevel--;
                    EditorGUILayout.EndVertical();
                }

                EditorGUILayout.EndVertical();
                EditorGUILayout.Space(10);

                EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                relativePosition = EditorGUILayout.ToggleLeft("Position Player relative to Marker?", relativePosition);
                if (relativePosition)
                {
                    EditorGUI.indentLevel++;
                    ComponentField("Relative Marker:", ref relativeMarker, ref relativeMarkerID, parameters, ref relativeMarkerParameterID);
                    EditorGUI.indentLevel--;
                }
                EditorGUILayout.EndVertical();
            }

            EditorGUILayout.EndVertical();
        }

        public override void AssignConstantIDs(bool saveScriptsToo, bool fromAssetFile)
        {
            relativeMarkerID = AssignConstantID(relativeMarker, relativeMarkerID, relativeMarkerParameterID);
        }

        public override string SetLabel()
        {
            if (chooseSceneBy == ChooseSceneBy.Name)
            {
                return sceneName;
            }
            return sceneNumber.ToString();
        }

        #endif
    }
}
Editor is loading...
Leave a Comment