SlideShare a Scribd company logo
1 of 30
だいふく a.k.a. Daisuke Ohnuma
はじめに
 スライド公開予定です
 LT枠なので気を楽にして聴いてください
 LT枠なので質疑応答は終わってから
 UE4成分そんなに多くないかもしれん
自己紹介
 だいふく a.k.a. Daisuke Ohnuma
 (@dfk_ohnuma)
 社会人2年目
 なのにアラサー
 UE4は仕事では使ってない
 Blog 「大福未来研究所」
 http://dfkfuturelab.hatenablog.com/
 (そろそろ更新しないと)
今回話す内容
 UE4で音楽ゲームを自作した際の
開発・設計事例およびTips
今回話さない内容
 UE4の基礎知識
 音楽の基礎知識
 音ゲー向けの曲の書き方
アジェンダ
 自作音楽ゲームの事例紹介
 コアシステムの仕組み
 譜面データの設計
 音楽ゲームとしての実装
 音楽ゲーム制作時の工夫
 処理負荷の軽減
 処理のタイミング調整
 感想・まとめ
自作音楽ゲームの事例紹介
 実際に見てみてくださいどうぞ
自作音楽ゲームの事例紹介
 6レーン
 ボタンを押すとクラップ音
 曲のテンポは最初から最後まで一定が原
則
自作音楽ゲームの事例紹介
 譜面エディタもUE4で作りました
自作音楽ゲームの事例紹介
 譜面が量産できる、修正できる、
見ながら作れる
 とても大事なこと
 音楽ゲームを作る上で、
譜面エディタは必須
 譜面エディタと本編でデータの遣り取りを
することを想定した譜面データ設計をする
必要性
コアシステムの仕組み
 コアシステム→ 音楽ゲームの必須要素
 譜面読み込み機能
 楽曲情報管理
 入力受付
 ゲームごとにコアシステムを継承して
各機能関数をオーバーライド
 コアシステムを使い回すことができる
コアシステムの仕組み
 譜面データの読み込み
 データテーブル(CSV互換)で譜面データ
を用意
 楽曲情報管理
 曲名、テンポなどの情報を保管
 入力受付
 譜面の判定対応も含む
譜面データの設計
 構造体SequenceDataStruct
 汎用性重視
譜面データの設計
 Command
 コマンド。各行はここに書かれたコマンド
次第で意味が変わる
 StringArg1、Arg2 FloatArg1、Arg2
 引数枠
 様々な音楽ゲームを制作する際に対応でき
るよう
枠を多くしてある
 どれを使っても使わなくてもいい
譜面データの作成例
 コマンドTITLE
 StringArg1:曲名
 StringArg2:サブタイ
 コマンドArtist
 StringArg1:作者名
 StringArg2:サブ作者名
 コマンドBPM
 FloatArg1:曲のテンポ
 FloatArg2:曲のオフセット
(譜面再生開始と曲再生開始のタイミング差)
 コマンドLEVEL
 StringArg1:この譜面がEASYかNORMALかHARDか
 StringArg2:難易度数値
 コマンド欄が数字
 コマンド:何小節目の譜面配置か
 StringArg1:レーン番号
 StringArg2:譜面コード
 その他:ゲームによって用途が変わるはず
音楽ゲームとしての実装
 譜面データ読み込み関数
音楽ゲームとしての実装
 継承先でオーバーライドするのはここだけ
音楽ゲームとしての実装
 音楽的なタイミング
 テンポがいくつで
 何小節目の
 何分音符の何個目なのか
 (例)BPM128、3小節目 3/4
 コンピュータ的なタイミング
 何秒なのか
 これらをお互いに翻訳できるようにする
 →エディタも作りやすくなる
音楽ゲームとしての実装
 譜面オブジェが置かれている時刻
 =「楽曲開始からその小節の頭までの時
間」+「小節の頭からの経過時間」
 楽曲開始からその小節の頭までの時間
 =「1小節にかかる時間」×「小節数」
 =「4分音符1つの時間×4」×「小節数」
 =(60÷「BPM」×4)×「小節数」
 小節の頭からの経過時間
 譜面コードから計算(次ページ)
音楽ゲームとしての実装
 譜面コードのしくみ
 1行で1レーンの1小節分を表現できるように
 実時間(秒)ではなく音楽的な考え方ができる
 コードの文字数=小節の分割数
 1=音符、0=休符
○ 2=ロングノート とかに拡張可
音楽ゲームとしての実装
 譜面コードのしくみ
 例:「1111」
○ 4文字あるので1小節を
4つにわけます
○ 「1」が音符、「0」が休符
として考えると、
4分音符が4つ並んでる
ことになります。
音楽ゲームとしての実装
 譜面コードのしくみ
 例:「10110110」
○ 8文字あるので1小節を
8つにわけます
○ 「1」が音符、「0」が休符
として考えると……
音楽ゲームとしての実装
 小節の頭からの経過時間
=(1小節の時間÷譜面コードの文字数)
×譜面コードの何文字目か
= (60÷「BPM」×4)
÷譜面コードの文字数
×譜面コードの何文字目か
 全部譜面データから引っ張り出せる情報
音楽ゲームとしての実装
 判定の仕組み
 譜面配置時に、譜面オブジェに自身の
「置かれている時刻」を記録する
 楽曲の開始時の時間を記録する
○ 現在時刻-楽曲開始時刻=経過時刻
 入力があったとき、
(経過時刻-オブジェの置かれている時刻)
を計算して絶対値を求める
→数値の範囲を見て判定が決まる
音楽ゲームとしての実装
 判定の仕組み:注意
 あくまでも時間主体で考えること
 見た目で判定を作ってはいけない
○ 速い曲なら判定が厳しい、とかになってしま
う
 当たり判定で判定しないこと
音楽ゲーム製作時の工夫
 処理負荷の軽減
 使えるものは使い回す
 サウンドはすべてAudioComponentで使い回
す
 エフェクトもParticleSystemComponentで使
い回す
 譜面オブジェはオブジェクトプーリングで
使い回す
音楽ゲーム製作時の工夫
 処理負荷の軽減
 オブジェクトプーリング
○ 生成と削除をnew/deleteで行うのではなく
ある程度作っておいたオブジェクトの
Active/非Activeを切り替える形で生成と削除
をしてるように見せかけながらコストを減ら
す
○ 詳しくはググって
音楽ゲーム製作時の工夫
 処理のタイミング調整
 楽曲第一!
 楽曲・譜面再生中はできるだけロード処理をさせ
ない
 譜面読み込み→楽曲読み込み→効果音読み込み
→エフェクト読み込み まで全部完了して、
やっと楽曲開始
 叩いたあとのオブジェもメモリから消すのは曲が
終わってから
まとめ
 音楽ゲームは「ゲーム本編」「譜面エディタ」
両方作れるのがベター
 なのでエディタを作ることを前提とした
譜面データの設計ができるといいですね
 だいたいの音楽ゲームの根っこの仕組みは同じ
 なので自分で作るときは共通部分は使い回せるようにする
といいと思います
 楽曲プレイ中は余計な処理が走れば走るほど
ストレスになる
 なので処理不可の軽減と処理のタイミングについては
考えて実装しましょう
おわり

More Related Content

What's hot

Python製BDDツールで自動化してみた
Python製BDDツールで自動化してみたPython製BDDツールで自動化してみた
Python製BDDツールで自動化してみたKeijiUehata1
 
JuliaTokyo #3 Speech Signal Processing in Julia
JuliaTokyo #3 Speech Signal Processing in JuliaJuliaTokyo #3 Speech Signal Processing in Julia
JuliaTokyo #3 Speech Signal Processing in JuliaRyuichi YAMAMOTO
 
UE4 Grass Interaction
UE4 Grass InteractionUE4 Grass Interaction
UE4 Grass InteractionItsuki Inoue
 
!Utau用 弱音ハクライブラリ
!Utau用 弱音ハクライブラリ!Utau用 弱音ハクライブラリ
!Utau用 弱音ハクライブラリMasahiko Nakamura
 
ダイソーで売ってるアレをアレしてみた
ダイソーで売ってるアレをアレしてみたダイソーで売ってるアレをアレしてみた
ダイソーで売ってるアレをアレしてみたKoichiro Iwao
 
Introducing libpd -Pdをアプリのサウンドエンジンに-
Introducing libpd -Pdをアプリのサウンドエンジンに-Introducing libpd -Pdをアプリのサウンドエンジンに-
Introducing libpd -Pdをアプリのサウンドエンジンに-Yoichi Hirata
 
ライフログ、時系列メモ
ライフログ、時系列メモライフログ、時系列メモ
ライフログ、時系列メモ鉄次 尾形
 
フリー音源でヘヴィーなギターを作る
フリー音源でヘヴィーなギターを作るフリー音源でヘヴィーなギターを作る
フリー音源でヘヴィーなギターを作るMoyashigroove
 
既存サーバを後からAnsibleで構成管理する
既存サーバを後からAnsibleで構成管理する既存サーバを後からAnsibleで構成管理する
既存サーバを後からAnsibleで構成管理するKeijiUehata1
 
プログラム初心者がCocos2d xで ゲームを作った話
プログラム初心者がCocos2d xで ゲームを作った話プログラム初心者がCocos2d xで ゲームを作った話
プログラム初心者がCocos2d xで ゲームを作った話tetu_fs
 
Introduction of diy keyboard
Introduction of diy keyboardIntroduction of diy keyboard
Introduction of diy keyboardHiroshi Higuchi
 
音楽で理解する情報科学のいろは
音楽で理解する情報科学のいろは音楽で理解する情報科学のいろは
音楽で理解する情報科学のいろはkthrlab
 
うでのかい第1回
うでのかい第1回うでのかい第1回
うでのかい第1回拓海 岡本
 
【出張ヒストリア2017】新しいUnreal AudioEngineでインタラクティブサウンドコンテンツはどこまでつくれるか!?
【出張ヒストリア2017】新しいUnreal AudioEngineでインタラクティブサウンドコンテンツはどこまでつくれるか!?【出張ヒストリア2017】新しいUnreal AudioEngineでインタラクティブサウンドコンテンツはどこまでつくれるか!?
【出張ヒストリア2017】新しいUnreal AudioEngineでインタラクティブサウンドコンテンツはどこまでつくれるか!?historia_Inc
 
音ゲーマーの憂鬱
音ゲーマーの憂鬱音ゲーマーの憂鬱
音ゲーマーの憂鬱monochrojazz
 
Traktor sharemeeting2 20120323_touchosc
Traktor sharemeeting2 20120323_touchoscTraktor sharemeeting2 20120323_touchosc
Traktor sharemeeting2 20120323_touchoscmutameso
 

What's hot (17)

Python製BDDツールで自動化してみた
Python製BDDツールで自動化してみたPython製BDDツールで自動化してみた
Python製BDDツールで自動化してみた
 
JuliaTokyo #3 Speech Signal Processing in Julia
JuliaTokyo #3 Speech Signal Processing in JuliaJuliaTokyo #3 Speech Signal Processing in Julia
JuliaTokyo #3 Speech Signal Processing in Julia
 
UE4 Grass Interaction
UE4 Grass InteractionUE4 Grass Interaction
UE4 Grass Interaction
 
!Utau用 弱音ハクライブラリ
!Utau用 弱音ハクライブラリ!Utau用 弱音ハクライブラリ
!Utau用 弱音ハクライブラリ
 
ダイソーで売ってるアレをアレしてみた
ダイソーで売ってるアレをアレしてみたダイソーで売ってるアレをアレしてみた
ダイソーで売ってるアレをアレしてみた
 
Introducing libpd -Pdをアプリのサウンドエンジンに-
Introducing libpd -Pdをアプリのサウンドエンジンに-Introducing libpd -Pdをアプリのサウンドエンジンに-
Introducing libpd -Pdをアプリのサウンドエンジンに-
 
ライフログ、時系列メモ
ライフログ、時系列メモライフログ、時系列メモ
ライフログ、時系列メモ
 
フリー音源でヘヴィーなギターを作る
フリー音源でヘヴィーなギターを作るフリー音源でヘヴィーなギターを作る
フリー音源でヘヴィーなギターを作る
 
既存サーバを後からAnsibleで構成管理する
既存サーバを後からAnsibleで構成管理する既存サーバを後からAnsibleで構成管理する
既存サーバを後からAnsibleで構成管理する
 
プログラム初心者がCocos2d xで ゲームを作った話
プログラム初心者がCocos2d xで ゲームを作った話プログラム初心者がCocos2d xで ゲームを作った話
プログラム初心者がCocos2d xで ゲームを作った話
 
Introduction of diy keyboard
Introduction of diy keyboardIntroduction of diy keyboard
Introduction of diy keyboard
 
音楽で理解する情報科学のいろは
音楽で理解する情報科学のいろは音楽で理解する情報科学のいろは
音楽で理解する情報科学のいろは
 
うでのかい第1回
うでのかい第1回うでのかい第1回
うでのかい第1回
 
【出張ヒストリア2017】新しいUnreal AudioEngineでインタラクティブサウンドコンテンツはどこまでつくれるか!?
【出張ヒストリア2017】新しいUnreal AudioEngineでインタラクティブサウンドコンテンツはどこまでつくれるか!?【出張ヒストリア2017】新しいUnreal AudioEngineでインタラクティブサウンドコンテンツはどこまでつくれるか!?
【出張ヒストリア2017】新しいUnreal AudioEngineでインタラクティブサウンドコンテンツはどこまでつくれるか!?
 
最近の進捗
最近の進捗最近の進捗
最近の進捗
 
音ゲーマーの憂鬱
音ゲーマーの憂鬱音ゲーマーの憂鬱
音ゲーマーの憂鬱
 
Traktor sharemeeting2 20120323_touchosc
Traktor sharemeeting2 20120323_touchoscTraktor sharemeeting2 20120323_touchosc
Traktor sharemeeting2 20120323_touchosc
 

自作音楽ゲームの開発と設計