SceneKit_中级06_场景的切换

2022-05-13 16:03:32 浏览数 (2)

SceneKit_入门01_旋转人物

SceneKit_入门02_如何创建工程

SceneKit_入门03_节点

SceneKit_入门04_灯光

SceneKit_入门05_照相机

SceneKit_入门06_行为动画

SceneKit_入门07_几何体

SceneKit_入门08_材质

SceneKit_入门09_物理身体

SceneKit_入门10_物理世界

SceneKit_入门11_粒子系统

SceneKit_入门12_物理行为

SceneKit_入门13_骨骼动画

SceneKit_中级01_模型之间的过渡动画

SceneKit_中级02_SCNView 详细讲解

SceneKit_中级03_切换照相机视角

SceneKit_中级04_约束的使用

SceneKit_中级05_力的使用

SceneKit_中级06_场景的切换

SceneKit_中级07_动态修改属性

SceneKit_中级08_阴影详解

SceneKit_中级09_碰撞检测

SceneKit_中级10_滤镜效果制作

SceneKit_中级11_动画事件

SceneKit_高级01_GLSL

SceneKit_高级02_粒子系统深入研究

SceneKit_高级03_自定义力

SceneKit_高级04_自定义场景过渡效果

SceneKit_高级05 检测手势点击到节点

SceneKit_高级06_加载顶点、纹理、法线坐标

SceneKit_高级07_SCNProgram用法探究

SceneKit_高级08_天空盒子制作

SceneKit_高级09_雾效果

SceneKit_大神01_掉落的文字

SceneKit_大神02_弹幕来袭

SceneKit_大神03_navigationbar上的3D文字

让学习成为一种习惯

学习目标

掌握SceneKit 游戏框架中的几种场景以及如何使用它们。

开始吧

场景切换,你应该想到的更换Scene,最简单的方式就是下面这种写法

代码语言:javascript复制
 self.scnView.scene = scene;

运行一下结果,和我们的预期一模一样。你学会了吧,很简单吧!不过就是有点挫而已,那我们怎么让它变的不这么low,就是给它添加过渡动画,目标明确那就去找方法。SCNScene 是SCNView的属性,那就去它里面找方法

代码语言:javascript复制
- (void)presentScene:(SCNScene *)scene withTransition:(SKTransition *)transition incomingPointOfView:(nullable SCNNode *)pointOfView completionHandler:(nullable void (^)())completionHandler NS_AVAILABLE(10_11, 9_0);

参数说明:

scene 你要切换到的场景 transition 过渡动画类型 pointOfView 切换到的场景中的照相机节点 completionHandle 完成后的block块

有一个参数我要说一下,transition 过渡动画类型 你会发现他是SKTransition 这个是什么类型呢? 悄悄的告诉你,苹果还有一个2D 游戏框架(SpriteKit) 这个类就是它里面的,简书上有人在写SpriteKit框架的教程,有兴趣的可以去搜。

我们去看看它都过渡动画

代码语言:javascript复制
  (SKTransition *)crossFadeWithDuration:(NSTimeInterval)sec;
  (SKTransition *)fadeWithDuration:(NSTimeInterval)sec;
  (SKTransition *)fadeWithColor:(SKColor *)color duration:(NSTimeInterval)sec;
  (SKTransition *)flipHorizontalWithDuration:(NSTimeInterval)sec;
  (SKTransition *)flipVerticalWithDuration:(NSTimeInterval)sec;
  (SKTransition *)revealWithDirection:(SKTransitionDirection)direction duration:(NSTimeInterval)sec;
  (SKTransition *)moveInWithDirection:(SKTransitionDirection)direction duration:(NSTimeInterval)sec;
  (SKTransition *)pushWithDirection:(SKTransitionDirection)direction duration:(NSTimeInterval)sec;
  (SKTransition *)doorsOpenHorizontalWithDuration:(NSTimeInterval)sec;
  (SKTransition *)doorsOpenVerticalWithDuration:(NSTimeInterval)sec;
  (SKTransition *)doorsCloseHorizontalWithDuration:(NSTimeInterval)sec;
  (SKTransition *)doorsCloseVerticalWithDuration:(NSTimeInterval)sec;
  (SKTransition *)doorwayWithDuration:(NSTimeInterval)sec;

动画效果还挺多的,就不一一演示了,我在使用这个方法的时候,遇到了一个大坑。看到这个文章的你们可以放心了,我已经把坑填了。

话不多说看代码!

1.创建工程(略)

2.添加框架(略)

3.添加模型文件(略)

4.添加照相机(略)

...

这些代码完全可以省略了,因为你已经记到心里了,接下来,我们只写转换场景的代码

代码语言:javascript复制
 - (void)presentScene1{
// 创建目标转换场景
SCNScene *scene = [SCNScene scene];
[scene.rootNode addChildNode:[[SCNScene sceneNamed:@"palm_tree.dae"].rootNode childNodeWithName:@"PalmTree" recursively:true]];

// 添加一个照相机
SCNNode *cameraNode1 = [SCNNode node];
cameraNode1.camera = [SCNCamera camera];
cameraNode1.position = SCNVector3Make(0, -100, -1000);
cameraNode1.rotation = SCNVector4Make(1, 0, 0, M_PI);
cameraNode1.camera.automaticallyAdjustsZRange = true;
[scene.rootNode addChildNode:cameraNode1];

// 创建转换场景
SKTransition *transition = [SKTransition doorwayWithDuration:1];
[self.scnView presentScene:scene withTransition: transition incomingPointOfView:cameraNode1 completionHandler:^{
   
}];

运行:

呵呵,报错了

从报错找不到有用的信息怎么办了,上官网找资料

When the transition occurs, the scene property is immediately updated to point to the new scene. Then, the animation occurs. Finally, the strong reference to the old scene is removed. If you need to keep the scene around after the transition occurs, your app needs to keep its own strong reference to the old scene

就是说,你要使用这个动画,需要把当前场景进行强引用,不然就不行。

那我们引用一下就是了

代码语言:javascript复制
 self.lastScene = self.scnView.scene;

然后运行

很好玩,有没有!

提示:

还有一种自定义场景切换效果,我们高级篇讲。

总结

场景过渡方法很简单,相信你已经掌握了,如果任何疑问请留言!


代码库,听说经常给人点赞都当老板了!

0 人点赞