unityで本格戦国シュミレーションrpg 開発

27
Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Unity ででででで でででででででで RPG でで で 6 で DeNA でででででででで 株株株株株株株 株株株 株株 ・・ Japan 株株株株株株株株株株株株 株株 株株株 株株株株株株株株 株 株株 西 [email protected]

Upload: denastudy

Post on 16-Apr-2017

7.839 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

Unity で本格戦国シュミレーション RPG 開発

第 6 回 DeNA ゲーム開発勉強会

株式会社ディー・エヌ・エーJapan リージョンゲーム事業本部技術・編成部 開発基盤グループ西野 剛平 [email protected]

Page 2: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

自己紹介

Page 3: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

入社前⁃ 電話機の基地局制御装置のプロトコル開発⁃ デバイスドライバの開発⁃ メーカー研究室で画像認識アプリケーショ

ン開発 DeNA 入社後

⁃ mobage での ONE PIECE グランドコレクションの立ち上げ

⁃ エンジニア研修講師⁃ 入力支援 ジェスチャー認識 エンジン開発⁃ 戦魂 リードエンジニア

  C, C++, Java, C#, Perl, ActionScript3 など実務で幅広くプログラミング言語を使用。個人的には C# 3.0 以降が最も好き。比較的後発にあたるだけあって言語設計がしっかりしている。また、クラスを継承のみで拡張していく事への限界を危惧して導入されたジェネリックや拡張メソッドの機構など、 Strict 言語の堅牢性とスクリプトライクの手軽さの両立を実現しているのも好きなポイント。

プログラミング歴

西野 剛平

Page 4: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

どんなゲームか?

Page 5: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

戦魂 – SENTAMA- 戦国時代がモチーフの戦略シミュレーションRPG。プレイヤーは城主となり、武将達を率いて戦国の乱世の統一を目指す。https://www.youtube.com/watch?v=JHXZoIm5gxQ

Page 6: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

 戦場、武将ガチャ、訓練を 繰り返すことで部隊が強化され、 ゲームが進行。

戦場

訓練

武将ガチャ

武将をゲット! 金をゲット!

レベルアップ!

訓練した武将を編成して、戦場へ

ゲットした武将や強化姫を訓練で合成

手に入れた金で武将ガチャをまわす

ゲームの進め方

Page 7: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

開発概要

Page 8: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

戦魂の開発

mobage 連携なしの iOS/Android アプリ

Unity4.6 を使った初の内製大型タイトル

サーバーサイドは Sakasho を利用しクライアント開発に重力を置く

メンバーはネイティブアプリ開発経験者、 mobage サーバー開発経験者、コンソール開発経験者、 Unity 開発経験者、テクニカルデザイナー、未経験新卒の混成チーム

Page 9: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

Native Plugin

アーキテクチャ

Unity 4.6.X

DeAL SakashoSDK

Game

Sakasho

クライアント

サーバー

DnSystemNGUI

WebView, MoviePalayer, その他

Page 10: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

サーバーは Sakasho

Sakasho 、 Sakasho SDK 、 Sakasho GM Tool で構成される

Sakasho  Ruby 製の Game Backend as a Service  (汎用ゲームサーバー)Sakasho SDK ゲームクライアントは、 Sakasho SDK の API を利用して

  Sakasho と対話する。Sakasho GM Tool サーバーの設定や運用のオペレーションは Web 管理ツールから行う

Sakasho について詳しくは、

・第4回ゲーム開発勉強会 Ruby で作る Game Backend as a Servicehttp://www.slideshare.net/dena_study/game-baas

Page 11: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

非同期処理の画一化

アセットバンドル管理

サウンドインテグレート

グラフィック

技術的なところ・・・

Page 12: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

非同期処理の画一化

Page 13: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

Unity における非同期処理 1/2

Unity で重い処理を行うとき、概ね2つの手段が考えられる。

コルーチン⁃ IEnumerator を使い処理全体を複数フレームに跨って行われるよ

う分割する方法。⁃ Unity メインスレッドで処理されるので、 Unity の API が使える。

スレッド⁃ 別のスレッドなので Unity メインスレッドが直接ブロッキングさ

れる事はない。⁃ Unity の API は使えない。

Page 14: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

処理の単位をさらに小分けにし、複数コルーチンの組み合わせで処理全体を構成する場合もある

Unity における非同期処理 2/2

処理 A

処理 B

処理 C

処理 A 処理 B

処理 C

Page 15: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

非同期処理を実行する Job クラス

コルーチン型の Job クラス• IEnumerator を返すコルーチンをラップした Job クラス。コルーチンが終了すると Job が Done とな

る。

スレッド型の Job クラス• ThreadPool で実行させる関数をラップした Job クラス。関数の実行が終了すると Job が Done となる。

結果ありの Job クラス• 結果を指定することができる Job クラス。関数の実行が終了すると Job が Done となる。

IJob job = new AsyncThreadJob(AsyncAction);void AsyncAction(){ // 処理}

IJob job = new Job(Coroutine());IEnumerator Coroutine(){ yield return null;}

IJob job = new ResultfulJob<MyResult>(AsyncAction());MyResult AsyncAction(){ // 処理}

Page 16: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

コンテナ型 Job クラス

Job を直列に実行する Job クラス• Add された順番で Job を実行する。全ての Job が終了した時点で、この Job 自身が Done となる。

Job を並列に実行する Job クラス• Add された Job を同時に実行する。全ての Job が終了した時点で、この Job 自身が Done となる。

SerializeJob job = new SerializeJob();

job.Add( jobA);job.Add( jobB);job.Add( jobC);

// job の実行JobManager.Run(job);

ParallelJob job = new ParallelJob();

job.Add( jobA);job.Add( jobB);job.Add( jobC);

// job の実行JobManager.Run(job);

Page 17: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

アセットバンドル管理

Page 18: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

アセットバンドルのバージョン管理

AssetBundle のバージョン管理⁃ 各 AssetBundle の情報はバージョン管理専用のアセットバンドル

に格納。⁃ バージョン管理専用アセットバンドルでは各 AssetBundle の以下

の情報を保持。⁃ アセットバンドルの名前

⁃ アセットバンドルに含まれる有効なアセットパス

⁃ アセットバンドルの圧縮の有無

⁃ チェックサム(破損のチェックに利用)

⁃ これらの情報とストレージ (キャッシュ ) の状態をチェックする事でダウロードが必要かを判断

⁃ アセットバンドル生成の過程でアセットパスをユニーク化する事で格納元アセットバンドル名を意識しないロードが可能

Page 19: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

アセットバンドル名を意識しないロード

Character001.unity3d⁃ A.png⁃ B.png⁃ C.png

Character002.unity3d⁃ D.png⁃ E.png

Character003.unity3d⁃ F.png⁃ G.png⁃ H.png⁃ I.png

Character004.unity3d⁃ J.png

Resources⁃ A.png⁃ B.png⁃ C.png⁃ D.png⁃ E.png⁃ F.png⁃ G.png⁃ H.png⁃ I.png⁃ J.png

① Resource フォルダ配下に  アセットバンドル化するファイルを格納。

② アセットバンドルが  ほぼ同じサイズになるように  ファイル数を調整しながら自動生成

③ AssetBundleLoader.Load<Texture>(“G.png”); といった具合に格納元のアセットバンドル名は意識せずにロードが可能。

Page 20: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

サウンドインテグレート

Page 21: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

内製のサウンドエンジン DeAL を採用

Unity サウンドシステムを使わなかった理由⁃ Unity にはミキサーなどの概念はなく、戦魂の豪華なサウンド演出

を実現するには機能が足りていない。⁃ Unity サウンドシステムでサポートされている圧縮フォーマットは

mp3 のみのため Ogg ファイルを再生する事ができない。

DeAL を使う理由⁃ Ogg フォーマットに対応しており、ストリームやオンメモリなど

の再生方法が選択可能。⁃ 内製ゲームエンジンの LiftEngine で利用されており、「パズル戦

隊デナレンジャー」としての実績あり。⁃ ミキサーの音量設定や再生チャネルなどは、ゲームロジックとは分離された DeAL プロジェクトファイルとして管理されている。そのため、サウンドデザイナとエンジニアで作業領域を明確に分けることが可能。

※ Unity5 ではサポートされています。

Page 22: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

DeAL のネイティブプラグイン化

DeAL をネイティブプラグインとして組込むための準備⁃ 「マネージコードからアンマネージコードの呼び出しは、 iOS 上

では高負荷です。フレーム毎に複数のネイティブプラグインを呼び出さないでください。」( Unityマニュアルより引用)

⁃ 各 GameObject が DeAL のサウンド再生関数を直接コールするようなアーキテクチャを取る場合ネイティブコールの制御は不可能となってしまう。

⁃ DeAL への関数コールは一旦スタックした後、それらを束ねてマーシャルコピーしネイティブコールを行うような PluginBundler を作成。

マーシャリングコストを削減する必要がある。

そこで・・・

Page 23: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

PluginBundler の概要

Plugin Bundler

GameObject 2GameObject 1 GameObject 3

① SE1再生命令をスタック

Dispatcher

Unity層(Managed層 )

Native層(UnManaged層 )

DeAL

② Voice1再生命令を

スタック

③ SE2再生命令をスタック

Result Pool

④ 3つの命令を束ねてネイティブコール

⑤ SE1, Voice1, SE2 の各再生命令

⑥ SE1, Voice1, SE2 の再生結果をResult Pool に格納

⑦ Result Pool にデータがある場合は取得してコール元の GameObject に通知する。

Page 24: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

グラフィック

Page 25: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

2D Sprite と 法線 + 鏡面強度の map を組み合わせて、ポイントライトによるディティール調整

2D Sprite

法線 + 鏡面強度 map

Page 26: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

ラジアルブラー、カメラシェイクといった臨場感あるバトル表現

ブルーム、リムライティングなどの光の表現

Page 27: Unityで本格戦国シュミレーションRPG 開発

Copyright (C) DeNA Co.,Ltd. All Rights Reserved.

ご静聴ありがとうございました!!

今後とも戦魂をよろしくお願いします!