记录一下Addressables-Sample项目中的脚本和学习的笔记,主要是熟悉API及其使用方式.方便日后工作查询.
项目地址:
Unity官方教程
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);
}
}
}
- 加载一个新场景,当前场景不关闭
- 卸载场景