Unity游戏开发:场景切换的实现
在unity中可以將不同場(chǎng)景的背景和道具放置在不同的Scene當(dāng)中,通過(guò)對(duì)Scene的加載和卸載來(lái)實(shí)現(xiàn)場(chǎng)景之間的切換。同時(shí)創(chuàng)建一個(gè)基礎(chǔ)場(chǎng)景(Control Scene)來(lái)對(duì)整個(gè)游戲系統(tǒng)進(jìn)行管理,在基礎(chǔ)場(chǎng)景(Control Scene)中不放置背景圖片或者游戲道具而只添加各種控制單元和Canvas。
一、實(shí)現(xiàn)邏輯
在場(chǎng)景切換的實(shí)現(xiàn)過(guò)程中需要定義兩個(gè)腳本,一個(gè)放在基礎(chǔ)場(chǎng)景中作為控制管理單元,另一個(gè)添加到每一個(gè)場(chǎng)景中作為執(zhí)行單元。
在每個(gè)場(chǎng)景中為場(chǎng)景切換的觸發(fā)點(diǎn)單獨(dú)添加一個(gè)空物體,為了能夠檢測(cè)到鼠標(biāo)的點(diǎn)擊為其添加一個(gè)Collider并設(shè)置為T(mén)rigger。此外在Teleport腳本中也定義了當(dāng)前所在的場(chǎng)景和需要切換到的場(chǎng)景。每當(dāng)鼠標(biāo)點(diǎn)擊場(chǎng)景切換的觸發(fā)點(diǎn)時(shí),Teleport向Transition Manager發(fā)出請(qǐng)求并調(diào)用Transition函數(shù)來(lái)實(shí)現(xiàn)場(chǎng)景切換。
二、代碼實(shí)現(xiàn)
2.1 Transition Manager
狀態(tài)參數(shù)的定義
[SceneName] public string startScene;public bool isFading;//是否在進(jìn)行場(chǎng)景切換public CanvasGroup canvasGroup;//用來(lái)在切換場(chǎng)景時(shí)禁用鼠標(biāo)點(diǎn)擊功能public float fadeDuration;//漸變持續(xù)時(shí)間public bool canTransition;//是否可以切換場(chǎng)景場(chǎng)景切換的實(shí)現(xiàn)
/// <summary>/// 場(chǎng)景切換API/// </summary>/// <param name="from"></param>/// <param name="to"></param>public void Transition(string from,string to){if (!isFading&&canTransition)//不在場(chǎng)景切換漸變并且可以切換StartCoroutine(TransitionToScene(from, to));}/// <summary>/// 場(chǎng)景切換/// </summary>/// <param name="from"></param>/// <param name="to"></param>/// <returns></returns>private IEnumerator TransitionToScene(string from,string to){yield return Fade(1);if (from != string.Empty)//當(dāng)前場(chǎng)景不為空才能卸載{EventHandler.CallBeforeSceneUnloadEvent();yield return SceneManager.UnloadSceneAsync(from);//卸載當(dāng)前場(chǎng)景}yield return SceneManager.LoadSceneAsync(to, LoadSceneMode.Additive);//疊加方式加載轉(zhuǎn)換場(chǎng)景Scene newScene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);//獲取新加載場(chǎng)景SceneManager.SetActiveScene(newScene);//激活新加載場(chǎng)景EventHandler.CallAfterSceneLoadedEvent();yield return Fade(0);}漸入漸出效果的實(shí)現(xiàn)
/// <summary>/// 實(shí)現(xiàn)場(chǎng)景切換的漸入漸出效果/// </summary>/// <param name="targetAlpha"></param>/// <returns></returns>private IEnumerator Fade(float targetAlpha){isFading = true;canvasGroup.blocksRaycasts = true;//禁用鼠標(biāo)float speed = Mathf.Abs(targetAlpha - canvasGroup.alpha) / fadeDuration;//漸變速度while(!Mathf.Approximately(canvasGroup.alpha, targetAlpha)){canvasGroup.alpha = Mathf.MoveTowards(canvasGroup.alpha, targetAlpha, speed * Time.deltaTime);yield return null;}canvasGroup.blocksRaycasts = false;isFading = false;}2.2 Teleport
using System.Collections; using System.Collections.Generic; using UnityEngine;/// <summary> /// 該腳本掛在每個(gè)子場(chǎng)景中,在場(chǎng)景切換時(shí)調(diào)用TransitionManager的Transition方法 /// </summary> public class Teleport : MonoBehaviour {[Header("切換的場(chǎng)景")][SceneName] public string fromSceneName;[SceneName] public string toSceneName;public void TeleportToScene(){TransitionManager.Instance.Transition(fromSceneName, toSceneName);}}2.3 Cursor Manager
將場(chǎng)景切換觸發(fā)點(diǎn)Tag設(shè)置為"Teleport",并通過(guò)實(shí)時(shí)檢測(cè)來(lái)確實(shí)是否進(jìn)行場(chǎng)景切換。
通過(guò)OverlapPoint判斷物體是否和鼠標(biāo)碰撞
/// <summary>/// 物品是否在鼠標(biāo)位置/// </summary>/// <returns></returns>private Collider2D ObjectAtMousePos(){return Physics2D.OverlapPoint(mouseWorldPos);}最后在Update里面實(shí)時(shí)更新檢測(cè)
private void Update(){canClick = ObjectAtMousePos();//物品是否能夠點(diǎn)擊if(canClick&&Input.GetMouseButtonDown(0)){//檢測(cè)鼠標(biāo)和物體的交互情況ClickAction(ObjectAtMousePos().gameObject);}}總結(jié)
以上是生活随笔為你收集整理的Unity游戏开发:场景切换的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Unity游戏开发
- 下一篇: 今年元宵月52年来最圆最大