swift (with scenekit) で簡単な3dゲームを作ってみた
DESCRIPTION
第2回 Swift勉強会で発表した資料になります。TRANSCRIPT
(with SceneKit) で簡単な 3D ゲームを作ってみた
比留間 和也
比留間 和也
の
HTML ファイ部
比留間 和也
の
HTML ファイ部
技術部 x 人事部
2 月頭に突然のiOSチーム異動
Lobi っていうアプリ作ってます
マイQiitaっていうアプリ出しました
作ったもの3D 的な
iOS8 でカヤックサイト見るとロゴが 3D に! ( ゚∀゚ ) !
実際に作ってきたゲームのデモ
小話
最初に付けた名前は「 Tappy Bird 3D 」
orz
閑話休題
アジェンダ
• Swift を書いてみて苦労した点
• 実際のアプリ制作の感触( Objective-C との違い)
• ライブコーディング
Swift を書いてみて苦労した点
苦労した点 1Xcode6 beta の
コンパイラの挙動が不安定
再コンパイルしようとしたらなぜか型が違うと怒られた (´ ・ ω ・
`)前回のコンパイルから何も変更してないのに (´ ; ω ; `)
• 最初に「 CGFloat 」にしろやって言われてCGFloat にしていたのに、次の時は CFloat にしろって言われる。
• println 関数にふたつの引数を渡したら、書いただけで Xcode が落ちた。
• しかもコードをパースするだけで落ちるので Xcodeからは編集不可→テキストエディタでそこだけ消してなんとか復旧。
苦労した点 2なぜか叱られる
• 補完も効くし、ドキュメント通りに書いているのに「 Symbol Not Found 」で叱られる。
• ObjC でブリッジを書いて解決。
// 受け取った SCNScene インスタンスに対して// 値を代入するだけの簡単なお仕事- (void)physicsWorld:(SCNScene *)scene gravity:(SCNVector3)gravity{ scene.physicsWorld.gravity = gravity;}
※ ちなみに Xcode6 beta3 では上記問題は解決したようです。
苦労した点 3Xcode6 beta3 でコンパイルエラー
「 Xcode beta3キタ━━━━ ( ゚∀゚ )━━━━!! 」
と思って DL
色々期待しながら起動し、実行
wktk
orz
なんにもしてないのにコンパイルエラーヽ ( `Д´)
ノ( beta2 は文句言わなかったジャン・・)
社内でそれを愚痴ると、デキるエンジニアの同僚が発見
どうやら arm64 向けコンパイル時に、コンパイラに渡してい
るオプションが違うとのこと(((( ;゚ Д ゚ )))) ファッ!?
Xcode の設定で「 Other swift flags 」に
「 -target-cpu cyclone 」を入れることで解決
苦労した点 4いきなり書式が変わる
// 今までvar a: Int[] = Int[]()var b: Int[] = [1, 2, 3, 4]
// Beta3 からvar c: [Int] = [Int]()var d: [Int] = [1, 2, 3, 4, 5]
※ ちなみに Array の挙動も微妙に修正されたようです。
実際のアプリ制作の感触( Objective-C との違い)
Objective-C との細かい違い
• イニシャライザは関数実行風に書ける。引数がある場合は、各々ラベルと引数を渡す。
• initWithXXX みたいな書き方や、 stringWithXXXみたいな生成用メソッドはなくなる。
• 「 NSString.class 」的な書き方は「 NSString.self 」に変更。
キャストの仕方はスカラー値とクラスで異なる
// スカラー値// 厳密にはキャストではなくコンバージョンvar a = 5var b = Float(a)
// クラスvar c = Hoge()var d = c as Fuga
Optional 型かどうかはしっかりと意識する必要がある
• Swift は基本的に nil の代入を許容していない。つまり、宣言した型に適合するなにがしかの値を入れておく必要がある
• でも nil を入れておきたいケースはある(例えば NSError など、一時的に宣言だけをしておいて参照を渡したり)
• そういう場合には「 Optional 」な型として変数を宣言する
// Optional な Int 型宣言の例var a: Int? = nil
// こちらはエラーになるvar b: Int = nil
// ちなみにこれを応用して以下のようなこともできるhoge.fuga?.foo?.bar()
既存フレームワークとの連携
ObjC <-> Swift の相互連携
• ObjC で Swift のクラスを利用するには、 Xcode が自動生成する <#ProjectName#>-Swift.h ファイルを import する。
• Swift で ObjC なクラスを利用するには、 <#ProjectName#>-Bridging-Header.h を生成して、それに、 Swift で使いたいクラスのヘッダファイルを import する。
相互連携の細かいことはQiita記事見てね!
ライブコーディング
[DEMO]
ちょっとだけお知らせ
Lobi Rec SDK
Lobi Rec SDK って?
• スマホゲームに動画録画機能を付けられる!
• 実況プレイ動画も撮れる!
実況があるとゲームは格段に面白くなる!
証拠の動画
SceneKit でも動いたよ!
でも公式ではなくあくまで個人で入れてみただけですが
[DEMO]
ご静聴ありがとうございました