creator中unity3d 场景切换动画怎么设置过渡动画

solidworks2010在视图切换时,没有了中间的过渡动画,怎么来设置_百度知道切换场景过度动画
切换场景过度动画
通常游戏的主场景包含的资源较多,这会导致加载场景的时间较长。为了避免这个问题,可以首先加载Loading场景,然后再通过Loading场景来加载主场景。因为Loading场景包含的资源较少,所以加载速度快。在加载主场景的时候一般会在Loading界面中显示一个进度条来告知玩家当前加载的进度。在Unity中可以通过调用Application.LoadLevelAsync函数来异步加载游戏场景,通过查询AsyncOperation.progress的值来得到场景加载的进度。
尝试——遇到问题
第一步当加载完Loading场景后,调用如下的LoadGame函数开始加载游戏场景,使用异步加载的方式加载场景1(Loading场景为0,主场景为1),通过Unity提供的Coroutine机制,我们可以方便的在每一帧结束后调用SetLoadingPercentage函数来更新界面中显示的进度条的数值。
public void LoadGame() {
StartCoroutine(StartLoading_1(1));
private IEnumerator StartLoading_1(int scene) {
AsyncOperation op = Application.LoadLevelAsync(scene);
while(!op.isDone) {
SetLoadingPercentage(op.progress * 100);
yield return new WaitForEndOfFrame();
最后进度条的效果显示如下:
进度条并没有连续的显示加载的进度,而是停顿一下切换一个数字,再停顿一下切换一个数子,最后在没有显示100%就情况下就切换到主场景了。究其原因在于Application.LoadLevelAsync并不是真正的后台加载,它在每一帧加载一些游戏资源,并给出一个progress值,所以在加载的时候还是会造成游戏卡顿,AsyncOperation.progress的值也不够精确。当主场景加载完毕后Unity就自动切换场景,所以上述代码中的while循环体内的代码是不会被调用的,导致进度条不会显示100%。
修补——100%完成
为了让进度条能显示100%,取巧一点的办法是将AsyncOperation.progress的值乘上2,这样当加载到50%的时候界面上就显示100%了。缺点是当界面上显示100%的时候,用户还要等待一段时间才会进入游戏。其实Unity提供了手动切换场景的方法,把AsyncOperation.allowSceneActivation设为false就可以禁止Unity加载完毕后自动切换场景,修改后的StartLoading_2代码如下:
// this function is not work
private IEnumerator StartLoading_2(int scene) {
AsyncOperation op = Application.LoadLevelAsync(scene);
op.allowSceneActivation = false;
while(!op.isDone) {
SetLoadingPercentage(op.progress * 100);
yield return new WaitForEndOfFrame();
op.allowSceneActivation = true;
我们首先将AsyncOperation.allowSceneActivation设为false,当加载完成后再设为true。代码看上去没有错,但是执行的结果是进度条最后会一直停留在90%上,场景不会切换。通过打印log发现AsyncOperation.isDone一直为false,AsyncOperation.progress的值增加到0.9后就保持不变了,也就是说场景永远不会被加载完毕。
在这个中找到了答案,原来把allowSceneActivation设置为false后,Unity就只会加载场景到90%,剩下的10%要等到allowSceneActivation设置为true后才加载,这不得不说是一个坑。所以代码改为如下。当AsyncOperation.progress到达0.9后,就直接把进度条的数值更新为100%,然后设置AsyncOperation.allowSceneActivation为ture,让Unity继续加载未完成的场景。
private IEnumerator StartLoading_3(int scene) {
AsyncOperation op = Application.LoadLevelAsync(scene);
op.allowSceneActivation = false;
while(op.progress & 0.9f) {
SetLoadingPercentage(op.progress * 100);
yield return new WaitForEndOfFrame();
SetLoadingPercentage(100);
yield return new WaitForEndOfFrame();
op.allowSceneActivation = true;
最后的效果如下:
打磨——增加动画
上述的进度条虽然解决了100%显示的问题,但由于进度条的数值更新不是连续的,所以看上去不够自然和美观。为了看上去像是在连续加载,可以每一次更新进度条的时候插入过渡数值。这里我采用的策略是当获得AsyncOperation.progress的值后,不立即更新进度条的数值,而是每一帧在原有的数值上加1,这样就会产生数字不停滚动的动画效果了,迅雷中显示下载进度就用了这个方法。
private IEnumerator StartLoading_4(int scene) {
int displayProgress = 0;
int toProgress = 0;
AsyncOperation op = Application.LoadLevelAsync(scene);
op.allowSceneActivation = false;
while(op.progress & 0.9f) {
toProgress = (int)op.progress * 100;
while(displayProgress & toProgress) {
++displayProgress;
SetLoadingPercentage(displayProgress);
yield return new WaitForEndOfFrame();
toProgress = 100;
while(displayProgress & toProgress){
++displayProgress;
SetLoadingPercentage(displayProgress);
yield return new WaitForEndOfFrame();
op.allowSceneActivation = true;
displayProgress用来记录要显示在进度条上的数值,最后进度条的动画如下:
对比第一种的进度条
如果在加载游戏主场景之前还需要解析数据表格,生成对象池,进行网络连接等操作,那么可以给这些操作赋予一个权值,利用这些权值就可以计算加载的进度了。如果你的场景加载速度非常快,那么可以使用一个假的进度条,让玩家看上几秒钟的loading动画,然后再加载场景。总之进度条虽然小,但要做好也是不容易的。
我的热门文章
即使是一小步也想与你分享iOS Sprite Kit教程之场景的切换
iOS Sprite Kit教程之场景的切换
Sprite Kit中切换场景
每一个场景都不是单独存在的。玩家可以从一个场景中切换到另外一个场景中。本小节,我们来讲解场景切换。在每一个游戏中都会使用到场景与场景的切换功能,例如,在街机原始人游戏中,选择关卡这一场景中,可以看到有4关,这四关分别代表了4个场景,如图2.20所示。
图2.20&&街机原始的关卡选择
当玩家选择第一关时,就会由选择关卡的场景跳转到第一关的场景中,如图2.21所示。
图2.21&&第一关的场景
当玩家选择第二关时,就会由选择关卡的场景跳转到到第二关的场景中,如图2.22所示。
图2.22&&第二关的场景
此时,它们就使用了到了场景与场景的切换功能,即当玩家轻拍相应的场景后,就会进入到到所选场景中。
Sprite Kit的单纯的场景切换
单纯的场景切换就是指,在场景与场景进行切换时是没有任何过渡效果出现的。切换时需要使用到presentScene(_ scene:&?)方法。
【示例2-7】以下将以项目2-1为基础,实现在轻拍屏幕后,场景GameScene切换至NewGameScene的功能,具有操作步骤如下:
(1)打开GameViewController.swift文件,在viewDidLoad()方法中的编写代码,实现在运行程序后,第一个显示的场景是GameScene,代码如下:
override func viewDidLoad() {
& &&super.viewDidLoad()
& &&let skView = self.view as SKView
& &&if(skView.scene == nil){
& & & &&skView.showsFPS=true
& & & &&skView.showsNodeCount=true
& & &&&&let scene=GameScene(size: skView.bounds.size)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//创建场景
& & & &&scene.scaleMode=SKSceneScaleMode.Fill
& & & & skView.presentScene(scene)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //显示场景
(2)打开GameScene.swift文件,删除touchesBegan(touches: NSSet, withEvent event: UIEvent)中的代码,在其中编写代码,实现触摸屏幕显示NewGameScene场景的功能,代码如下:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
& &&var nextScene=NewGameScene(size: self.size)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//创建场景
& & self.view?.presentScene(nextScene)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//显示场景
此时运行程序,会看到如图2.23所示的效果。
图2.23&&运行效果
Sprite Kit在具有过渡动画的场景
使用单纯的场景切换会使游戏看起来十分生硬。所以游戏开发者为了解决这一不足之处,在切换过程中为游戏添加了过渡效果,使场景与场景切换更加舒适。这些过渡效果包括淡入淡出、水平关闭等,如表2-3所示。
表2-3&&过渡动画
如果想要让一个场景在切换至另一个场景时可以使用到这些过渡动画,需要使用到presentScene(_&scene:?,?transition transition:&?)方法,其语法形式如下:
func presentScene(_ scene:&?,?transition transition:&?)
其中,_ scene表示新的场景,transition表示所使用的过渡动画效果。
【示例2-8】以下将在示例2-7的基础上实现在场景与场景切换时,加入一个旧场景从中间向两边打开,新场景从后方向屏幕靠近的过渡动画。具体的的操作步骤如下:
打开GameScene.swift文件,删除touchesBegan(touches: NSSet, withEvent event: UIEvent)中的代码,在其中编写代码,实现触摸屏幕显示NewGameScene场景的功能,代码如下:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
&&&&var nextScene=NewGameScene(size: self.size)
&&&&var doors=SKTransition.doorwayWithDuration(0.5)
& & self.view?.presentScene(nextScene, transition: doors)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//过渡
此时运行程序,会看到如图2.24所示的效果。
图2.24&&运行效果
过渡动画除了可以使用在图2.24中所看到的外,还可以使用其他的效果,如以下的代码就使用了flipHorizontalWithDuration的过渡动画,即以水平中轴线垂直翻转的过渡动画,代码如下:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
& &&var nextScene=NewGameScene(size: self.size)
& &&var doors=SKTransition.flipHorizontalWithDuration(2)
& &&self.view?.presentScene(nextScene, transition: doors)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//过渡
此时运行程序,会看到如图2.25所示的效果。
图2.25&&运行效果
本文选自:iOS游戏框架Sprite Kit基础教程——Swift版大学霸内部资料,转载请注明出处,尊重技术尊重IT人!
& 开源中国(OSChina.NET) |
开源中国社区(OSChina.net)是工信部
指定的官方社区win10如何设置照片屏幕保护程序的过渡动画?_百度知道主题 : creator中场景切换怎么设置过渡动画?
级别: 新手上路
可可豆: 11 CB
威望: 11 点
在线时间: 45(时)
发自: Web Page
creator中场景切换怎么设置过渡动画?&&&
现在场景切换就是简单的loadScene&&,请问什么方式可以实现类似cocos2dx中的TransitionFade动画?
级别: 新手上路
可可豆: 2 CB
威望: 2 点
在线时间: 8(时)
发自: Web Page
同问,没有找到api
级别: 侠客
可可豆: 820 CB
威望: 615 点
在线时间: 275(时)
发自: Web Page
A场景:this.node.runAction(cc.fadeOut(1.0));cc.director.loadScene('B');--------------------------------------------------B场景Canvas下或background节点下onload:function(){this.node.runAction(cc.fadeIn(1.0));.......}或者将runAction那行换成this.getComponent(cc.Animation).play('customAnim');=。=暂时想到这个
级别: 新手上路
可可豆: 11 CB
威望: 11 点
在线时间: 45(时)
发自: Web Page
回 2楼(linhaiwei123) 的帖子
好的 谢谢!
级别: 新手上路
UID: 547777
可可豆: 34 CB
威望: 31 点
在线时间: 8(时)
发自: Web Page
回 2楼(linhaiwei123) 的帖子
this.node.runAction(cc.fadeOut(1.0));这个方法楼主试过吗,我试了没有任何渐变效果呢
级别: 侠客
可可豆: 820 CB
威望: 615 点
在线时间: 275(时)
发自: Web Page
回 4楼(流氓熊) 的帖子
不好意思 实际上还需要修改opacity
级别: 新手上路
可可豆: 3 CB
威望: 3 点
在线时间: 16(时)
发自: Web Page
this.node.runAction(cc.fadeOut(1.0));需要时间,直接并列跳转场景,当然就看不到了~所以应该用:&&&&&&&&this.node.runAction(cc.sequence(cc.fadeOut(1.0),cc.callFunc(function(){&&&&&&&&&&&&&&&&cc.director.loadScene('Scene1')&&&&&&&&&&&&&&&&})));this.node.runAction(cc.fadeIn(1.0));自身又有个特性~~被执行对象必须是非显示状态,才可以被执行~~已经显示的对象当然不可能渐现~所以应该:&&&&&&&&this.node.setOpacity(0);&&&&&&&&this.node.runAction(cc.fadeIn(1.0));但是效果也不是很理想因为基于各个节点分别执行的透明度渐变,过渡中你仔细看可以看到你半透明人物精灵后边的半透明背景。其实用cc.tintTo,转黑色最好,但是我试了试Canvas又不支持~~就连属性检查器里的Color选项都调不了。等下个版本吧~~到时候可能就有场景切换了~~用不着这么麻烦了。也可能是我菜鸟~~~新手做程序~~“对不起~,其实我是美工~~~呵呵呵~”
级别: 新手上路
UID: 547777
可可豆: 34 CB
威望: 31 点
在线时间: 8(时)
发自: Web Page
回 6楼(leesb13) 的帖子
你要是美工都这么牛X了,就是在逼破我们这些码农喝农药啊,
级别: 新手上路
UID: 547777
可可豆: 34 CB
威望: 31 点
在线时间: 8(时)
发自: Web Page
回 6楼(leesb13) 的帖子
美工大神,还要请教一个问题,我的场景切换是通过按钮点击事件完成的,执行以下代码只是按钮自身实现了渐变,小白还想问一下如何让整个场景实现渐变?&&&&&&&&this.node.runAction(cc.sequence(cc.fadeOut(1.0),cc.callFunc(function(){&&&&&&&&&&&&&&&&cc.director.loadScene('Scene1')&&&&&&&&&&&&&&&&})));
级别: 新手上路
可可豆: 3 CB
威望: 3 点
在线时间: 16(时)
发自: Web Page
回 8楼(流氓熊) 的帖子
那还是这篇帖子我回复的不全面实现点击事件两种方法,单独脚本onLoad方法写Event方法拖拽按钮的属性检查器进行绑定,这方法应该不行,因为再执行runAction时候用的是this.node(this当前元素,正在处理对象)肯定就是按钮啊~恰巧我是美工尽量避免写代码用了第二种方法,你直接随便弄一个方法写在主代码比如是GameScene.js里也就是绑定在场景的Canvas(就是层级管理器顶头那个)中例如:&&&&gameOver: function () {&&&&&&&&this.node.runAction(cc.sequence(cc.fadeOut(1.0),cc.callFunc(&&&&&&&&&&&&function(){&&&&&&&&&&&&&&&&cc.director.loadScene('Scene1')&&&&&&&&&&&&&&&&}))); },然后在层级管理器里选择你要切换场景那个按钮里边的属性最后一项Click Events默认是0,改成1,Target选项里直接把Canvas直接给拽进来,现在下边两个选项可以选择了Component里选择刚才说过的绑定它的主程序GameScene,下边Handler里就可以选刚写好的例子gameOver方法了这样this.node就是当前整个场景了吧~其实第一种方法也不是不行,你就别用this.node.什么什么了呗,你就场景运行runAction就行~~~
关注本帖(如果有新回复会站内信通知您)
4*5+2 正确答案:22
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版

我要回帖

更多关于 unity 场景切换动画 的文章

 

随机推荐