首頁 > 軟體

Unity遊戲開發實現場景切換範例

2022-08-11 18:00:25

引言

在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遊戲開發場景切換的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com