我们创建了 Fontainebleau 演示来说明摄影photogrammetry流程和 LayeredLit 着色器的使用。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

431 行
14 KiB

using System;
using System.Collections;
using UnityEngine.Audio;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.Events;
public class VideoManager : MonoBehaviour
{
[Serializable]
public enum VideoMode
{
Menu = 0,
FlyBy = 1,
FreeCamera = 2,
ThirdPerson = 3
}
[Header("Gameplay")]
public VideoMode DefaultVideoMode;
public VideoMode DefaultPS4VideoMode;
public GameObject FreeCamRoot;
public GameObject ThirdPersonRoot;
public GameObject timelineCameras;
[Header("Lighting")]
public int DefaultLightingScenario;
public string[] LightingMaps;
public GameObject[] exposureRoots;
public GameObject[] lightingRoots;
//public PlayableDirector lanternTimeline;
public UnityEvent lanternStart;
public UnityEvent lanternStop;
private bool toggleLantern = false;
[Header("Audio")]
public AudioMixer DemoMixer;
public string[] AudioMaps;
public RandomCueManager RamdomCueManager;
public AudioMixerSnapshot[] AmbienceSnapshots;
public AudioMixerSnapshot SilentSnapshot;
public AudioMixerSnapshot FlyBySnapshot;
public MusicSwitcher MusicSwitcher;
[Header("UI/Menu")]
public GameObject UIMenuRoot;
public GameObject UIFlyByRoot;
public GameObject UIFlybyMenu;
public Button UIFirstMenuButton;
public Button UIFirstMenuButtonFlyby;
public Button lanternButton;
[Header("FadeIn/Out")]
public Image UIFadeImage;
public Canvas DemoCanvas;
public Vector2 EnterMenuInOutDuration = new Vector2(0.0f, 1.0f);
public Vector2 LightingChangeInOutDuration = new Vector2(0.5f, 2.0f);
public Vector2 GameplayChangeInOutDuration = new Vector2(0.5f, 1.0f);
public VideoMode currentVideoMode { get { return m_CurrentVideoMode; } }
private VideoMode m_CurrentVideoMode;
private int m_CurrentAmbience = -1;
private Coroutine m_FadeCoroutine;
private Coroutine m_laternCoroutine;
private bool[] currentLoad;
private bool enableInput = true;
void Start()
{
DemoCanvas.gameObject.SetActive(true);
UIFadeImage.color = Color.black;
UIFadeImage.gameObject.SetActive(false);
m_CurrentAmbience = DefaultLightingScenario;
m_CurrentVideoMode = DefaultVideoMode;
#if UNITY_EDITOR
// Unload work Maps
foreach (string s in LightingMaps)
{
if(SceneManager.GetSceneByName(s).isLoaded)
SceneManager.UnloadSceneAsync(s);
}
foreach(string s in AudioMaps)
{
if(SceneManager.GetSceneByName(s).isLoaded)
SceneManager.UnloadSceneAsync(s);
}
#endif
SceneManager.LoadScene(LightingMaps[m_CurrentAmbience], LoadSceneMode.Additive);
SceneManager.LoadScene(AudioMaps[m_CurrentAmbience], LoadSceneMode.Additive);
LevelLightmapDataManager.handler.SetLightingScenario(DefaultLightingScenario);
SwitchLightingAssets(DefaultLightingScenario);
AmbienceSnapshots[m_CurrentAmbience].TransitionTo(3.0f);
#if UNITY_PS4
m_CurrentVideoMode = DefaultPS4VideoMode;
#endif
m_FadeCoroutine = StartCoroutine(GameplayFadeTransition(EnterMenuInOutDuration.x, EnterMenuInOutDuration.y, UpdateDemoMode));
}
void Update()
{
UpdateCursorLock();
if (currentVideoMode!= 0 && Input.GetButtonDown("Cancel") && enableInput)
{
SwitchDemoMode(VideoMode.Menu);
}
if(currentVideoMode != 0 && !UIFlybyMenu.activeInHierarchy && Input.GetButtonDown("Options") && enableInput)
{
UIFlybyMenu.SetActive(true);
}
if(Input.GetKeyDown(KeyCode.Keypad0) && enableInput)
{
SwitchLighting(0);
}
if (Input.GetKeyDown(KeyCode.Keypad1) && enableInput)
{
SwitchLighting(1);
}
if (Input.GetKeyDown(KeyCode.Keypad2) && enableInput)
{
SwitchLighting(2);
}
if (Input.GetKeyDown(KeyCode.Keypad3) && enableInput)
{
ToggleLanterns();
}
}
public void UpdateCursorLock()
{
bool needCursor = (currentVideoMode == VideoMode.Menu || UIFlybyMenu.activeInHierarchy);
if (!needCursor)
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
else
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
}
#region LIGHTING
public void SwitchLighting(int index)
{
if (index != m_CurrentAmbience && m_FadeCoroutine == null)
{
enableInput = false;
StopCoroutine("LightingFadeTransition");
m_FadeCoroutine = StartCoroutine(LightingFadeTransition(LightingChangeInOutDuration.x, LightingChangeInOutDuration.y, index));
}
}
public void SwitchLightingAssets(int index)
{
for (int i = 0; i < exposureRoots.Length; i++)
{
exposureRoots[i].SetActive(i == index ? true : false);
}
for (int i = 0; i < lightingRoots.Length; i++)
{
lightingRoots[i].SetActive(i == index ? true : false);
}
//Hardcoded disable lantern button for non night scenarios
lanternButton.interactable = index == 1 ? true : false ;
}
IEnumerator LightingFadeTransition(float outDuration, float inDuration, int newLighting)
{
SilentSnapshot.TransitionTo(outDuration *2);
MusicSwitcher.CurrentAmbience = newLighting;
// Fade Out
UIFadeImage.gameObject.SetActive(true);
while (UIFadeImage.color.a < 1.0f)
{
float a = Mathf.Min(1.0f, UIFadeImage.color.a + (Time.deltaTime / Mathf.Max(0.0001f, outDuration)));
UIFadeImage.color = new Color(0, 0, 0, a);
yield return new WaitForEndOfFrame();
}
// Unload
string lightingSceneToUnload = null;
string audioSceneToUnLoad = null;
if (m_CurrentAmbience >= 0)
{
lightingSceneToUnload = LightingMaps[m_CurrentAmbience];
audioSceneToUnLoad = AudioMaps[m_CurrentAmbience];
}
m_CurrentAmbience = newLighting;
string lightingSceneToLoad = LightingMaps[m_CurrentAmbience];
string audioSceneToLoad = AudioMaps[m_CurrentAmbience];
currentLoad = new bool[2] {false,false} ;
while(!currentLoad[0])
{
yield return UnloadSceneCoroutine(lightingSceneToUnload, lightingSceneToLoad,0);
}
while(!currentLoad[1])
{
yield return UnloadSceneCoroutine(audioSceneToUnLoad, audioSceneToLoad,1);
}
LevelLightmapDataManager.handler.SetLightingScenario(newLighting);
// Then Fade In again
if (currentVideoMode == VideoMode.FlyBy)
FlyBySnapshot.TransitionTo(inDuration * 2);
else
AmbienceSnapshots[m_CurrentAmbience].TransitionTo(inDuration * 2);
SwitchLightingAssets(newLighting);
while (UIFadeImage.color.a > 0.0f)
{
float a = Mathf.Max(0.0f,UIFadeImage.color.a - (Time.deltaTime / Mathf.Max(0.0001f,inDuration)));
UIFadeImage.color = new Color(0, 0, 0, a);
yield return new WaitForEndOfFrame();
}
UIFadeImage.gameObject.SetActive(false);
m_FadeCoroutine = null;
enableInput = true;
}
IEnumerator UnloadSceneCoroutine(string sceneToUnload, string sceneToLoad, int loadStateIndex)
{
AsyncOperation unloadop = null;
if(sceneToUnload != null)
unloadop = SceneManager.UnloadSceneAsync(sceneToUnload);
AsyncOperation loadop = SceneManager.LoadSceneAsync(sceneToLoad, LoadSceneMode.Additive);
while((!unloadop.isDone || unloadop == null) && !loadop.isDone)
{
yield return new WaitForEndOfFrame();
}
currentLoad[loadStateIndex] = true;
}
public void ToggleLanterns()
{
if (m_laternCoroutine == null)
{
var buttonColors = new ColorBlock();
buttonColors = lanternButton.colors;
buttonColors.normalColor = toggleLantern ? new Color(0.663f, 0.663f, 0.663f) : new Color(1, 0.702f, 0.384f);
buttonColors.highlightedColor = toggleLantern ? new Color(1, 1, 1) : new Color(1, 0.878f, 0.686f);
lanternButton.colors = buttonColors;
if (!toggleLantern)
{
lanternStart.Invoke();
m_laternCoroutine = StartCoroutine(LightingFadeLanterns(toggleLantern));
}
else if (toggleLantern)
{
lanternStop.Invoke();
m_laternCoroutine = StartCoroutine(LightingFadeLanterns(toggleLantern));
}
toggleLantern = !toggleLantern;
}
}
IEnumerator LightingFadeLanterns(bool reversed)
{
float start = 0.0f;
float end = 1.5f;
for(var time = start; time < end; time += Time.deltaTime)
{
//lanternTimeline.time = reversed ? end - time : time;
//lanternTimeline.Evaluate();
yield return new WaitForEndOfFrame();
}
//lanternTimeline.time = reversed ? start : end;
//lanternTimeline.Evaluate();
m_laternCoroutine = null;
}
void toggleTimelineLightingEntities(bool active)
{
exposureRoots[0].transform.parent.gameObject.SetActive(active);
lightingRoots[0].transform.parent.gameObject.SetActive(active);
}
#endregion
#region GAMEPLAY
public void SwitchDemoMode(int mode)
{
SwitchDemoMode((VideoMode)mode);
}
public void SwitchDemoMode(VideoMode mode)
{
if (m_CurrentVideoMode == mode)
return;
m_CurrentVideoMode = mode;
StopAllCoroutines();
// Audio Mix
if (currentVideoMode == VideoMode.FlyBy)
FlyBySnapshot.TransitionTo(GameplayChangeInOutDuration.x + GameplayChangeInOutDuration.y);
else
AmbienceSnapshots[m_CurrentAmbience].TransitionTo(GameplayChangeInOutDuration.x + GameplayChangeInOutDuration.y);
m_FadeCoroutine = StartCoroutine(GameplayFadeTransition(GameplayChangeInOutDuration.x, GameplayChangeInOutDuration.y, UpdateDemoMode));
}
public void ExitDemo()
{
Application.Quit();
}
private void UpdateDemoMode()
{
EventSystem eventSystem = FindObjectOfType<EventSystem>();
switch (m_CurrentVideoMode)
{
case VideoMode.Menu:
toggleTimelineLightingEntities(true);
timelineCameras.SetActive(true);
UIMenuRoot.SetActive(true);
UIFlyByRoot.SetActive(false);
FreeCamRoot.SetActive(false);
ThirdPersonRoot.SetActive(false);
UIFlybyMenu.SetActive(false);
DemoCanvas.gameObject.SetActive(false);
DemoCanvas.gameObject.SetActive(true);
eventSystem.SetSelectedGameObject( UIFirstMenuButton.gameObject);
RamdomCueManager.m_ListenerObject = RamdomCueManager.gameObject;
break;
case VideoMode.FlyBy:
toggleTimelineLightingEntities(true);
timelineCameras.SetActive(true);
UIMenuRoot.SetActive(false);
UIFlyByRoot.SetActive(true);
FreeCamRoot.SetActive(false);
ThirdPersonRoot.SetActive(false);
UIFlybyMenu.SetActive(true);
//UIFirstMenuButtonFlyby.Select();
DemoCanvas.gameObject.SetActive(false);
DemoCanvas.gameObject.SetActive(true);
eventSystem.SetSelectedGameObject(UIFirstMenuButtonFlyby.gameObject);
RamdomCueManager.m_ListenerObject = RamdomCueManager.gameObject;
break;
case VideoMode.FreeCamera:
toggleTimelineLightingEntities(false);
timelineCameras.SetActive(false);
UIMenuRoot.SetActive(false);
UIFlyByRoot.SetActive(false);
FreeCamRoot.SetActive(true);
ThirdPersonRoot.SetActive(false);
UIFlybyMenu.SetActive(false);
RamdomCueManager.m_ListenerObject = FreeCamRoot.GetComponentInChildren<Camera>().gameObject;
break;
case VideoMode.ThirdPerson:
toggleTimelineLightingEntities(false);
timelineCameras.SetActive(false);
UIMenuRoot.SetActive(false);
UIFlyByRoot.SetActive(false);
FreeCamRoot.SetActive(false);
ThirdPersonRoot.SetActive(true);
UIFlybyMenu.SetActive(false);
RamdomCueManager.m_ListenerObject = ThirdPersonRoot.GetComponentInChildren<Camera>().gameObject;
break;
}
}
#endregion
IEnumerator GameplayFadeTransition(float outDuration, float inDuration, Action action)
{
// Fade Out
UIFadeImage.gameObject.SetActive(true);
while(UIFadeImage.color.a < 1.0f)
{
float a = Mathf.Min(1.0f,UIFadeImage.color.a + (Time.deltaTime / Mathf.Max(0.0001f,outDuration)));
UIFadeImage.color = new Color(0, 0, 0, a);
yield return new WaitForEndOfFrame();
}
// Call Action...
action.Invoke();
// Then Fade In again
while(UIFadeImage.color.a > 0.0f)
{
float a = Mathf.Max(0.0f,UIFadeImage.color.a - (Time.deltaTime / Mathf.Max(0.0001f,inDuration)));
UIFadeImage.color = new Color(0, 0, 0, a);
yield return new WaitForEndOfFrame();
}
UIFadeImage.gameObject.SetActive(false);
m_FadeCoroutine = null;
}
}