Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
宴はいいぞ
Search
いも
July 31, 2020
Programming
0
1.5k
宴はいいぞ
yokohama.unity #4 でのLT資料です
いも
July 31, 2020
Tweet
Share
More Decks by いも
See All by いも
UnityプログラミングバイブルR6号宣伝&Unity Logging小話
adarapata
0
500
Unityテスト活動のふりかえり
adarapata
1
560
Gather.townはいいぞ その後
adarapata
1
1.6k
Unityでの開発事例
adarapata
3
22k
どこのご家庭にもあるシーンマネージャーの話
adarapata
1
7.9k
Gather.townはいいぞ
adarapata
2
2.4k
わかった気になるモブプログラミング
adarapata
1
110
モブワークっぽいのをやっている話/Trying mobwork
adarapata
2
1.2k
Zenjectを導入する前に
adarapata
0
3.9k
Other Decks in Programming
See All in Programming
UPDATEがシステムを複雑にする? イミュータブルデータモデルのすすめ
shimomura
0
400
TypeScript LSP の今までとこれから
quramy
1
270
コード書くの好きな人向けAIコーディング活用tips #orestudy
77web
3
210
プロダクト開発でも使おう 関数のオーバーロード
yoiwamoto
0
110
『Python → TypeScript』オンボーディング奮闘記
takumi_tatsuno
1
150
Cursor Meetup Tokyo ゲノミクスとCursor: 進化と制約のあいだ
koido
2
820
Agent Rules as Domain Parser
yodakeisuke
1
410
インターフェース設計のコツとツボ
togishima
2
650
Perlで痩せる
yuukis
1
670
ワンバイナリWebサービスのススメ
mackee
10
7.6k
JVM の仕組みを理解して PHP で実装してみよう
m3m0r7
PRO
1
260
漸進。
ssssota
0
1.5k
Featured
See All Featured
Gamification - CAS2011
davidbonilla
81
5.3k
Being A Developer After 40
akosma
91
590k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.7k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Navigating Team Friction
lara
186
15k
Why Our Code Smells
bkeepers
PRO
337
57k
Designing for Performance
lara
608
69k
[RailsConf 2023] Rails as a piece of cake
palkan
55
5.6k
How to train your dragon (web standard)
notwaldorf
92
6.1k
Bash Introduction
62gerente
614
210k
VelocityConf: Rendering Performance Case Studies
addyosmani
329
24k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
6
640
Transcript
━━━━━━━━━━━━━━━━━ 宴はいいぞ いも(@adarapata) ━━━━━━━━━━━━━━━━━ 2020/07/31 yokohama.unity #4 1
⾃⼰紹介 いも (@adarapata) adarapata.com 仕事でUnity触ってるエンジニア テスト、DIとかよく話すおじさん 最近Godot Engineがアツい 2020/07/31 yokohama.unity
#4 2
宴とは 「ビジュアルノベルをかんたん作成」できる有償アセット 会話テキストの表⽰ キャラ⽴ち絵の設定、表情変更 ⼀枚絵、パーティクルによる演出強化 選択肢による分岐、パラメータ機能 ログ機能 Excelによるシナリオ管理、およびデータ設定 etc... 2020/07/31
yokohama.unity #4 3
公式が最強 https://madnesslabo.net/utage/ 2020/07/31 yokohama.unity #4 4
今⽇話すこと 宴を⾃分のゲームに組み込むときのお話 スクリプトでの実⾏⽅法 アプリケーション -> 宴の連携 宴 -> アプリケーションへの連携 アセット管理の連携
サウンド周りのカスタマイズ 時間⾜りなかった 対象者 ⾃作ゲームの会話パート周り作るのが⾯倒だなと思っている⼈ 2020/07/31 yokohama.unity #4 5
組み込みの話 宴は単体でノベルゲームを作成できるが、⾃分のアプリケーションと 組み合わせて使うこともできる。 https://madnesslabo.net/utage/?page_id=402 ゲーム内の会話シーンとして宴を使う チュートリアル部分だけ使う これを⾏うためにはいくつかスクリプトを書いて、連携処理を⾏う必 要がある。 2020/07/31 yokohama.unity
#4 6
宴で主に登場するScriptableObject 宴に使うシナリオやリソースの定義は全てExcelファイルで⾏う。 Excelファイルが更新されるとImporterが⾛り、ScriptableObjectが⽣ 成or更新される Project: 宴のプロジェクトファイル全体の設定情報を持つ 最上位のファイルなのでExcelから⽣成はされない Scenarios: Chapterファイルの情報を1:Nで持つ Chapter:
「章」に相当する。Bookを1:Nで持つ Book: Excelファイルをパースしたもの。xlsと1:1の関係 Excelファイルは任意の粒度で分割できる 2020/07/31 yokohama.unity #4 7
AdvEngineの起動 スクリプトからの最低限の⼿順は以下の感じ _advEngine = FindObjectOfType<AdvEngine>(); // 初期化 _advEngine.BootFromExportData(scenarioData, "directory/path"); //
シナリオ呼び出し _advEngine.JumpScenario("scenario_name"); // シナリオを読み終えるまで待つ yield return new WaitUntil(_ => _advEngine.IsEndOrPauseScenario); Scenarios.assetをどこかから取ってくればOK 2020/07/31 yokohama.unity #4 8
アプリケーション -> 宴 宴はシナリオ内部でパラメータを定義できる パラメータはシナリオ内で計算したり、タグを使って表⽰することも できる 2020/07/31 yokohama.unity #4 9
このパラメータはスクリプト側からget,setできる advEngine.Param.TrySetParameter("名前", "imo"); advEngine.JumpScenario("test"); プレイヤーの名前とか、レベルとかゲーム側の状況を渡して遊べる 2020/07/31 yokohama.unity #4 10
宴 -> アプリケーション シナリオで打ち込めるコマンドは基本的には宴にしか影響を与えない が、アプリケーション側に影響を与えるようなコマンドを⾃分で作る こともできる GameOver というコマンドはデフォルトでは存在しないが、スクリプト 側でこのコマンドをパースして独⾃の処理を⾏える。 これをカスタムコマンドと呼ぶ。
2020/07/31 yokohama.unity #4 11
カスタムコマンドクラスは AdvCommand を継承させる public class GameOverCommand : AdvCommand { public
GameOverCommand(StringGridRow row) : base(row) { } public override void DoCommand(AdvEngine engine) { // ゲームオーバーにさせる何某 } } コンストラクタはシナリオ読み込みタイミングで呼び出され、実際の コマンド実⾏時に DoCommand が呼ばれる 2020/07/31 yokohama.unity #4 12
パース処理を担う AdvCommandParser にコールバックがある public class CustomCommandManager : MonoBehaviour { private
void Awake() { Utage.AdvCommandParser.OnCreateCustomCommandFromID += OnCreateCustomCommand; } private void OnCreateCustomCommand( string id, StringGridRow row, AdvSettingDataManager datamanager, ref AdvCommand command) { switch (id) { case "GameOver": command = new GameOverCommand(row); break; } } } コマンド名(ID)が取得できるので、⽣成処理を書いていく。 2020/07/31 yokohama.unity #4 13
リソース管理 基本的には3種類 ビルドに含めて Resources.Load (ローカル) 宴側が⽤意しているAssetBundleManagerでロードする Manifestファイル or ⾃前でリスト登録 ⾃作のファイルマネージャーを組み合わせる
宴だけで完結するなら宴側のAssetBundleManager使うと楽。 いい感じのリソースコンバーターも⽤意している。 今回は⾃作のファイルマネージャーを組み合わせる話 2020/07/31 yokohama.unity #4 14
Asset管理周りの登場⼈物 覚えておくべきはこの⼆つ AssetFileBase AssetFileManager 2020/07/31 yokohama.unity #4 15
AssetFileBase ファイル名、種類などアセットの情報を持つ基底クラス アセットをどのようにロードするかを知っている。 具体的には LoadAsync を実装させる 1アセットごとに作られるクラス シートに10個の画像を定義したのなら10個のAssetFileBase デフォルトではこれを継承した AssetFileUtage
のインスタンスが 作られる 2020/07/31 yokohama.unity #4 16
AssetFileManager AssetFileBase を管理するクラス 宴の初期化時にシナリオデータから⾃動でアセットのインスタンス を追加してくれる 基本的にはクラスそのものを叩く必要はない AssetFileBase インスタンスを作る処理をフックできる AssetFileManager.GetCustomLoadManager().OnFindAsset +=
MyFindAsset CustomLoadManagerに噛ませることができる 2020/07/31 yokohama.unity #4 17
噛ませる public class MyFileManager : MonoBehaviour { void Awake() {
// 宴のアセット検索時に⾃前のコールバックを噛ませる AssetFileManager.GetCustomLoadManager().OnFindAsset += FindAsset; } void FindAsset(AssetFileManager mangager, AssetFileInfo fileInfo, IAssetFileSettingData settingData, ref AssetFileBase asset) { switch (fileInfo.FileType) { case AssetFileType.Texture: asset = new MyTexture2DFile(mangager, fileInfo, settingData); } } } 2020/07/31 yokohama.unity #4 18
⾃前の AssetFileBase を継承したクラスを作る public class MyTexture2DFile : AssetFileBase { public
override IEnumerator LoadAsync(System.Action onComplete, System.Action onFailed) { // ⾃前のManagerからアセットを取ってくる何某 yield return InitFromAbManager(); IsLoadEnd = true; onComplete(); } public override bool CheckCacheOrLocal() { return false; } public override void Unload() => IsLoadEnd = false; IEnumerator InitFromAbManager() { // ⾃前のManagerから取ってきて渡す Texture = MyAssetBundleManager.LoadAssetBundle(FileInfo.FileName); } } 2020/07/31 yokohama.unity #4 19
AssetFileBaseのプロパティ Text : テキストアセット Texture : 画像リソース系(キャラクター・背景etc) Sound : ⾳声リソース(Unity
Audio限定) UnityObject : その他シナリオファイルとかパーティクル、3Dモデ ル etc.. 最終的に FileType と⼀致するプロパティにデータが⼊っていれば問題 なく動く・・と思う (FileType == AssetFileType.Texture) なら Texture プロパティがnull でないことを期待している 2020/07/31 yokohama.unity #4 20
そのほか組み込みのいいところ 宴のコードが基本的に拡張前提に作られている コールバックでのフックを⽤意している箇所が多い 継承できるような設計になっている コード⾒れるし最悪システムの差し替えやれないことはない 情報が多い 公式のフォーラムが活発、困ったら⼤体誰かが踏んでる ⾮エンジニアに対しての敷居が低い Excelという馴染みのある武器、構⽂エラーが丁寧に出る コンテンツを作り始めてからが本番だから・・
2020/07/31 yokohama.unity #4 21
まとめ 宴は組み込みができるぞ スクリプトからの実⾏は簡単だよ 宴 <-> アプリケーションの相互連携もできるよ リソース管理を⾃前のManagerと連携もできるよ 宴はいいぞ 2020/07/31 yokohama.unity
#4 22