好像⽹上加载场景和切换场景有2种主流的⽅式
1)⽤Scenemanager加载和切换scene
2)将scene做成prefab,加载和切换prefab
我⽤的是第⼆种⽅式
1)将preafab打包成assetbundle杜润生逝世
代码如下 :
// Builds an asset bundle from the selected objects in the project view.
// to build the Asset Bundle
using UnityEngine;
using UnityEditor;
public class ExportAssetBundles {
[MenuItem("Assets/Build AssetBundle From Selection - Track dependencies -Android")]
static void ExportResource () {
// Bring up save panel
string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d");
if (path.Length != 0) {
// Build the resource file from the active selection.太原郝建秀
Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path,
BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets,BuildTarget.Android); Selection.objects = selection;
}
党的思想路线}
}
当然也可以⽤添加AssetBundle Name 的⽅式来统⼀打包。
不建议⽤第⼀种⽅式,好像会把依赖的资源全打进去,⽽且官⽅已经放弃
2)加载和切换
代码如下:
IEnumerator CoChangeScene(GameScene _scene )
{
//销毁当前场景
for(int i=0;i<sce_scene.Length;i++)
{
if(sce_scene[i]!=null&&i!=(int)_scene)
{
DestroyImmediate(sce_scene[i]);
sce_scene[i]=null;
}
}
Resources.UnloadUnusedAssets();
GC.Collect();
if ((pf_scene [(int)_scene]) != null) {
sce_scene [(int)_scene] = Instantiate (pf_scene [(int)_scene]) as GameObject;
} else {
yield return StartCoroutine (StResource.GetInstance ().CoLoadScene (_scene));
sce_scene [(int)_scene] = Instantiate (StResource.GetInstance ().GetScene (_scene)) as GameObject; }
sce_scene[(int)_scene].transform.ansform);
sce_scene[(int)_scene].transform.localPosition=new Vector3(0,0,0);
sce_scene[(int)_scene].transform.localScale=new Vector3(1,1,1);
sce
StResource.GetInstance().UnLoadScene( _scene,false);
yield return null;
}
这就是我的切换逻辑了,很简陋,但也勉强能⽤,