#if UNITY_EDITOR using UnityEditor; using UnityEditor.SceneManagement; #endif using UnityEngine; using UnityEngine.EventSystems; namespace AllIn13DShader { public class AllIn13dShaderDemoController : MonoBehaviour { public DemoExpositor CurrentExpositor { get { return demoExpositors[currentExpositorIndex]; } } public DemoElement CurrentDemoElement { get { return CurrentExpositor.CurrentDemoElement; } } public DemoSceneConfiguration demoSceneConfig; public DemoUI demoUI; public Transform initPosition; [SerializeField] private SkyController skyController; [SerializeField] private AllIn1MainLightController mainLightController; [SerializeField] private DemoExpositor[] demoExpositors; [SerializeField] private GameObject expositorNameGo; [SerializeField] private DemoCameraController cameraController; [SerializeField] private GameObject environmentsParentGo; //private DemoElement currentDemoElement; private DemoElement previousDemoElement; [Space, Header("Start Index")] [SerializeField] private int startExpositorIndex; [SerializeField] private int startDemoIndex; [Space, Header("Event Systems")] [SerializeField] private EventSystem oldInputEventSystem; [SerializeField] private EventSystem newInputEventSystem; [Space, Header("Input Handlers")] [SerializeField] private InputHandler showDemoInfoHandler; [Space, Header("Scale Tweens")] [SerializeField] private AllIn1DemoScaleTween demoLabelScaleTween; [SerializeField] private AllIn1DemoScaleTween expositorLabelScaleTween; [SerializeField] private AllIn1DemoScaleTween infoPanelScaleTween; private int currentExpositorIndex; private Vector3 targetCameraPosition; private EnvironmentController currentEnvironmentController; private bool moveCurrentEnvironment; private void Start() { for(int i = 0; i < demoExpositors.Length; i++) { demoExpositors[i].Init(demoSceneConfig); } int childCount = environmentsParentGo.transform.childCount; for(int i = childCount - 1; i >= 0; i--) Destroy(environmentsParentGo.transform.GetChild(i).gameObject); EnableCorrectInputSystem(); demoExpositors[startExpositorIndex].SetDemoExpositor(startDemoIndex); demoUI.Refresh(CurrentExpositor); previousDemoElement = null; skyController.Init(); cameraController.Init(demoSceneConfig); DemoChanged(); CurrentDemoElement.Show(); expositorNameGo.SetActive(demoExpositors.Length > 1); } public void NavigateToNextExpositor() { previousDemoElement = CurrentDemoElement; Vector3 nextDemoPos = previousDemoElement.transform.position + cameraController.cam.transform.up * demoSceneConfig.distanceBetweenDemos; CurrentDemoElement.Hide(); ChangeExpositor(1); moveCurrentEnvironment = false; CurrentDemoElement.transform.position = nextDemoPos; CurrentDemoElement.Show(); expositorLabelScaleTween.ScaleDownTween(); infoPanelScaleTween.ScaleUpTween(); DemoChanged(); } public void NavigateToPreviousExpositor() { previousDemoElement = CurrentDemoElement; Vector3 nextDemoPos = previousDemoElement.transform.position - cameraController.cam.transform.up * demoSceneConfig.distanceBetweenDemos; CurrentDemoElement.Hide(); ChangeExpositor(-1); moveCurrentEnvironment = false; CurrentDemoElement.transform.position = nextDemoPos; CurrentDemoElement.Show(); expositorLabelScaleTween.ScaleDownTween(); infoPanelScaleTween.ScaleUpTween(); DemoChanged(); } public void NavigateToPreviousDemo() { previousDemoElement = CurrentDemoElement; DemoElement nextDemoElement = demoExpositors[currentExpositorIndex].GetPreviousDemoElement(); Vector3 nextDemoPos = GetNextDemoPos(previousDemoElement, nextDemoElement, -cameraController.cam.transform.right); moveCurrentEnvironment = previousDemoElement.demoElementData.environment == nextDemoElement.demoElementData.environment; demoExpositors[currentExpositorIndex].PreviousDemoElement(nextDemoPos); demoLabelScaleTween.ScaleDownTween(); infoPanelScaleTween.ScaleUpTween(); DemoChanged(); } public void NavigateToNextDemo() { previousDemoElement = CurrentDemoElement; DemoElement nextDemoElement = demoExpositors[currentExpositorIndex].GetNextDemoElement(); Vector3 nextDemoPos = GetNextDemoPos(previousDemoElement, nextDemoElement, cameraController.cam.transform.right); moveCurrentEnvironment = previousDemoElement.demoElementData.environment == nextDemoElement.demoElementData.environment; demoExpositors[currentExpositorIndex].NextDemoElement(nextDemoPos); demoLabelScaleTween.ScaleDownTween(); infoPanelScaleTween.ScaleUpTween(); DemoChanged(); } private void LateUpdate() { if (moveCurrentEnvironment && currentEnvironmentController != null) { currentEnvironmentController.transform.position += cameraController.GetDeltaMovement(); } } private void DemoChanged() { demoUI.Refresh(CurrentExpositor); mainLightController.DemoChanged(CurrentDemoElement.demoElementData); skyController.DemoChanged(CurrentDemoElement.demoElementData); cameraController.DemoChanged(CurrentDemoElement); CheckCurrentEnvironment(); } private Vector3 GetNextDemoPos(DemoElement previousDemo, DemoElement nextDemo, Vector3 dir) { //Vector3 res = previousDemo.transform.position; //if(previousDemo.demoElementData.environment != nextDemo.demoElementData.environment) //{ // res += dir * demoSceneConfig.distanceBetweenDemos; //} Vector3 res = previousDemo.transform.position + dir * demoSceneConfig.distanceBetweenDemos; return res; } private void CheckCurrentEnvironment() { DemoEnvironment currentEnvironment = CurrentDemoElement.demoElementData.environment; DemoEnvironment previousEnvironment = previousDemoElement?.demoElementData.environment; if(currentEnvironment != previousEnvironment) { if (currentEnvironmentController != null) { currentEnvironmentController.Hide(); } if(currentEnvironment != null) { ChangeEnvironment(currentEnvironment); } moveCurrentEnvironment = false; } else { moveCurrentEnvironment = true; } } private void ChangeEnvironment(DemoEnvironment environment) { GameObject newEnvironmentGo = Instantiate(environment.prefab); newEnvironmentGo.transform.parent = environmentsParentGo.transform; newEnvironmentGo.transform.position = CurrentDemoElement.transform.position; newEnvironmentGo.transform.rotation = Quaternion.identity; newEnvironmentGo.transform.localScale = Vector3.zero; currentEnvironmentController = newEnvironmentGo.GetComponent(); currentEnvironmentController.Init(demoSceneConfig); currentEnvironmentController.Show(CurrentDemoElement); } #if UNITY_EDITOR [ContextMenu("Setup Demo Scene")] public void Setup() { RemoveOldElements(); for(int i = 0; i < demoSceneConfig.expositors.Length; i++) { DemoExpositorData expositorData = demoSceneConfig.expositors[i]; GameObject goExpositor = new GameObject($"Expositor {i + 1}"); goExpositor.transform.parent = transform; goExpositor.transform.localPosition = new Vector3(0f, i * -25f, 0f); goExpositor.transform.localRotation = Quaternion.identity; DemoExpositor expositor = goExpositor.AddComponent(); expositor.Setup(expositorData, demoSceneConfig); ArrayUtility.Add(ref demoExpositors, expositor); } currentExpositorIndex = 0; EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); } private void RemoveOldElements() { DemoExpositor[] expositorsToDestroy = transform.GetComponentsInChildren(); for(int i = 0; i < expositorsToDestroy.Length; i++) { DestroyImmediate(expositorsToDestroy[i].gameObject); } ArrayUtility.Clear(ref demoExpositors); } #endif private void ChangeExpositor(int changeAmount) { currentExpositorIndex += changeAmount; if(currentExpositorIndex >= demoExpositors.Length) currentExpositorIndex = 0; if(currentExpositorIndex < 0) currentExpositorIndex = demoExpositors.Length - 1; } public int GetCurrentExpositorIndex() => currentExpositorIndex; private void EnableCorrectInputSystem() { bool newInputSystemEnabled = false; #if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER newInputSystemEnabled = true; #endif oldInputEventSystem.gameObject.SetActive(!newInputSystemEnabled); newInputEventSystem.gameObject.SetActive(newInputSystemEnabled); } } }