Application 应用程序
你需要引用命名空间: using UnityEngine
描述访问应用程序的运行时数据。
这个类包含查找信息和控制运行时数据的静态方法。
一、成员变量
Application.absoluteURL //到web播放器数据文件夹的绝对路径(只读)。
Application.backgroundLoadingPriority //后台装载线程优先级。
Application.dataPath //包含游戏数据文件夹的路径(只读)。
Application.genuine //如果编译后的应用程序被任何方式改变的了,返回假。
Application.genuineCheckAvailable //如果可以确认应用程序的完整性返回真。
Application.internetReachability //返回设备上的网络可达性目前可能的类型。
Application.isEditor //是在Unity编辑器内运行
Application.isLoadingLevel //是否有一些场景正在被加载(只读)
Application.isPlaying //当在任何种类的播放器时,返回真(只读)。
Application.isWebPlayer //是否在一个网络播放器中运行?(只读)
Application.levelCount //可用的关卡总数。(只读)
Application.loadedLevel //最后加载的关卡索引(只读),也就是已加载的关卡或上次加载的关卡索引。
Application.loadedLevelName //最后加载的关卡的名字。(只读)也就是已加载的或上次加载的关卡名称。
Application.persistentDataPath //包含一个持久数据目录的路径(只读)。
Application.platform //返回游戏运行的平台(只读)。
Application.runInBackground //应用程序在后台时是否应该被运行?
Application.srcValue //相对于html文件的web播放器数据文件的路径(只读)。
Application.streamedBytes //我们从主Unity网页流中下载了多少字节(只读)
Application.streamingAssetsPath //包含一个到StreamingAssets文件夹的路径。(只读)
Application.systemLanguage //用户操作系统正在运行的语言。
Application.targetFrameRate //命令游戏尝试以一个特定的帧率渲染。
Application.temporaryCachePath //包含一个临时数据/缓存目录的路径(只读)。
Application.unityVersion //用于播放该内容的Unity运行时的版本。
Application.webSecurityEnabled //指示是否webplayer的安全模式是否被启用。
二、函数
Application.CancelQuit() //取消退出该应用程序。这可以用来在退出游戏的时候显示一个退出画面。
Application.CanStreamedLevelBeLoaded() //可以流数据加载关卡么?
Application.CaptureScreenshot() //捕捉屏幕到filename路径,保存为PNG文件。
Application.ExternalCall() //调用一个包含在网页中的函数(只用于Web Player)。
Application.ExternalEval() //调用包含在网页中的片段脚本函数(只用于Web Player)。
Application.GetStreamProgressForLevel() //下载的进度是多少? [0…1].
Application.HasProLicense() //是具有Unity Pro许可证激活?
Application.HasUserAuthorization() //检查用户是否有权在网页中使用摄像头和麦克风。
Application.LoadLevel() //通过关卡的名字或索引来加载关卡。
Application.LoadLevelAdditive() //累加一个关卡,也就是说,加载一个新的场景,当前场景不会被销毁。
Application.LoadLevelAdditiveAsync() //在后台异步累加关卡,也就是说在后台非同步加载新的场景,但当前的场景不会被销毁。
Application.LoadLevelAsync() //在后台异步加载关卡,也就是说,在后台非同步加载新的场景。
Application.OpenURL() //在浏览器中打开url 。
Application.Quit() // 退出应用程序。在编辑器或者web播放器中退出被忽略。
Application.RegisterLogCallback() //在一个日志信息上注册一个委托来被调用。
Application.RegisterLogCallbackThreaded() //在一个日志信息上注册一个委托来被调用。
Application.RequestUserAuthorization() //在webplayer请求授权使用摄像头或麦克风。
Unity Editor下使用 Application.Quit()为什么程序没有退出?
因为Editor下使用 UnityEditor.EditorApplication.isPlaying = false 结束退出,
只有当工程打包编译后的程序使用Application.Quit()才奏效,具体参见代码,
在自己的工程中添加调用即可。
Application各种路径在终端的本地路径如图1-1
## PC:
Application.dataPath : /Assets
Application.streamingAssetsPath : /Assets/StreamingAssets
Application.persistentDataPath : C:/Users/xxxx/AppData/LocalLow/CompanyName/ProductName
Application.temporaryCachePath : C:/Users/xxxx/AppData/Local/Temp/CompanyName/ProductName
Android:
Application.dataPath : /data/app/xxx.xxx.xxx.apk
Application.streamingAssetsPath : jar:file:///data/app/xxx.xxx.xxx.apk/!/assets
Application.persistentDataPath : /data/data/xxx.xxx.xxx/files
Application.temporaryCachePath : /data/data/xxx.xxx.xxx/cache
IOS:
Application.dataPath : Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data
Application.streamingAssetsPath : Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw
Application.persistentDataPath : Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents
Application.temporaryCachePath : Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches
Mac:
Application.dataPath : /Assets
Application.streamingAssetsPath : /Assets/StreamingAssets
Application.persistentDataPath : /Users/xxxx/Library/Caches/CompanyName/Product Name
Application.temporaryCachePath : /var/folders/57/6b4_9w8113x2fsmzx_yhrhvh0000gn/T/CompanyName/Product Name
SceneManager —— 场景管理
我们在游戏开发中,经常用到关卡切换、场景切换、加载场景等诸多功能性操作
Unity 为我们提供了场景管理类,可以很方便的对场景进行各类操作
下边我们就来逐一的看一下,API中的函数具体用法
注意:要引用 using UnityEngine.SceneManagement
直接给大家贴上中文注释,便于初学者学习
其他易出错的函数, Chinar 也用了简单例子做了说明,避免初学者踩坑!
提示:
其中 0 号场景为: SampleScene
其中 1 号场景为: SampleScene2
一、成员变量
SceneManager.GetActiveScene().buildIndex; //返回“Build Setting”中场景的索引。如果场景是通过AssetBundle加载的,则始终返回-1。
SceneManager.GetActiveScene().isDirty //如果场景被修改,则返回true。
SceneManager.GetActiveScene().isLoaded //如果加载场景,则返回true。
SceneManager.GetActiveScene().name; //返回场景的名称。
SceneManager.GetActiveScene().path; //返回场景的相对路径。喜欢:“Assets/Scenes/SampleScene.unity”。
SceneManager.GetActiveScene().rootCount; //返回场景的游戏对象个数
SceneManager.GetActiveScene().GetHashCode(); //返回场景的哈希值
SceneManager.GetActiveScene().GetRootGameObjects(); //返回场景中所有游戏对象,是一个GameObject[] 数组
二、函数
SceneManager.CreateScene("SampleScene2"); //使用给定名称在运行时创建一个空的新场景
SceneManager.GetActiveScene(); //获取当前活动的场景
SceneManager.GetSceneAt(0); //在SceneManager的已加载场景列表中获取索引处的场景
SceneManager.GetSceneByBuildIndex(0); //从构建Build Setting中索引获取Scene结构
SceneManager.GetSceneByName("SampleScene2"); //搜索给定名称的场景
SceneManager.GetSceneByPath("Assets/Scenes/SampleScene.unity"); //搜索给定路径的场景
SceneManager.LoadScene(1); //根据“Build Setting”中索引加载场景
SceneManager.LoadScene("SampleScene2"); //根据“Build Setting”中名称加载场景
SceneManager.LoadScene(1, LoadSceneMode.Additive); //加载场景,加载方式:保留当前场景,附加指定场景
SceneManager.LoadScene("SampleScene2", LoadSceneMode.Single); //加载场景,加载方式:关闭所有当前加载的场景并加载场景
SceneManager.LoadSceneAsync(1); //根据下标,在后台异步加载场景
SceneManager.LoadSceneAsync("SampleScene2"); //根据名称,在后台异步加载场景
SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive); //异步加载,方式:附加
SceneManager.LoadSceneAsync(1); //异步加载,方式:单一
SceneManager.UnloadSceneAsync("SampleScene2"); //销毁与给定场景关联的所有GameObject,并从SceneManager中移除场景。
有时我们需要将场景合并
或者将当前场景的游戏对象,移动到其他场景中 / 设置活跃场景
提示:
进行这三类操作,都需要先将目标场景加载后,才可保证函数正确执行
这里为了便于初学者理解,我用了协成加载的方式,来做说明
其中 0 号场景为: SampleScene
其中 1 号场景为: SampleScene2
合并场景
void Start()
{
StartCoroutine(MergeMethodEnumerator());//合并场景
}
//合并场景:必须要保证,要合并的场景被加载后,才可以正确合并,如果物体名称相同,并不会合并,相互独立
IEnumerator MergeMethodEnumerator()
{
//等待场景加载完毕后,再向下执行
yield return SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive);
//源场景 1,目标场景:当前 —— 将源场景合并到目标场景中
SceneManager.MergeScenes(SceneManager.GetSceneByBuildIndex(1), SceneManager.GetActiveScene());
}
移动游戏对象到目标场景
void Start()
{
StartCoroutine(MoveGameObjectToSceneEnumerator()); //移动游戏对象到目标场景
}
//移动游戏对象到新场景,必须要保证:目标场景被加载后,游戏对象才能被正确移动到目标场景中如果物体名称相同,
//并不会合并,相互独立
IEnumerator MoveGameObjectToSceneEnumerator()
{
//等待场景加载完毕后,再向下执行
yield return SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive);
//将当前场景中的 Cube,移动到目标场景中
SceneManager.MoveGameObjectToScene(GameObject.Find("Cube"), SceneManager.GetSceneByName("SampleScene2"));
//卸载掉当前场景
SceneManager.UnloadSceneAsync(SceneManager.GetActiveScene());
//如果要加载单个场景,请确保在要移动到新场景的GameObject上使用DontDestroyOnLoad,否则Unity会在加载新场景时删除它。
}
设置场景为活动场景
void Start()
{
StartCoroutine(SetActiveSceneEnumerator()); //设置场景为活动场景
}
//设置场景为活动场景
// 必须要保证:目标场景被加载后,才可以正确设置活动状态
IEnumerator SetActiveSceneEnumerator()
{
//等待场景加载完毕后,再向下执行
yield return SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive);
//设置场景为活动场景
SceneManager.SetActiveScene(SceneManager.GetSceneAt(1));
//print(SceneManager.GetSceneAt(1).IsValid());
}
Scene (Events) —— 场景事件
有时我们需要场景记载/卸载/变更时,进行一系列操作
这时我们需要用事件来完成通知
提示:
其中 0 号场景为: SampleScene
其中 1 号场景为: SampleScene2
// 初始化函数
void Start()
{
SceneManager.activeSceneChanged += SceneManager_activeSceneChanged; //订阅此事件可在活动场景发生更改时收到通知。
StartCoroutine(SetActiveSceneEnumerator()); //活动场景切换时,会收到通知,打印输出"活动场景变更了"
SceneManager.sceneLoaded += SceneManager_sceneLoaded; //委托 —— 加载场景时收到通知
SceneManager.LoadSceneAsync(1); //异步加载,加载方式:单一
SceneManager.sceneUnloaded += SceneManager_sceneUnloaded; //委托 —— 卸载Scene时收到通知
}
//设置场景为活动场景
//必须要保证:目标场景被加载后,才可以正确设置活动状态
IEnumerator SetActiveSceneEnumerator()
{
yield return SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive); //等待场景加载完毕后,再向下执行
SceneManager.SetActiveScene(SceneManager.GetSceneAt(1)); //设置场景为活动场景
}
// 活动场景变动时被调用
private void SceneManager_activeSceneChanged(Scene arg0, Scene arg1)
{
print("活动场景变更了");
}
/// 场景被加载后,被调用
private void SceneManager_sceneLoaded(Scene arg0, LoadSceneMode arg1)
{
print("场景被加载了");
}
// 场景被卸载时,被调用
private void SceneManager_sceneUnloaded(Scene arg0)
{
print("场景被卸载了");
}