Unity官方案例-Addressables-Sample-笔记(2)-Scene Loading(场景加载)

记录一下Addressables-Sample项目中的脚本和学习的笔记,主要是熟悉API及其使用方式.方便日后工作查询.

项目地址:

github: Addressables-Sample

Unity官方教程

Bilibili-Unity官方教程 Addressables【中文字幕】

Scene Loading

此示例演示了通过Addressables加载场景

场景说明

Scenes/Bootstrap

  • 这是开始的场景。从这个场景可以过渡到其他场景。
  • “Transition to Next Scene”将打开一个新场景(非累加),该场景将关闭当前场景。
  • “Add Object”将在场景中实例化一个可寻址的预置。此按钮的目的是显示这些项不需要对其调用ReleaseInstance。如果你使用 Profiler,你会看到他们会在场景关闭时得到清理。

Scenes/Foundation

  • 开始场景加载的就是这个场景。
  • “Load”按钮将额外打开其他场景。
  • “Unload”按钮将卸载已附加加载的场景。

Scenes/ItemScenes/

  • 额外的场景,没有脚本,从Foundation场景加载

脚本说明

Scripts/NextScene.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.UI;

public class NextScene : MonoBehaviour
{
    
    
	public string NextSceneAddress;

	Button m_NextButton;
	
	// Use this for initialization
	void Start ()
	{
    
    
		m_NextButton = GetComponent<Button>();
		m_NextButton.onClick.AddListener(OnButtonClick);
	}

	void OnButtonClick()
	{
    
    
		Addressables.LoadSceneAsync(NextSceneAddress);
	}
}

  • 打开一个新场景,关闭当前场景
  • public string NextSceneAddress; 这是场景的可寻址地址,是Addressables Groups里面的Addressable Name,而不是场景的场景名

Scripts/AddObject.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.UI;

public class AddObject : MonoBehaviour {

    public string addressToAdd;
    Button m_AddButton;

    void Start()
    {
        
        m_AddButton = GetComponent<Button>();
        m_AddButton.onClick.AddListener(OnButtonClick);
    }

    void OnButtonClick()
    {
        var randSpot = new Vector3(Random.Range(-5, 1), Random.Range(-10, 10), Random.Range(0, 100));
        Addressables.InstantiateAsync("ball", randSpot, Quaternion.identity);
    }
}

  • 加载一个预置

Scripts/AddScenes.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.ResourceManagement.ResourceProviders;
using UnityEngine.SceneManagement;
using UnityEngine.Serialization;
using UnityEngine.UI;

public class AddScenes : MonoBehaviour
{
	public string addressToAdd;
	Button m_AddButton;
	public TMPro.TMP_Text textArea;
	SceneInstance m_LoadedScene;
	bool m_ReadyToLoad = true;
	// Use this for initialization
	void Start () {
		
		m_AddButton = GetComponent<Button>();
		m_AddButton.onClick.AddListener(OnButtonClick);

		textArea.text = "Load " + addressToAdd;
	}

	void OnButtonClick()
	{
		if(string.IsNullOrEmpty(addressToAdd))
			Debug.LogError("Address To Add not set.");
		else
		{
			if (m_ReadyToLoad)
				Addressables.LoadSceneAsync(addressToAdd, LoadSceneMode.Additive).Completed += OnSceneLoaded;
			else
			{
				Addressables.UnloadSceneAsync(m_LoadedScene).Completed += OnSceneUnloaded;
			}
		}
	}

	void OnSceneUnloaded(AsyncOperationHandle<SceneInstance> obj)
	{
		if (obj.Status == AsyncOperationStatus.Succeeded)
		{
			textArea.text = "Reload " + addressToAdd;
			m_ReadyToLoad = true;
			m_LoadedScene = new SceneInstance();
		}
		else
		{
			Debug.LogError("Failed to unload scene at address: " + addressToAdd);
		}
	}

	void OnSceneLoaded(AsyncOperationHandle<SceneInstance> obj)
	{
		if (obj.Status == AsyncOperationStatus.Succeeded)
		{
			textArea.text = "Unload " + addressToAdd;
			m_LoadedScene = obj.Result;
			m_ReadyToLoad = false;
		}
		else
		{
			Debug.LogError("Failed to load scene at address: " + addressToAdd);
		}
	}

}
	

  • 加载一个新场景,当前场景不关闭
  • 卸载场景

猜你喜欢

转载自blog.csdn.net/kill566666/article/details/119112217