5.3K Views
January 17, 24
スライド概要
CEDEC2017 (Computer Entertainment Developers Conference 2017)で行われた講演
『RE ENGINEでのゲーム開発を支えるMacro(Plug-in)機能の紹介』
で使用されたスライドです。
※本スライドには動画が含まれております。pptxファイルをダウンロードすることで動画込みでご覧いただけます
講演概要は以下のサイトをご覧ください。
https://cedec.cesa.or.jp/2017/session/ENG/s58bf6315008fe.html
※CEDECの資料公開サイトCEDiLでも本資料が公開されています。
https://cedil.cesa.or.jp/
株式会社カプコンが誇るゲームエンジン「RE ENGINE」を開発している技術研究統括によるカプコン公式アカウントです。 これまでの技術カンファレンスなどで行った講演資料を公開しています。 【CAPCOM オープンカンファレンス プロフェッショナル RE:2023】 https://www.capcom-games.com/coc/2023/ 【CAPCOM オープンカンファレンス RE:2022】 https://www.capcom.co.jp/RE2022/ 【CAPCOM オープンカンファレンス RE:2019】 http://www.capcom.co.jp/RE2019/
RE ENGINE での ゲーム開発を支える Macro(Plug-in)機能の紹介 株式会社 カプコン 関野 優樹
自己紹介 • 関野優樹 – 2009年入社 技術開発室 所属 – DCC Plug-in サポート • Softimage XSI, Autodesk MAYA – 内製ゲームエンジン サポート • MT FRAMEWORK • RE ENGINE
ここでの話 • RE ENGINE – カプコン 内製開発環境 • 毎日 数十回 更新・リリース – BIO HAZRAD 7 と同時開発 • 今後も様々なタイトルで活用 • その一部 Macro機能 の紹介
もくじ • Macro ってなんですか? • どうして必要ですか? • どんな時に使いますか? • どうやって動いていますか?
RE ENGINE での ゲーム開発を支える Macro(Plug-in)機能の紹介 Macro ってなんですか?
Macro = “RE ENGINE の Plug-in” 【プラグイン】 アプリケーションソフトウェアの機能を 拡張するために追加するプログラムの一種. ― Wikipedia
Macro と 世の似た機能 Microsoft Excel Autodesk MAYA Function (Add-on) VBA ! MEL Python Python Function (Script) Function (Macro)
動画をお見せします • Meshから、Material, Prefab 作成を行う ① RE ENGINEのToolを使って手動作業 ② Macroを作成し、自動作業 ③ “②”の Macroを改良し、量産する
動画① RE ENGINEのToolを使って 手動作業 (約1分半)
動画② Macroを作成し、自動作業 (約4分)
動画③ “②”のMacroを改良し、量産する (約2分)
Demoから見える 特徴 • RE ENGINE 機能を Python で まとめて実行 – 煩わしい 手作業を 代替する手段 • RE ENGINEの再ビルド不要、スグに用意 – 簡単に導入できる・試せる • 簡単に 1ボタン 化、呼び出しも自在 – ノンプログラマでも使いやすい
Macro Editor @ RE ENGINE • 思付いた機能をすぐ試す – Command 補間機能 • Syntax Highlight – Error も表示可能 • Maya Script Editor 風
Macro Shelf @ RE ENGINE • 作成した Python コードをボタン化する – アイコン、ラベル、ToolTipの変更が可能 • ボタン情報は、チーム内で配布可能 – XML化され、SVN管理 XML • Maya Shelf 風
Visual Studio 連携 • 巨大な Macro 機能の更新・保守 – コードを最適化する機能が優秀 – Break Point によるデバッグ – Command / 関数補間
Macro Commands • Command 数は 400+ (2017/9 現在) State Machine Scene / Prefab Timeline / Clip Motion
Command Reference (自動生成)
RE ENGINE での ゲーム開発を支える Macro(Plug-in)機能の紹介 どうして必要ですか?
Macro の 持ち味 • リリース済 RE ENGINE へ – 新たな機能を追加 • 現場に即した 機能を後付けできる – 操作フローの 簡略化 • 開発現場で発生する負担を削減
なぜ、機能を後付けするの? • RE ENGINE は、汎用ゲームエンジン – BIO HAZARD 7 専用ではない • 今後も別のゲームを開発予定 • Tool 機能の共通化が必須 • Coreには、どの タイトル でも 使える機能 を
だけど、欲しい • チーム が定めたシステム・データ構成 – これに即した、 機能拡張 が必要 • 機能を後付できる Plug-inの概念 が誕生 – Behavior Scriptと別離させる為に Macro と呼称
RE ENGINE での ゲーム開発を支える Macro(Plug-in)機能の紹介 どんな時に使いますか?
さて、みなさん ゲームを作っている中で、 こんなこと を思ったことはありませんか?
最近の 大規模開発は、複雑化の一途 Ex: BIO HAZARD 7 Asset数 ※ 開発時・累計 ➢ Props (小物) 数: 2700+ ➢ Stage (部屋) 数: 600+ ➢ 作業人数 (小物+部屋): 30+ 作業が多い・人は増える・開発期間はそう変わらない
【あるある1】担当者の増加 うれしい悲鳴だ! 細かな 作業の流れを伝達! 人がミスしないような資料を作ろう! (多分 ミスするけど、随時指摘しよう)
【あるある2】量産された不正データ 仕様の変更があった・操作をミスっていた 不正データの数が知りたい 問題がないデータへ 一括変換したい! (さもないと、頑張って手作業で修正だ)
【あるある3】データの最適化 変なサイズのテクスチャ! 細分化されすぎているコリジョン! Assetの最新情報をExcelで見たい! (無理なら、頑張って手作業でExcelつくるよ)
多かれ少なかれ 似たような経験 お持ちの方は多いのでは?
現場は 難題を抱えている • 現場によって 状況がまちまち – 開発中の ゲーム毎に最適な構成 を定義 • フォルダ構成・命名規則・データ構成 • 新しいルールに則った ゲームづくり – 初見の 構成・環境に、途中合流の開発者は戸惑う
前述の状況で発生する問題 • 資料 を作るのに 時間がかかる – 手数が多いと、難儀する • 人は ミス をする – 勘違い、疲れ目、操作間違え、高難易度 – 場合によっては、何度も要求される • 結果、本来の作業がしづらく なっていく
人と作業を管理する 課題 • BIO HAZARD 7 でも 発生することが明らか • RE ENGINE (開発し始め version) – 機能が 足りない・増える・変わる • 目的別に、Macroを使って ボタン を用意
Prefab, Sceneの Setup (手動) 描画Meshに対応するフォルダを作成 小物, 部屋 毎に フォルダの場所・命名規則 ルールに従って Prefab / Scene Asset 作成 GameObject・Component・パラメータを設定 1 Asset を数分で処理 仕様が変更される度、発生
Prefab, Sceneの Setup (Macro) 描画 Asset Browser 上で Mesh Assetを選択 ボタン を押下 ルールに従い、 フォルダ・Asset作成 / 各種値の設定 / 仕様変更・エラー修正 1 Asset を数秒で処理 仕様変更時は、全体に対して一括処理可
仕様の変更 例 • 当たり判定 アトリビュート 変更 – 属性が 増えた・減った・変わった etc... • 親子階層の変更 – 部屋内で管理する階層 • Master Material 変更 – 状況に応じて、判断する必要がある
不正データの調査 (手動) 対象のAssetを RE ENGINE で開く Editorで開く際に、2秒ほどかかる 解像度、ポリゴン数 などを 手動コピー&ペースト 数時間かけて Excel ファイル を作成 進捗状況調査のために、有識者が定期的に行う
不正データの調査 (Macro) Asset Browser で 調査したい フォルダ を選択 ボタン を押下 Asset情報を計測し、ファイル情報を生成 十数秒で Excel ファイル を作成 進捗管理はもちろん、各自で結果の調査が可能
不正データの調査 • 本来は、非クリエイティブな仕事 – 地味な作業 (値のコピー&ペースト) • しかし、有識者 が定期的にやるべき – 得られた状況の分析、仕様への理解 • 有識者 の作業を減らす – 仕様化され、決まりきった作業 = Macroの出番
RE ENGINE での ゲーム開発を支える Macro(Plug-in)機能の紹介 どうやって動いていますか?
プログラマ向けの内容です • 資料の 難易度が上がります – Macro 内部実装について – Macro が社内で浸透するまでの工夫
Macro の 中身 • IronPython – Python 2.7 実行機能 – http://ironpython.net • Avalon Edit – Text Editor – http://avalonedit.net
IronPython • . Net で動作 • 文字列を渡すと、Python 2.7.* として解釈 – Pythonの 標準ライブラリ も提供 • C# で定義した関数を 実行可能 – 必須事項 • 関数が定義されている Module 参照 • 関数の Namespace 解決
Avalon Edit • WPF の Text コントロール • 以下の機能を提供 – – – – Text Highlight 行番号 Code補間 UI Syntax Error 表示
この項目でお話しするのは IronPython
究極的な話 • IronPython を開発環境に組み込めば – 文字列(Python Code) から • C# 関数 を全て呼び出せる • C# Property値 も get / set できる – 但し、namespace を 解決する必要がある
RE ENGINE Macro の機能呼び出し PY Macro Code PY Command Interface C# IronPython C# Command Method C# Tool Functions Macro
なぜ、Interface を挟むか • 全コマンドを 単一 Python モジュールへ – わかり易さを重視 Ex) import engine.cmds as cmds; で全 Macro Command が利用可能 • 全コマンドの 名前解決を保障 – 各種 Tool 機能 (別Module) の仕様変更に耐える – インタプリタ風な 関数をデザイン
Command Interface の役割 PY Macro Code PY Command Interface C# IronPython C# Command Method C# Tool Functions Method の namespace を解決 各Tool の namespace Macro を解決
Command Interface の恩恵 Interfaceさえ知れば 機能が呼び出せる PY Macro Code PY Command Interface C# IronPython C# Command Method C# Tool Functions Macro 機能の詳細を 公開しなくても良い
Interface & Method 例
PY
Command Interface (python engine.cmds)
import Macro.Core.Command as CSharpCommand;
def createGameObject( name = None, parent = None ):
retValue = CSharpCommand.CreateGameObject( name, parent );
return retValue;
#end def
C#
Command Method (C# static method)
[MacroCommand("createGameObject", "GameObjectを新規作成します")]
public static object CreateGameObject(string name = null, object parent = null)
{
// argument check & call tool function…
}
Command Interface • Reference で公開 – 全 Macro Command を網羅 • C# コードから自動生成 – 所詮 Ascii (.py) ファイル • Attribute から Text として出力 • Referenceの Doxygen コードも生成
なぜ、手間をかけるか • 全ては Macro を浸透させる為 – 気軽で すぐに試せる機能 を デザイン Ex) GameObject 作成 コマンド ➢ Scene Assetに? Prefab Assetに? ➢ どの GameObjectの 子供? – 内製 開発環境 の為、Internetでの 事例検索が不可 • 如何に敷居を下げるか
Macro を便利に使っていく為に • 開発者への 理解を訴える – 自ら 現地へ赴き ヒアリング • 簡単な機能なら、その場で実装・コード提供 Ex) Material・Prefabの Setup ならば 20分程度 • 口頭での、仕様・実装の相談も – Reference・Editor 機能のPR • 不足の Macro Command は 随時 RE ENGINE へ追加 – おおよそ、 半日~5日 で提供
今回の まとめ • IronPython はとても便利 – C# 実装環境へ導入すると、生産性を向上させる • 困ったときに、機能を追加・配布できる – 後で発覚した課題に、一石を投じることが可能 • そのためには、水面下の活動が必要 – ヒアリング・ドキュメント・Commandデザイン
何かご質問はありますか? • スライドの振り返り Macro ってなんですか? • RE ENGINE 上のPlug-in機構 • 簡単に、Tool機能を一括呼出し・配布できる どうして必要ですか? • RE ENGINEを ビルドせずに機能を追加 • ゲーム毎の環境に合わせた機能を後付け どんな時に使いますか? • たくさん存在する担当者の作業を固める • 仕様が固まった作業と、物量を捌く • IronPython, Avalon Editを利用 どうやって動いていますか? • コマンド情報を開発者に広く公開している
ご清聴ありがとうございました
質疑応答用資料 • Macroが対応する • データ構造について UIについて
Macroが対応する UIについて • Macro的な処理を行うため – 最低限のUI機能を独自提供 • 内部は WPFのView を動的に作成している • IronPython自体も WPF機能 を持つ – しかし、実装を間違えるとRE ENGINEがClash • RE ENGINE 自体がWPFを利用している為?
UI Sample # -*- coding: utf-8 -*import engine.cmds as cmds def onButton(btn): print 'Hello CEDEC' w = cmds.window( 'Self Introduction', 640, 480 ) cmds.label( 'CEDEC 2017' ) cmds.textBox( 'Yuki Sekino' ) cmds.checkBox( 'Is First Presentation', True ) btn = cmds.button( 'Say Hello' ) btn.Click = onButton btn.ToolTip = 'こんにちわ~' cmds.frameLayout( 'More Info' ) cmds.listBox( ['CAPCOM', 'Tech Section', 'Programmer'] ) cmds.setParent( w ) cmds.rowLayout() cmds.label( 'Game Engine', 120 ) c = cmds.comboBox( ['RE ENGINE', 'MT FRAMEWORK'], 500 ) c.SelectedIndex = 0 cmds.showWindow( w )
データ構造について • RE ENGINEのToolは、WPFで作成されている – デザインパターンはMVVM (Model-ViewModel-View) – Macroは、専用のViewModelを介して、Modelを編集する • 詳細は、以下を参照 [CEDEC 2015]いまどきのゲーム制作環境: エディター群とそのバックエンド、開発スタッフ間のコミュニケーションの具体的な方法解説 http://cedec.cesa.or.jp/2015/session/ENG/3250.html
Macro MVVM Macro View Model Model Macro View
Macro ViewModel - Model C# DynamicObject Macro View Model Model Define: Override: Name(str), Type(str), Properties(list) TrySetMember, TryGetMember Any Tool Object Exapmle: Asset, GameObject, Component, Behavior, State Machine Node etc…
Macro ViewModel go = cmds.createGameObject( ‘Hello Cedec 2017’ ); go (View Model) この “go” は、今こんな感じ GameObject (Model)
Invoke TryGetMember go = cmds.createGameObject( ‘Hello Cedec 2017’ ); Access To Property @Model print go.Update Invoke TryGetMember( “Update” ) Return Update Value go (View Model) GameObject (Model)
Macro Properties go = cmds.createGameObject( ‘Hello Cedec 2017’ ); Access All Property @Model print go.Properties go (View Model) Return Property List GameObject (Model)
Macro Property @ RE ENGINE • Propertyの一覧表示 – 名前 – 現在値 –型 • XSI SDK Explorer 風