Luaを使ったキャラクタのスクリプティング

146 views

Published on

1/25の第5回Aiming飲み会で発表した資料です。

Published in: Engineering
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
146
On SlideShare
0
From Embeds
0
Number of Embeds
39
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Luaを使ったキャラクタのスクリプティング

  1. 1. Luaを使ったキャラクタの スクリプティング 2017/01/25 アカツキ クライアントエンジニア 柿崎
  2. 2. 2 2005年 名古屋大学工学部電気電子工学科卒 組込みOSの研究やったり、Javaでガラケー向けにゲーム作ったり 2005年ヤマハ入社 研究開発やったり、製品開発(楽器ではない)をする 2015年アカツキにジョイン ・情熱プログラマー ・エンジニアチームキャプテン ・不具合撲滅職人 自己紹介
  3. 3. 3 とあるcocos2d-x開発プロジェクトの話 リアルタイムのゲームモードを新しく開発していました 最初はキャラクターを適当なアニメーションで動かしていましたが リリースへ向けて大幅に手を加えることになりました 経緯
  4. 4. 4 return Sequence::create(Easeout::create(TargetedAction::create(getCharacter(), MoveBy::create(0.15f, Vec2(50,20))), CallFunc::create([this] () { getCharacter()->setMovie(..); }), DelayTime::create(0.1), TargetedAction::create(getEffect1(), Show::create()), nullptr); 初期バージョン Sequence直打ちつらいorz
  5. 5. 5 • lwfを使う • 今回はリアルタイム向けのため途中でイベントが挟まると破綻するた め除外 • cocos studioを使う • 今からデザイナーさんにcocos studio使ってもらうのはちょっと間に 合わない • 独自で定義したクラスを使えない • Luaを使う • 最悪プログラマー(自分)が頑張ればなんとかなる 選択肢 よし!Luaスクリプトエンジンを作ろう!
  6. 6. 6 1.5秒Aを移動 その後Aの画像をA2に変 更 その後エフェクトB表示 設計思想 Lua Sequence::create(…) 中間モジュール(C++) Cocos2d-x Luaで書いた各アクションを中間モジュールに割り当てて、それをcocos2 d-xのActionに変換する形を取りました。 cocos2d::Actionと1対1に対応させてしまうと、初期バージョンとやってい ることが変わらないため、モジュールを構造化しました。
  7. 7. 7 親子構造でsequenceとspawnを表現する 各ノードはTargetNodeとActionが定義される 親子ノードはsequenceで実行されて、兄弟ノードはspawnで実行される 基本構造 spawn sequence
  8. 8. 8 HEADポインタ A B start(A) C D after(B) branch(A, C) after(D) HEADポインタを導入することで直感的な シーケンスの記述を可能にしました 1 2 3 4 1 2 3 4
  9. 9. 9 #define SET_CONST(L, name) { lua_pushinteger(L, name); lua_setglobal(L, #name); } SET_CONST(luaStack->getLuaState(), DASH); SET_CONST(luaStack->getLuaState(), GUARD); SET_CONST(luaStack->getLuaState(), ATC_KICK_1); SET_CONST(luaStack->getLuaState(), ATC_KICK_2); マジックナンバー撲滅 マジックナンバーはLuaの変数を 定義することで減らしました
  10. 10. 10 start(easeOut(moveBy(TARGET_CHARACTER, 0.15, 50, 20), 1.5)) // キャラを0.15秒移動(easeOut) after(setMovie(TARGET_CHARACTER, ATC_KICK_1)) // キャラをKICK_1に変更 after(delay(0.1)) // 0.1秒待ち after(setVisible(TARGET_EFFECT1, true)) // Effect1を表示 結果 good • 読んでわかるコードになった(気がする) • 基本的なアニメーションは実現できて、デザイナーの意図する動きを 短期間で実現できた more • 設計がエンジニア寄りで非エンジニアの人に書いてもらえないかも • 本当はLuaは一度だけ実行して後は使い回せるようにしたかった
  11. 11. 11 という機能を年末年始で作り ました
  12. 12. 12 ご清聴ありがとうございました!

×