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遊戲開發實現場景切換示例的詳細內容,更多關於Unity遊戲開發場景切換的資料請關註WalkonNet其它相關文章!

推薦閱讀: