SceneKit

1,480 阅读2分钟

笔者最初是做iOS,后来公司业务需要又做了一段时间的unity游戏,再到后来又接触了前端,顺便做了前端切图仔。兜兜转转,公司现在项目大版本已经稳定,手头上的工作也不那么忙了,今天无意间打开xcode,点击了一下那个SceneKit,回忆起当年,那是一个“苦逼😭”,当时做游戏之前只会iOS,公司选型上是国产Cocos和 国外Unity3D,后面可想而知了。曾经加班了一年,花费了大量时间学习Unity,现在却偏爱Unreal了。

最初接触游戏的是 iOS原生的 SceneKit,其实也还行,就是不能跨平台,几乎没人使用(下面这个例子是笔者第一次接触游戏时的开篇,当年的艰苦岁月历历在目😭):

1、创建一个scene Scene Kit 内建了几种简单的几何模型,如盒子、球体、平面、圆锥体等,但对于游戏来说,一般都会从文件中加载3D模型。

a、如果一个从文件里加载的场景可以全部显示时,将其设置成 SCNView 的 scene 就好了;

Create a new scene let scene = SCNScene(named: "art.scnassets/SceneKitScene.scn")!

b、如果加载的场景文件中包含了多个对象,只有一部分对象要显示在屏幕上时,就可以通过名字找到这个对象,再手动加载到 view 上: (有点像Unity 获Cocos2d)

if let knight = chessPieces.rootNode.childNodeWithName("Knight", recursively: true) { sceneView.scene?.rootNode.addChildNode(knight) }

认识一下节点.webp

addChildNode(_:)

insertChildNode(_: atIndex:)

removeFromParentNode()

如果想在一个Node下拥有多个“马”的话,直接使用copy 或者clone,这样你的材质模型都是一模一样的。如果你想拥有不同颜色的的“马”,材质改变就可以了,那就意味着你要copy一个模型对象,单独附上你的不同的材质。

#光照 Scene Kit 中完全都是动态光照,使用起来一般会很简单。它提供四种类型的光照:环境光、定向光源、点光源和聚光灯。 ambient, directional, omnidirectional (point lights), and spotlights.

let spot = SCNLight() spot.type = SCNLightTypeSpot spot.castsShadow = true

let spotNode = SCNNode() spotNode.light = spot spotNode.position = SCNVector3(x: 4, y: 7, z: 6)

let lookAt = SCNLookAtConstraint(target: knight) spotNode.constraints = [lookAt]

光照效果如下:

光照效果.webp #动画

Scene Kit 的动画更加简单,创建一个 CAAnimation 对象,并指定一个 key path (甚至可以 "position.x") ,然后向一个对象施加这个动画,就可以了。

let move = CABasicAnimation(keyPath: "position.x") move.byValue = 10 move.duration = 1.0 knight.addAnimation(move, forKey: "slide right")

你会使用iOS原生的框架写游戏吗? 你还记得你编写程序的第一个例子吗? 你编程时写的第一句话是什么?