SlideShare a Scribd company logo
1 of 89
Download to read offline
Lua文化の伝承!?
WFSにおけるイベントスクリプト活用術
〜すべてはより良いコンテンツ制作のために〜
2020/9/18
⻄⽥ 綾佑
西田 綾佑 (Nishida Ryosuke)
WFS / Technical Direction
@hosi_mo
2014年 東京大学大学院 情報理工学系研究科修了
株式会社 WFS
消滅都市 (2014/5/26~)
アナザーエデン (2017/4/12~)
ほか複数
2014年2月21日設立
現在7年目のゲームスタジオ
株式会社 WFS
Lua
プレイ動画
目次
• 既存資産のイベントスクリプトの紹介
• 新たなスクリプトシステムの構築
目次
• 既存資産のイベントスクリプトの紹介
• 新たなスクリプトシステムの構築
フィールド
部屋の中へ移動
バルーンを表示
タップするとプレイヤーのHPを満タンにする
シナリオ
ストーリーNまで到達していたら、
クエスト解放
バトル
特定のボスでHPが一定以上削れたら
特殊ギミック発動 等
デモ
実装を見てみましょう
二度寝
鬼ごっこ
余談
鬼のようなミニゲームスクリプト
製作体制
フィールド シナリオ バトル
- シナリオ演出
- キャラ劇の演出
- フィールド作成 (マップエディタ)
- フィールドギミック組み込み
- フィールドパラメータ調整
- fogや天候調整
- シェーダプログラム調整
- レベルデザイン
- バトルギミック設計
レベルデザインから
実装まで行う
演出から
実装まで行う
フィールドデザインから
実装まで行う
製作体制
チーム内に
イベントスクリプト(Lua)を記述できる人が多数
人によってそれぞれに味わい深いイベントが組まれる
イベントスクリプト
ランタイム(ゲーム)
APIリスト
ランタイムがLuaに公開してるAPI数 500以上
バトル
カメラ制御
フィールドオブジェクト制御
UI
アイテム
サウンド、ムービー
ポストエフェクト
移動
フラグ
- 約 50 API
- 約 30 API
- 約 150 API
- 約 20 API
- 約 10 API
- 約 20 API
- 約 100 API
- 約 30 API
- 約 100 API
スクリプトの規模
リリース時(2017年4月) : 63万行
20170531 709077 +72238
20170630 804724 +95647
20170731 861798 +57074
1年で100万行以上のペース
現在(2020年9月) : 443万行
イベントスクリプトに
最大限の裁量を
目次
• 既存資産のイベントスクリプトの紹介
• 新たなスクリプトシステムの構築
のまえに
反省点
反省点
• 習熟に時間がかかる
• プログラマ向けのインターフェース
• キャラクターと会話するために準備することが多い
• 血塗られたバルオキー
24
キャラクターと会話するためのコード
25
— イベントシーンアクティベート用フラグ
local talk_start = false
— エリアに入ると呼ばれる
local function regist(time)
— フィールドの特定オブジェクトにタッチすると
Object_setTouchCB(
“オブジェクト名”,
function ()
— フラグが上がる
talk_start = true
end
)
end
-- trueを返すとイベントシーン起動
local function activate(time, state)
if state ~= "update" then
return false
end
return talk_start
end
キャラクターと会話するためのコード
26
— イベントシーンアクティベート用フラグ
local talk_start = false
— エリアに入ると呼ばれる
local function regist(time)
— フィールドの特定オブジェクトにタッチすると
Object_setTouchCB(
“オブジェクト名”,
function ()
— フラグが上がる
talk_start = true
end
)
end
-- trueを返すとイベントシーン起動
local function activate(time, state)
if state ~= "update" then
return false
end
return talk_start
end
キャラクターと会話するためのコード
27
— イベントシーンアクティベート用フラグ
local talk_start = false
— エリアに入ると呼ばれる
local function regist(time)
— フィールドの特定オブジェクトにタッチすると
Object_setTouchCB(
“オブジェクト名”,
function ()
— フラグが上がる
talk_start = true
end
)
end
-- trueを返すとイベントシーン起動
local function activate(time, state)
if state ~= "update" then
return false
end
return talk_start
end
キャラクターと会話するためのコード
28
— イベントシーンアクティベート用フラグ
local talk_start = false
— エリアに入ると呼ばれる
local function regist(time)
— フィールドの特定オブジェクトにタッチすると
Object_setTouchCB(
“オブジェクト名”,
function ()
— フラグが上がる
talk_start = true
end
)
end
-- trueを返すとイベントシーン起動
local function activate(time, state)
if state ~= "update" then
return false
end
return talk_start
end
キャラクターと会話するためのコード
29
— イベントシーンアクティベート用フラグ
local talk_start = false
— エリアに入ると呼ばれる
local function regist(time)
— フィールドの特定オブジェクトにタッチすると
Object_setTouchCB(
“オブジェクト名”,
function ()
— フラグが上がる
talk_start = true
end
)
end
-- trueを返すとイベントシーン起動
local function activate(time, state)
if state ~= "update" then
return false
end
return talk_start
end
キャラクターと会話するためのコード
30
キャラクターと会話するためのコード
— イベントシーン開始されたらseqテーブルを実行
local function update(time)
if seq:exec(time) == Enum_SequenceState.FINISH then
return true
end
return false
end
— seqテーブル定義
local seq = Sequence_create("main", funcTable)
— seqテーブル中身
local funcTable = {
CustomSeq_faceTo(label_statue_man, CBO_PARTY1),
CustomSeq_faceTo(CBO_PARTY1, label_statue_man),
Sequence_setDirB(CBO_PARTY1),
Sequence_invoke(
function()
Object_talkWithOptions(
label_statue_man,
[[なあ見ろよ アルド。この石像の
素晴らしさ! まさに人類の英知と
生命の崇高さに感動するね!]],
{talkerDisplayName = "若者"}
)
31
キャラクターと会話するためのコード
— イベントシーン開始されたらseqテーブルを実行
local function update(time)
if seq:exec(time) == Enum_SequenceState.FINISH then
return true
end
return false
end
— seqテーブル定義
local seq = Sequence_create("main", funcTable)
— seqテーブル中身
local funcTable = {
CustomSeq_faceTo(label_statue_man, CBO_PARTY1),
CustomSeq_faceTo(CBO_PARTY1, label_statue_man),
Sequence_setDirB(CBO_PARTY1),
Sequence_invoke(
function()
Object_talkWithOptions(
label_statue_man,
[[なあ見ろよ アルド。この石像の
素晴らしさ! まさに人類の英知と
生命の崇高さに感動するね!]],
{talkerDisplayName = "若者"}
)
わかりましたね
わかりませんね 😷
34
血塗られたバルオキー
--[[
かくれんボーイ イベント
フィーネさらわれている時以外&子供のかくれんぼイベントフラグが1-2の時
、かくれんぼ坊やをアクティベート
]]—
if Common_getGlobalFlag(global_flag_baruoki_kakurenboy) == 1 or
Common_getGlobalFlag(global_flag_baruoki_kakurenboy) == 2 then
if Common_isStoryStepComplete(story_step_story_step_ch1_12) == false or
Common_isStoryStepComplete(story_step_story_step_ch11_1) then
Common_registAreaEvent("kakurenboy", false)
end
end
35
血塗られたバルオキー
--[[
かくれんボーイ イベント
フィーネさらわれている時以外&子供のかくれんぼイベントフラグが1-2の時
、かくれんぼ坊やをアクティベート
]]—
if Common_getGlobalFlag(global_flag_baruoki_kakurenboy) == 1 or
Common_getGlobalFlag(global_flag_baruoki_kakurenboy) == 2 then
if Common_isStoryStepComplete(story_step_story_step_ch1_12) == false or
Common_isStoryStepComplete(story_step_story_step_ch11_1) then
Common_registAreaEvent("kakurenboy", false)
end
end
36
血塗られたバルオキー
--[[
かくれんボーイ イベント
フィーネさらわれている時以外&子供のかくれんぼイベントフラグが1-2の時
、かくれんぼ坊やをアクティベート
]]—
if Common_getGlobalFlag(global_flag_baruoki_kakurenboy) == 1 or
Common_getGlobalFlag(global_flag_baruoki_kakurenboy) == 2 then
if Common_isStoryStepComplete(story_step_story_step_ch1_12) == false or
Common_isStoryStepComplete(story_step_story_step_ch11_1) then
Common_registAreaEvent("kakurenboy", false)
end
end
37
血塗られたバルオキー
目次
• 既存資産のイベントスクリプトの紹介
• 新たなスクリプトシステムの構築
目次
• 既存資産のイベントスクリプトの紹介
• 新たなスクリプトシステムの構築
論点
• アナザーエデンで得た教訓を生かす
• より馴染みやすく
• より書きやすく
• こわくないよ
言い換えると
• 習熟度が低い人でも貢献できる
はじめてスクリプトを書く人でも大丈夫
はじめてスクリプトを書く人でも大丈夫
• 上から順番に実行されるだけの環境
• まずはアドベンチャーパートの制作を例に
44
上から順番に進む記述方法
Log(“はじまり”)
Wait(0.5)
Log(“0.5秒たちました”)
WaitTap()
Log(“タップしましたね”)
Exit()
45
上から順番に進む記述方法
Log(“はじまり”)
Wait(0.5)
Log(“0.5秒たちました”)
WaitTap()
Log(“タップしましたね”)
Exit()
46
上から順番に進む記述方法
Log(“はじまり”)
Wait(0.5)
Log(“0.5秒たちました”)
WaitTap()
Log(“タップしましたね”)
Exit()
47
上から順番に進む記述方法
Log(“はじまり”)
Wait(0.5)
Log(“0.5秒たちました”)
WaitTap()
Log(“タップしましたね”)
Exit()
48
上から順番に進む記述方法
Log(“はじまり”)
Wait(0.5)
Log(“0.5秒たちました”)
WaitTap()
Log(“タップしましたね”)
Exit()
49
上から順番に進む記述方法
Log(“はじまり”)
Wait(0.5)
Log(“0.5秒たちました”)
WaitTap()
Log(“タップしましたね”)
Exit()
50
上から順番に進む記述方法
Log(“はじまり”)
Wait(0.5)
Log(“0.5秒たちました”)
WaitTap()
Log(“タップしましたね”)
Exit()
51
朝のシーン
local aldo = Adv.character("Aldo", "Default")
local fine = Adv.character("Fine", "Default")
-- ADV開始
Adv.talk(“???”, [[起きて]])
Adv.talk(aldo, [[…ん?]])
Adv.talk(fine, [[起きてってば]])
-- 0.5秒まつ
Wait(0.5)
local select = Adv.question([[起きる?]], [[はい|いいえ]])
if select == 0 then
Adv.talk(aldo, [[おはよう]])
elseif select == 1 then
Adv.talk(aldo, [[zzz]])
end
Exit()
52
朝のシーン
local aldo = Adv.character("Aldo", "Default")
local fine = Adv.character("Fine", "Default")
-- ADV開始
Adv.talk(“???”, [[起きて]])
Adv.talk(aldo, [[…ん?]])
Adv.talk(fine, [[起きてってば]])
-- 0.5秒まつ
Wait(0.5)
local select = Adv.question([[起きる?]], [[はい|いいえ]])
if select == 0 then
Adv.talk(aldo, [[おはよう]])
elseif select == 1 then
Adv.talk(aldo, [[zzz]])
end
Exit()
53
朝のシーン
local aldo = Adv.character("Aldo", "Default")
local fine = Adv.character("Fine", "Default")
-- ADV開始
Adv.talk(“???”, [[起きて]])
Adv.talk(aldo, [[…ん?]])
Adv.talk(fine, [[起きてってば]])
-- 0.5秒まつ
Wait(0.5)
local select = Adv.question([[起きる?]], [[はい|いいえ]])
if select == 0 then
Adv.talk(aldo, [[おはよう]])
elseif select == 1 then
Adv.talk(aldo, [[zzz]])
end
Exit()
54
朝のシーン
local aldo = Adv.character("Aldo", "Default")
local fine = Adv.character("Fine", "Default")
-- ADV開始
Adv.talk(“???”, [[起きて]])
Adv.talk(aldo, [[…ん?]])
Adv.talk(fine, [[起きてってば]])
-- 0.5秒まつ
Wait(0.5)
local select = Adv.question([[起きる?]], [[はい|いいえ]])
if select == 0 then
Adv.talk(aldo, [[おはよう]])
elseif select == 1 then
Adv.talk(aldo, [[zzz]])
end
Exit()
55
local aldo = Adv.character("Aldo", "Default")
local fine = Adv.character("Fine", "Default")
-- ADV開始
Adv.talk(“???”, [[起きて]])
Adv.talk(aldo, [[…ん?]])
Adv.talk(fine, [[起きてってば]])
-- 0.5秒まつ
Wait(0.5)
local select = Adv.question([[起きる?]], [[はい|いいえ]])
if select == 0 then
Adv.talk(aldo, [[おはよう]])
elseif select == 1 then
Adv.talk(aldo, [[zzz]])
end
Exit()
朝のシーン
56
local aldo = Adv.character("Aldo", "Default")
local fine = Adv.character("Fine", "Default")
-- ADV開始
Adv.talk(“???”, [[起きて]])
Adv.talk(aldo, [[…ん?]])
Adv.talk(fine, [[起きてってば]])
-- 0.5秒まつ
Wait(0.5)
local select = Adv.question([[起きる?]], [[はい|いいえ]])
if select == 0 then
Adv.talk(aldo, [[おはよう]])
elseif select == 1 then
Adv.talk(aldo, [[zzz]])
end
Exit()
朝のシーン
57
local aldo = Adv.character("Aldo", "Default")
local fine = Adv.character("Fine", "Default")
-- ADV開始
Adv.talk(“???”, [[起きて]])
Adv.talk(aldo, [[…ん?]])
Adv.talk(fine, [[起きてってば]])
-- 0.5秒まつ
Wait(0.5)
local select = Adv.question([[起きる?]], [[はい|いいえ]])
if select == 0 then
Adv.talk(aldo, [[おはよう]])
elseif select == 1 then
Adv.talk(aldo, [[zzz]])
end
Exit()
朝のシーン
58
local aldo = Adv.character("Aldo", "Default")
local fine = Adv.character("Fine", "Default")
-- ADV開始
Adv.talk(“???”, [[起きて]])
Adv.talk(aldo, [[…ん?]])
Adv.talk(fine, [[起きてってば]])
-- 0.5秒まつ
Wait(0.5)
local select = Adv.question([[起きる?]], [[はい|いいえ]])
if select == 0 then
Adv.talk(aldo, [[おはよう]])
elseif select == 1 then
Adv.talk(aldo, [[zzz]])
end
Exit()
朝のシーン
59
イベント発火を簡単にする
function init()
TouchEvent("ベッド", function()
-- タッチ後にAdv開始
Yield(“lua/Adv/001.lua“)
end)
end
60
イベント発火を簡単にする
function init()
TouchEvent(“ベッド", function()
-- タッチ後にAdv開始
Yield(“lua/Adv/001.lua“)
end)
end
61
イベント発火を簡単にする
function init()
TouchEvent(“ベッド", function()
-- タッチ後にAdv開始
Yield(“lua/Adv/001.lua“)
end)
end
62
イベント発火を簡単にする
function init()
TouchEvent(“ベッド", function()
-- タッチ後にAdv開始
Yield(“lua/Adv/001.lua“)
end)
end
63
local aldo = Adv.character("Aldo", "Default")
local fine = Adv.character("Fine", "Default")
-- ADV開始
Adv.talk(“???”, [[起きて]])
Adv.talk(aldo, [[…ん?]])
Adv.talk(fine, [[起きてってば]])
-- 0.5秒まつ
Wait(0.5)
local select = Adv.question([[起きる?]], [[はい|いいえ]])
if select == 0 then
Adv.talk(aldo, [[おはよう]])
elseif select == 1 then
Adv.talk(aldo, [[zzz]])
end
Exit()
朝のシーン
64
イベント発火を簡単にする
function init()
TouchEvent("オブジェクト", Sample2)
end
function Sample2()
-- タッチ後の処理
Adv.Talk(“にしだ”, [[はーい]])
Wait(0.5)
Adv.Talk(“にしだ”, [[0.5秒待ったよ]])
end
65
イベント発火を簡単にする
function init()
TouchEvent("オブジェクト", Sample2)
end
function Sample2()
-- タッチ後の処理
Adv.Talk(“にしだ”, [[はーい]])
Wait(0.5)
Adv.Talk(“にしだ”, [[0.5秒待ったよ]])
end
66
イベント発火を簡単にする
function init()
TouchEvent("オブジェクト", Sample2)
end
function Sample2()
-- タッチ後の処理
Adv.Talk(“にしだ”, [[はーい]])
Wait(0.5)
Adv.Talk(“にしだ”, [[0.5秒待ったよ]])
end
こわくないよ
• IDEによるコード保管
• ライブテンプレート
ホットリロード
• ゲーム起動中にShift + RですぐにLuaをリロード
• Unity Editor再生したままでもok
• インポート不要
ジャンプポイント
• ゲーム起動中にescを押すことでDebugPoint()までジャンプ
• 指定の箇所まで読み飛ばして
• 修正した箇所から再生したい
ジャンプ前のコードはすべて正常に動いていることを保証
71
local aldo = Adv.character("Aldo", "Default")
local fine = Adv.character("Fine", "Default")
-- ADV開始
Adv.talk(“???”, [[起きて]])
Adv.talk(aldo, [[…ん?]])
Adv.talk(fine, [[起きてってば]])
-- 0.5秒まつ
Wait(0.5)
local select = Adv.question([[起きる?]], [[はい|いいえ]])
if select == 0 then
Adv.talk(aldo, [[おはよう]])
elseif select == 1 then
Adv.talk(aldo, [[zzz]])
end
Exit()
朝のシーン
72
local aldo = Adv.character("Aldo", "Default")
local fine = Adv.character("Fine", "Default")
-- ADV開始
Adv.talk(“???”, [[起きて]])
Adv.talk(aldo, [[…ん?]])
Adv.talk(fine, [[起きてってば]])
-- 0.5秒まつ
Wait(0.5)
local select = Adv.question([[起きる?]], [[はい|いいえ]])
if select == 0 then
Adv.talk(aldo, [[おはよう]])
elseif select == 1 then
Adv.talk(aldo, [[zzz]])
end
Exit()
朝のシーン
73
local aldo = Adv.character("Aldo", "Default")
local fine = Adv.character("Fine", "Default")
-- ADV開始
Adv.talk(“???”, [[起きて]])
Adv.talk(aldo, [[…ん?]])
Adv.talk(fine, [[起きてってば]])
-- 0.5秒まつ
Wait(0.5)
local select = Adv.question([[起きる?]], [[はい]])
Adv.talk(aldo, [[おはよう]])
Exit()
朝のシーン
74
local aldo = Adv.character("Aldo", "Default")
local fine = Adv.character("Fine", "Default")
-- ADV開始
Adv.talk(“???”, [[起きて]])
Adv.talk(aldo, [[…ん?]])
Adv.talk(fine, [[起きてってば]])
-- 0.5秒まつ
Wait(0.5)
DebugPoint()
local select = Adv.question([[起きる?]], [[はい]])
Adv.talk(aldo, [[おはよう]])
Exit()
朝のシーン
75
local aldo = Adv.character("Aldo", "Default")
local fine = Adv.character("Fine", "Default")
-- ADV開始
Adv.talk(“???”, [[起きて]])
Adv.talk(aldo, [[…ん?]])
Adv.talk(fine, [[起きてってば]])
-- 0.5秒まつ
Wait(0.5)
DebugPoint()
local select = Adv.question([[起きる?]], [[はい]])
Adv.talk(aldo, [[おはよう]])
Exit()
朝のシーン
76
local aldo = Adv.character("Aldo", "Default")
local fine = Adv.character("Fine", "Default")
-- ADV開始
Adv.talk(“???”, [[起きて]])
Adv.talk(aldo, [[…ん?]])
Adv.talk(fine, [[起きてってば]])
-- 0.5秒まつ
Wait(0.5)
DebugPoint()
local select = Adv.question([[起きる?]], [[はい]])
Adv.talk(aldo, [[おはよう]])
Exit()
朝のシーン
こわくないね
• ホットリロード
• ジャンプポイント
Luaのカバー範囲
• アドベンチャーパート
• フィールド演出
• バトル
• メインストーリー
ゲームエンジンとコンテンツ
ゲームエンジン Advパート ギミック
消滅都市 Cocos2d-x Excel なし
アナザーエデン Cocos2d-x Lua Lua
ほか運営中タイトル Cocos2d-x Excel Luaほか
• ほかタイトル群は権利の都合上表示しておりません
x
イベントスクリプト
ランタイム(ゲームシステム)
• アドベンチャーパート
• 立ち絵
• UI
• サウンド
• フィールド
• カメラ制御
• オブジェクト制御
• ポストエフェクト
• バトル
• タイムライン連携
• 会話演出
• メインストーリー
• Scene制御
• ほか
<- 大量のAPI ->
<- 大量のAPI ->
<- 大量のAPI ->
<- 大量のAPI ->
<- 大量のAPI ->
<- 大量のAPI ->
<- 大量のAPI ->
<- 大量のAPI ->
<- 大量のAPI ->
<- 大量のAPI ->
<- 大量のAPI ->
<- 大量のAPI ->
<- 大量のAPI ->
<- 大量のAPI ->
<- 大量のAPI ->
<- 大量のAPI ->
<- 大量のAPI ->
<- 大量のAPI ->
論点
• vs. ビジュアルスクリプティング
www.wfs.games
www.wfs.games
Lua
引き続き、RPG開発に全力で挑みます!
Lua文化の伝承!? WFSにおけるイベントスクリプト活用術〜すべてはより良いコンテンツ制作のために〜

More Related Content

What's hot

ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装infinite_loop
 
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!Unity Technologies Japan K.K.
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
インディーゲーム開発の現状と未来 2021
インディーゲーム開発の現状と未来 2021インディーゲーム開発の現状と未来 2021
インディーゲーム開発の現状と未来 2021Unity Technologies Japan K.K.
 
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計sairoutine
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと信之 岩永
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと増田 亨
 
コンシューマゲーム開発におけるHansoftの活用事例
コンシューマゲーム開発におけるHansoftの活用事例コンシューマゲーム開発におけるHansoftの活用事例
コンシューマゲーム開発におけるHansoftの活用事例Hiroyuki Tanaka
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門torisoup
 
Android向けUnity製ゲーム最適化のためのCI/CDと連携した自動プロファイリングシステム
Android向けUnity製ゲーム最適化のためのCI/CDと連携した自動プロファイリングシステムAndroid向けUnity製ゲーム最適化のためのCI/CDと連携した自動プロファイリングシステム
Android向けUnity製ゲーム最適化のためのCI/CDと連携した自動プロファイリングシステムKLab Inc. / Tech
 
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計増田 亨
 
『禍つヴァールハイト』モバイルにおけるプレイヤー最大100体同時表示可能なグラフィックス最適化について
『禍つヴァールハイト』モバイルにおけるプレイヤー最大100体同時表示可能なグラフィックス最適化について『禍つヴァールハイト』モバイルにおけるプレイヤー最大100体同時表示可能なグラフィックス最適化について
『禍つヴァールハイト』モバイルにおけるプレイヤー最大100体同時表示可能なグラフィックス最適化についてKLab Inc. / Tech
 
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術Unity Technologies Japan K.K.
 
RPGにおけるイベント駆動型の設計と実装
RPGにおけるイベント駆動型の設計と実装RPGにおけるイベント駆動型の設計と実装
RPGにおけるイベント駆動型の設計と実装Koji Morikawa
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...KLab Inc. / Tech
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 

What's hot (20)

ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
インディーゲーム開発の現状と未来 2021
インディーゲーム開発の現状と未来 2021インディーゲーム開発の現状と未来 2021
インディーゲーム開発の現状と未来 2021
 
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
コンシューマゲーム開発におけるHansoftの活用事例
コンシューマゲーム開発におけるHansoftの活用事例コンシューマゲーム開発におけるHansoftの活用事例
コンシューマゲーム開発におけるHansoftの活用事例
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
Android向けUnity製ゲーム最適化のためのCI/CDと連携した自動プロファイリングシステム
Android向けUnity製ゲーム最適化のためのCI/CDと連携した自動プロファイリングシステムAndroid向けUnity製ゲーム最適化のためのCI/CDと連携した自動プロファイリングシステム
Android向けUnity製ゲーム最適化のためのCI/CDと連携した自動プロファイリングシステム
 
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
 
『禍つヴァールハイト』モバイルにおけるプレイヤー最大100体同時表示可能なグラフィックス最適化について
『禍つヴァールハイト』モバイルにおけるプレイヤー最大100体同時表示可能なグラフィックス最適化について『禍つヴァールハイト』モバイルにおけるプレイヤー最大100体同時表示可能なグラフィックス最適化について
『禍つヴァールハイト』モバイルにおけるプレイヤー最大100体同時表示可能なグラフィックス最適化について
 
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
 
RPGにおけるイベント駆動型の設計と実装
RPGにおけるイベント駆動型の設計と実装RPGにおけるイベント駆動型の設計と実装
RPGにおけるイベント駆動型の設計と実装
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 ~『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 

More from gree_tech

アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜gree_tech
 
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介gree_tech
 
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表gree_tech
 
アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~gree_tech
 
長寿なゲーム事業におけるアプリビルドの効率化
長寿なゲーム事業におけるアプリビルドの効率化長寿なゲーム事業におけるアプリビルドの効率化
長寿なゲーム事業におけるアプリビルドの効率化gree_tech
 
Cloud Spanner をより便利にする運用支援ツールの紹介
Cloud Spanner をより便利にする運用支援ツールの紹介Cloud Spanner をより便利にする運用支援ツールの紹介
Cloud Spanner をより便利にする運用支援ツールの紹介gree_tech
 
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介gree_tech
 
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現についてSINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現についてgree_tech
 
海外展開と負荷試験
海外展開と負荷試験海外展開と負荷試験
海外展開と負荷試験gree_tech
 
翻訳QAでのテスト自動化の取り組み
翻訳QAでのテスト自動化の取り組み翻訳QAでのテスト自動化の取り組み
翻訳QAでのテスト自動化の取り組みgree_tech
 
組み込み開発のテストとゲーム開発のテストの違い
組み込み開発のテストとゲーム開発のテストの違い組み込み開発のテストとゲーム開発のテストの違い
組み込み開発のテストとゲーム開発のテストの違いgree_tech
 
サーバーフレームワークに潜んでる脆弱性検知ツール紹介
サーバーフレームワークに潜んでる脆弱性検知ツール紹介サーバーフレームワークに潜んでる脆弱性検知ツール紹介
サーバーフレームワークに潜んでる脆弱性検知ツール紹介gree_tech
 
データエンジニアとアナリストチーム兼務になった件について
データエンジニアとアナリストチーム兼務になった件についてデータエンジニアとアナリストチーム兼務になった件について
データエンジニアとアナリストチーム兼務になった件についてgree_tech
 
シェアドサービスとしてのデータテクノロジー
シェアドサービスとしてのデータテクノロジーシェアドサービスとしてのデータテクノロジー
シェアドサービスとしてのデータテクノロジーgree_tech
 
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-gree_tech
 
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話gree_tech
 
比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)gree_tech
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行gree_tech
 
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜gree_tech
 
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)gree_tech
 

More from gree_tech (20)

アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
アナザーエデンPC版リリースへの道のり 〜WFSにおけるマルチプラットフォーム対応の取り組み〜
 
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
 
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
 
アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~
 
長寿なゲーム事業におけるアプリビルドの効率化
長寿なゲーム事業におけるアプリビルドの効率化長寿なゲーム事業におけるアプリビルドの効率化
長寿なゲーム事業におけるアプリビルドの効率化
 
Cloud Spanner をより便利にする運用支援ツールの紹介
Cloud Spanner をより便利にする運用支援ツールの紹介Cloud Spanner をより便利にする運用支援ツールの紹介
Cloud Spanner をより便利にする運用支援ツールの紹介
 
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
 
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現についてSINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
 
海外展開と負荷試験
海外展開と負荷試験海外展開と負荷試験
海外展開と負荷試験
 
翻訳QAでのテスト自動化の取り組み
翻訳QAでのテスト自動化の取り組み翻訳QAでのテスト自動化の取り組み
翻訳QAでのテスト自動化の取り組み
 
組み込み開発のテストとゲーム開発のテストの違い
組み込み開発のテストとゲーム開発のテストの違い組み込み開発のテストとゲーム開発のテストの違い
組み込み開発のテストとゲーム開発のテストの違い
 
サーバーフレームワークに潜んでる脆弱性検知ツール紹介
サーバーフレームワークに潜んでる脆弱性検知ツール紹介サーバーフレームワークに潜んでる脆弱性検知ツール紹介
サーバーフレームワークに潜んでる脆弱性検知ツール紹介
 
データエンジニアとアナリストチーム兼務になった件について
データエンジニアとアナリストチーム兼務になった件についてデータエンジニアとアナリストチーム兼務になった件について
データエンジニアとアナリストチーム兼務になった件について
 
シェアドサービスとしてのデータテクノロジー
シェアドサービスとしてのデータテクノロジーシェアドサービスとしてのデータテクノロジー
シェアドサービスとしてのデータテクノロジー
 
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
 
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
 
比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
 
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
 
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
 

Lua文化の伝承!? WFSにおけるイベントスクリプト活用術〜すべてはより良いコンテンツ制作のために〜