的教程:【《迷失島2》游戲框架開發01:實現場景轉換|教程】

搭建場景

使用下載好的素材搭建場景H1-H4和H2A、永久的場景,將場景都拖拽到面板,只加載和H1和場景,將H1作為激活場景,并給每個場景中的場景切換圖標添加一個帶的空物體,只保留的場景中的相機,其余的場景的相機都刪除,將相機的背景顏色設置為黑色,Size設置為5.4,Game面板的展示大小為1920*1080,這樣圖片就可以剛好完全展示在屏幕中。

腳本

實現邏輯:當點擊對應的圖標的時候,檢測到其對應的碰撞體,如果這個碰撞體的游戲對象的標簽為指定的類型標簽則調用場景轉換的方法。由于每個場景中都存在場景轉換,所以場景轉換的類為單例,便于調用

創建腳本:.cs、.cs、.cs、.cs。

// SingleTon.cs 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Singleton<T> : MonoBehaviour where T : Singleton<T> // 類型約束,類T必須繼承Singleton
{
    // 單例
    protected static T instance;
    // 設置只讀屬性
    public static T Instance
    {
        get { return instance; }
    }
    private void Awake()
    {
        if (instance == null)
        {
            instance = (T)this;
        }
        else
        {
            Destroy(this);
        }
        DontDestroyOnLoad(this);
    }
    // 是否創建實例
    private bool IsInitial()
    {
        return instance != null;
    }
    // 銷毀單例
    protected void OnDestroy()
    {
        if (instance == this)
        {
            instance = null;
        }
    }
}

CursorManager.cs腳本編輯:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CursorManager : MonoBehaviour
{
    // 將鼠標點擊的屏幕坐標轉換成世界坐標
    private Vector2 mouseWorldPoint => Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0));
    // 如果鼠標點擊了
    private bool isClick;
    private Collider2D coll;
    // Update is called once per frame
    void Update()
    {
        isClick = ObjectAtMouseClick();
        if (isClick && Input.GetMouseButton(0))
        {
            // 根據游戲對象的不同標簽來判斷執行什么操作
            coll = ObjectAtMouseClick();
            ClickAction(coll.gameObject);
        }
    }
    public void ClickAction(GameObject clickObject)
    {
        switch (coll.gameObject.tag)
        {
            case "Teleport":
                // 獲取對象上的Teleport組件,執行場景切換方法
                Teleport t = clickObject.GetComponent<Teleport>();
                t?.TransitionScene();
                break;
            default:
                break;
        }
    }
    public Collider2D ObjectAtMouseClick()
    {
        return Physics2D.OverlapPoint(mouseWorldPoint);
    }
}

每個場景中的切換圖標物體都添加腳本.cs ,FIle—> 面板中點擊“Add Open ”將所有的場景都添加進去

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum SceneName
{
    H1,
    H2,
    H3,
    H4,
    H2A,
}
public class Teleport : MonoBehaviour
{
    // 現在處于的場景
    public SceneName from;
    // 要切換到的場景
    public SceneName to;
    public void TransitionScene()
    {
        // 場景切換
        TransitionManager.Instance.TransitionScene(from, to);
    }
}

場景切換

編輯腳本.cs,實現場景切換且未添加淡入淡出,未實現淡入淡出效果的時候的代碼:

.;

..;

;

.;

.UI;

:

// 啟動協程
public void TransitionScene(SceneName from, SceneName to)
{
    // 如果實現切換場景淡入淡出效果則不能進行場景切換
    StartCoroutine(SwitchScene(from, to));
}
/// 
/// 切換場景
/// 
/// 
/// 
/// 
public IEnumerator SwitchScene(SceneName from, SceneName to)
{
    // 屏蔽鼠標操作
    anim.gameObject.GetComponent().raycastTarget = true;
    // 卸載當前場景
    yield return AsyncOperation unloadScene = SceneManager.UnloadSceneAsync(from.ToString());
   
    // 加載要加載的場景
     yield return AsyncOperation loadScene = SceneManager.LoadSceneAsync(to.ToString(), LoadSceneMode.Additive);
    
    // 激活場景
    Scene newScene = SceneManager.GetSceneByName(to.ToString()); // 通過場景名稱來獲取場景
    SceneManager.SetActiveScene(newScene);
}

場景切換是正常的

但是加入淡入淡出相關函數的代碼(如下)之后,


public IEnumerator SwitchScene(SceneName from, SceneName to)
    {
        // 當設置好場景后就加入Fade,1是全黑,0是透明
        yield return Fade(1);
        // 卸載當前場景
        yield return SceneManager.UnloadSceneAsync(from.ToString());
        // 加載要加載的場景
        yield return SceneManager.LoadSceneAsync(to.ToString(), LoadSceneMode.Additive);
        // 激活場景
        // Scene newScene = SceneManager.GetSceneByName(to.ToString()); // 通過場景名稱來獲取場景
        Scene newScene = SceneManager.GetSceneByBuildIndex((int)to); // 通過場景在build setting中的序號來獲取場景,使用這個也會經常報錯
        if (newScene == null)
        {
            SceneManager.SetActiveScene(newScene);
        }
        // 恢復場景可見
        yield return Fade(0);
        // 鼠標點擊有效
        cp.blocksRaycasts = false;
    }
    
    /// 
    /// 設置轉場時的遮罩顏色漸變
    /// 
    /// 
    private IEnumerator Fade(float alpha)
    {
        // 正在開始淡入特效
        isFade = true;
        // 屏蔽所有的鼠標點擊
        cp.blocksRaycasts = true;
        // 計算淡入速度, 現在的alpha與目標alpha的差值再除以持續時間得到Fade速度
        float speed = Mathf.Abs(cp.alpha - alpha) / fadeDuaration;
        while (Mathf.Approximately(cp.alpha, alpha))
        {
            // 線性差值來實現Fade
            cp.alpha = Mathf.Lerp(cp.alpha, alpha, speed * Time.deltaTime);
            yield return null;
        }
        // 淡出后就重新設置isFade
        isFade = false;
    }
   

出現報錯:: to is

具體是這句代碼“ .(from.());”中的所獲取到的無效

查閱網上找到信息:

使用.的時候,設置了要注意使用它以后的特點:使用它之后

是永遠不會有返回的,意味著程序會卡在這句話上,而且如果有多個在排隊進行,注意在進行中的如果沒有結束下一個不會開始,使用的時候,如果當前只有一個激活的場景,另一個場景因為設置為等還沒加載完畢,那不會正常執行并且會返回空,

此外如果某個一直進度為0,則它前面一般是有個沒有執行完的,使用要特別注意特點,相關詳見

API搜索,和

仔細看它們的說明和使用示例。 ———————————————— 版權聲明:本文為CSDN博主「」的原創文章,遵循CC