日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity游戏开发:场景切换的实现

發布時間:2023/12/14 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity游戏开发:场景切换的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在unity中可以將不同場景的背景和道具放置在不同的Scene當中,通過對Scene的加載和卸載來實現場景之間的切換。同時創建一個基礎場景(Control Scene)來對整個游戲系統進行管理,在基礎場景(Control Scene)中不放置背景圖片或者游戲道具而只添加各種控制單元和Canvas。

一、實現邏輯


在場景切換的實現過程中需要定義兩個腳本,一個放在基礎場景中作為控制管理單元,另一個添加到每一個場景中作為執行單元。
在每個場景中為場景切換的觸發點單獨添加一個空物體,為了能夠檢測到鼠標的點擊為其添加一個Collider并設置為Trigger。此外在Teleport腳本中也定義了當前所在的場景和需要切換到的場景。每當鼠標點擊場景切換的觸發點時,Teleport向Transition Manager發出請求并調用Transition函數來實現場景切換。

public void TeleportToScene(){TransitionManager.Instance.Transition(fromSceneName, toSceneName);}

二、代碼實現

2.1 Transition Manager

狀態參數的定義

[SceneName] public string startScene;public bool isFading;//是否在進行場景切換public CanvasGroup canvasGroup;//用來在切換場景時禁用鼠標點擊功能public float fadeDuration;//漸變持續時間public bool canTransition;//是否可以切換場景

場景切換的實現

/// <summary>/// 場景切換API/// </summary>/// <param name="from"></param>/// <param name="to"></param>public void Transition(string from,string to){if (!isFading&&canTransition)//不在場景切換漸變并且可以切換StartCoroutine(TransitionToScene(from, to));}/// <summary>/// 場景切換/// </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)//當前場景不為空才能卸載{EventHandler.CallBeforeSceneUnloadEvent();yield return SceneManager.UnloadSceneAsync(from);//卸載當前場景}yield return SceneManager.LoadSceneAsync(to, LoadSceneMode.Additive);//疊加方式加載轉換場景Scene newScene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);//獲取新加載場景SceneManager.SetActiveScene(newScene);//激活新加載場景EventHandler.CallAfterSceneLoadedEvent();yield return Fade(0);}

漸入漸出效果的實現

/// <summary>/// 實現場景切換的漸入漸出效果/// </summary>/// <param name="targetAlpha"></param>/// <returns></returns>private IEnumerator Fade(float targetAlpha){isFading = true;canvasGroup.blocksRaycasts = true;//禁用鼠標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> /// 該腳本掛在每個子場景中,在場景切換時調用TransitionManager的Transition方法 /// </summary> public class Teleport : MonoBehaviour {[Header("切換的場景")][SceneName] public string fromSceneName;[SceneName] public string toSceneName;public void TeleportToScene(){TransitionManager.Instance.Transition(fromSceneName, toSceneName);}}

2.3 Cursor Manager

將場景切換觸發點Tag設置為"Teleport",并通過實時檢測來確實是否進行場景切換。

/// <summary>/// 點擊物品的活動反饋/// </summary>/// <param name="clickObject">點擊的物品</param>public void ClickAction(GameObject clickObject){switch(clickObject.tag){case "Teleport":var teleport=clickObject.GetComponent<Teleport>();teleport?.TeleportToScene();break;}}

通過OverlapPoint判斷物體是否和鼠標碰撞

/// <summary>/// 物品是否在鼠標位置/// </summary>/// <returns></returns>private Collider2D ObjectAtMousePos(){return Physics2D.OverlapPoint(mouseWorldPos);}

最后在Update里面實時更新檢測

private void Update(){canClick = ObjectAtMousePos();//物品是否能夠點擊if(canClick&&Input.GetMouseButtonDown(0)){//檢測鼠標和物體的交互情況ClickAction(ObjectAtMousePos().gameObject);}}

總結

以上是生活随笔為你收集整理的Unity游戏开发:场景切换的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。