SlideShare a Scribd company logo
1 of 33
By Max Neet Games
 技術面では適当で汚い実装が多いので、
参考にすべきかは微妙な感じです。
(なら何故公開する!?)
 このスライドの内容は過去作やブログで
解説した事はあまり載せていませんので、
良ければそちらも参照ください。
 Farm Fury! 技術資料
 幽霊の棲む家技術資料
 Max Neet Gamesについて
 ゲーム紹介
 開発環境
 技術解説
 使用アセット一覧
 Max Neet Games
 (訳: Hatarakitakunai-De-Gozaruuuu!!)
 活動概要
 まったりとゲーム作ってます。きっと、多分、恐らく
 作ったゲームの資料も公開していく予定
 ホームページ
 http://maxneet.web.fc2.com/
 メンバー
 大熊猫 : プログラム、エゴサーチ、惰眠担当
 まる : アート、雑用担当
 プラットフォーム:Windows
 プレイ人数 : 2~4人
 ジャンル: 対戦アクション
 想定プレイ時間: 1試合35~125秒
 コントローラー必須
 ゲームエンジン
 Unity5
 ファイル管理
 Dropbox上にsvnのリポジトリ作成し、Dropbox
のフォルダを共有
 コントローラー必須と割り切ったので、基本はXBOXコント
ローラー基準
 基準にしているだけで他でも動きます
 下記の物を改良しました
 http://deciduousgames.blogspot.jp/2013/05/xbox-controller-input-
wrapper-for-unity.html
 改良点は主にXNAに近づける感じです(改悪の可能性有り)
 コントローラーの各ボタンのenumを定義し、ゲームの入力
状態を保持する構造体(GamepadState)に各状態を保持する
 Dictionary<GamePad.Button, bool> で各ボタン(スティックの向
きを含む)
 各スティックの状態も保持
 前のスライドを元に、入力管理クラスを作成
 コントローラー4つを基準とし、各GamePadStateの
現在のフレームと、前のフレームの状態を保持する
 毎フレーム更新します
 上記の状態を元に入力確認を行っております。
 押されているか、このフレームに押されたか、離されたか
 入力管理を別に作成したのはスティック方向も入力し
たフレームだけを確認したかったり、実装してません
がリピート入力も出来る様にしたかったからです。
 ついでにリプレイでも使える様にしたかったからです。
 キャラに各キーのアサインを設定するコ
ンポーネントをアタッチしてます
 コントローラーのインデックスも設定
 中で入力可能なボタンの種類も定義して
います。
public enumType
{
Kick,
Grab,
Special,
}
publicGamePad.Index Controller = GamePad.Index.One;
publicGamePad.Axis Move = GamePad.Axis.LeftStick;
publicGamePad.Button KickButton = GamePad.Button.A;
publicGamePad.Button GrabButton = GamePad.Button.B;
publicGamePad.Button SpecialButton = GamePad.Button.Y;
If ( InputManager.Instance.IsPressed(
InputSettings.Controller,
InputSettings.KickButton
)
)
{
// …処理
}
 やる事としては、前のスライドで紹介した
入力設定(InputSetting)に入る値を設定する
 確認方法はコントローラーに入力が有るかを確認
 有った場合は同じボタンが使われているか確認
 使われていた場合、今設定しているボタンにアサ
インされているボタンと交換する
 無かったらそのまま設定
 キーコンフィグを抜けたらセーブしています。
 セーブには通常のPlayerPrefを使用
 ゲーム開始時にセーブデータの設定を読み込んでます
 基本的にUnityのBoxCollider2Dと
Rigid Body2Dを使っています。
 キャラには自身と子オブジェクトにコライ
ダーを付けてます。
 自身はブロックや他のキャラ等の当たり、
子オブジェクトにはステージの壁だけに対
する当たりを付けています。
 壁の当たりを別にしているのはキャラの当
たりだと、体の上の方で移動が停止してし
まうからです。
 子オブジェクトは別のレイヤー設定にし、
プロジェクト設定で当たりの確認を壁以外
とはしない様にしています。
 ブロックが他のブロックとぶつかった時に、
爆発するかの確認を行っています。
 処理としては、そのブロックの周りに接触し
ているブロックがあるか確認。
 同じ確認処理を接触しているブロックにし、
それを繰り返す。
 接触したブロックをリストに保存し、それが
一定数(3個)を超えた場合、それらを爆発
させます。
 接触ブロックの確認には
Physics2D.OverlapAreaAll()を使用。
 ブロックを専用のレイヤー設定にし、他
のオブジェクトは確認しない様にしてま
す。
 その中で同じ種類のブロックのみ接触リ
ストに追加
public void SearchCollidingBlocks(Block currentBolck, BlockType chainBlockType, ref List<GameObject> chainList)
{
Vector3 adjustments = newVector3(0.1f, 0.1f, 0.0f);
BoxCollider2D collider = currentBolck.GetComponent<BoxCollider2D>();
Collider2D[] colliders = Physics2D.OverlapAreaAll(collider.bounds.min - adjustments, collider.bounds.max + adjustments, m_layer);
if (colliders == null || colliders.Length <= 0)
{
// 周りにブロックが無い
return;
}
List<Block> toAdd = new List<Block>();
int count = colliders.Length;
for (int i = 0; i < count; ++i)
{
Block block = colliders[i].GetComponent<Block>();
if (block == null
|| chainList.Contains(block.gameObject)
|| toAdd.Contains(block)
)
{
continue;
}
if ( block.Type != chainBlockType )
{
// 連鎖出来ない
continue;
}
toAdd.Add(block);
chainList.Add(block.gameObject);
}
 接触リストを追加した後は確認処理を再
帰的に繰り返す
int count = toAdd.Count;
for (int i = 0; i < count; ++i)
{
SearchCollidingBlocks(toAdd[i], chainBlockType, ref chainList);
}
}
 検索が終わったら実際に爆発させます
(検索処理呼び出し元)
public void CheckChain()
{
List<GameObject> chainList = new List<GameObject>();
chainList.Add(gameObject);
SearchCollidingBlocks(this, Type, ref chainList);
m_chainCount = chainList.Count;
if (IsChain(m_chainCount))
{
for (int i = 0; i < chainList.Count; ++i)
{
chainList[i].GetComponent<Block>().StartExplode();
}
chainList.Clear();
}
}
 主に展示用に実装しました
 デジゲー博では不具合が出て使えませんでしたが・・・
 なので、最適化とかはまったく考えてない作り
 保存している情報
 毎フレーム入力状態を保存
 ブロックの生成時に位置情報を保存
 試合設定と人数(キャラを含め)を保存
 ファイルがそこそこ大きくなるので、保存は別にスレッドを作って
行っています。
 書き込みはC#のSystem.IO周りの物を使って実装
 再生時の処理
 キャラと試合設定を記録から指定
 入力確認処理の戻り値を記録した物に変更する
 ブロック生成時の位置指定を記録した物に変更する
 入力処理の上書き
private void UpdateCurrentState(int index)
{
if (Utility.IsPlayBack)
{
// リプレイ時
m_currentPadState[index] = BattleRecorder.Instance.GetPadState(index);
}
else
{
m_currentPadState[index] = GamePad.GetState((GamePad.Index)index + 1);
}
}
 uGui + UniRxで実装
 UniRxは試しに使ってみただけだったりしま
す・・・
 キャラにReactiveProperty<float>を保持さ
せ、ゲージからSubscribe()を呼んでゲージ
更新処理を登録しています。
 ゲージにキャラの番号情報が有るので、そ
れを元に登録
 これでキャラの情報が変わったらゲージ更
新処理が呼ばれます。
 ゲージの表示にはスライダーを使用して
います
 上記で追加したゲージ更新処理で
Slider.Valueを設定しています
 Valueは0~1なので、現在の値/最大値の答
えを割り当てています
 基本スクリプトでごり押し!
 移動はiTweenで実装、色は自前
 色の変更をする方法が分からなかったので、
自作のTween処理で行いました
 毎回書くのは面倒なので、基本は似たパ
ターンを使うようにし、ある程度パラ
メーター弄って調整出来る様に実装
 位置やスケールは自動で反映されますが、色
は子オブジェクトに反映されない為、画像と
不一致になります。
 解決策としては、アニメーションするオブ
ジェクトに描画する子オブジェクトへの参照
を持たせ、それらもアニメーションさせる
 ImageやTextはUnityEngine.UI.Graphic継承し
ているので、Graphicを探し、保持します
protectedTweener<Color> m_colourTweener;
protected UnityEngine.UI.Graphic[] m_childUIElements;
private void FindAllChildUI()
{
m_childUIElements = GetComponentsInChildren<UnityEngine.UI.Graphic>();
}
void Update()
{
if (m_colourTweener.IsActive)
{
m_colourTweener.Update(Time.deltaTime);
UpdateColour();
}
}
protected override void UpdateChildColour()
{
int length = m_childUIElements.Length;
for (int i = 0; i < length; ++i)
{
m_childUIElements[i].color = m_colourTweener.CurrentValue;
}
}
 スクリプト
 iTween
 UniRx - Reactive Extensions for Unity
 エフェクト:
 Cartoon FX Pack
 Cartoon FX Pack2
 BGM:
 Game Music Pack – SUITE
 Tadashii Kamen noTsukaikata OST
 ボイス:
 ActionVoice Pack - NamiVol.1
 ActionVoice Pack - NadeshicoVol.1

More Related Content

What's hot

週末プログラミングで作るカジュアルゲーム~シューティング編~
週末プログラミングで作るカジュアルゲーム~シューティング編~週末プログラミングで作るカジュアルゲーム~シューティング編~
週末プログラミングで作るカジュアルゲーム~シューティング編~Nohina Hidenari
 
週末プログラミングで作るカジュアルゲーム~レーシング編~
週末プログラミングで作るカジュアルゲーム~レーシング編~週末プログラミングで作るカジュアルゲーム~レーシング編~
週末プログラミングで作るカジュアルゲーム~レーシング編~Nohina Hidenari
 
Unity study2018_1
Unity study2018_1Unity study2018_1
Unity study2018_1karakuridoh
 
㉕cocos2dを覚えよう!初級編③
㉕cocos2dを覚えよう!初級編③㉕cocos2dを覚えよう!初級編③
㉕cocos2dを覚えよう!初級編③Nishida Kansuke
 
jgforce向け?のゲーム素材についての検討資料
jgforce向け?のゲーム素材についての検討資料jgforce向け?のゲーム素材についての検討資料
jgforce向け?のゲーム素材についての検討資料Toyokazu Tsugehara
 
㉖cocos2dを覚えよう!
㉖cocos2dを覚えよう!㉖cocos2dを覚えよう!
㉖cocos2dを覚えよう!Nishida Kansuke
 
人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624Kosuke Shinoda
 
物件導向程式設計實習成果報告
物件導向程式設計實習成果報告物件導向程式設計實習成果報告
物件導向程式設計實習成果報告Amo Wu
 
実験心理学者のためのPython
実験心理学者のためのPython実験心理学者のためのPython
実験心理学者のためのPythonMasataka Miyoshi
 
Osakijs #01 「enchant.jsハンズオン資料」
Osakijs #01 「enchant.jsハンズオン資料」Osakijs #01 「enchant.jsハンズオン資料」
Osakijs #01 「enchant.jsハンズオン資料」Yusuke HIDESHIMA
 
Summer camp2019 group2
Summer camp2019 group2Summer camp2019 group2
Summer camp2019 group2openrtm
 
RancherがみつめるAWX 〜お前のコンテナ、息してるの?〜
RancherがみつめるAWX 〜お前のコンテナ、息してるの?〜RancherがみつめるAWX 〜お前のコンテナ、息してるの?〜
RancherがみつめるAWX 〜お前のコンテナ、息してるの?〜Masataka Tsukamoto
 
ラクガキ忍者制作秘話
ラクガキ忍者制作秘話ラクガキ忍者制作秘話
ラクガキ忍者制作秘話koppepan
 
Summercamp2020 group3
Summercamp2020 group3Summercamp2020 group3
Summercamp2020 group3openrtm
 
プログラミング講座
プログラミング講座プログラミング講座
プログラミング講座Yu Yu
 
Rancherで作る お手軽コンテナ運用環境!! ~ Kubenetes牧場でコンテナ牛を飼おう!~
Rancherで作る お手軽コンテナ運用環境!! ~ Kubenetes牧場でコンテナ牛を飼おう!~Rancherで作る お手軽コンテナ運用環境!! ~ Kubenetes牧場でコンテナ牛を飼おう!~
Rancherで作る お手軽コンテナ運用環境!! ~ Kubenetes牧場でコンテナ牛を飼おう!~Masataka Tsukamoto
 
Summer camp2018 group2
Summer camp2018 group2Summer camp2018 group2
Summer camp2018 group2openrtm
 
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説Unity Technologies Japan K.K.
 

What's hot (20)

Aiwolfseminar2020
Aiwolfseminar2020Aiwolfseminar2020
Aiwolfseminar2020
 
週末プログラミングで作るカジュアルゲーム~シューティング編~
週末プログラミングで作るカジュアルゲーム~シューティング編~週末プログラミングで作るカジュアルゲーム~シューティング編~
週末プログラミングで作るカジュアルゲーム~シューティング編~
 
週末プログラミングで作るカジュアルゲーム~レーシング編~
週末プログラミングで作るカジュアルゲーム~レーシング編~週末プログラミングで作るカジュアルゲーム~レーシング編~
週末プログラミングで作るカジュアルゲーム~レーシング編~
 
Unity study2018_1
Unity study2018_1Unity study2018_1
Unity study2018_1
 
㉕cocos2dを覚えよう!初級編③
㉕cocos2dを覚えよう!初級編③㉕cocos2dを覚えよう!初級編③
㉕cocos2dを覚えよう!初級編③
 
jgforce向け?のゲーム素材についての検討資料
jgforce向け?のゲーム素材についての検討資料jgforce向け?のゲーム素材についての検討資料
jgforce向け?のゲーム素材についての検討資料
 
㉖cocos2dを覚えよう!
㉖cocos2dを覚えよう!㉖cocos2dを覚えよう!
㉖cocos2dを覚えよう!
 
人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624人狼知能セミナー資料案20170624
人狼知能セミナー資料案20170624
 
物件導向程式設計實習成果報告
物件導向程式設計實習成果報告物件導向程式設計實習成果報告
物件導向程式設計實習成果報告
 
実験心理学者のためのPython
実験心理学者のためのPython実験心理学者のためのPython
実験心理学者のためのPython
 
Osakijs #01 「enchant.jsハンズオン資料」
Osakijs #01 「enchant.jsハンズオン資料」Osakijs #01 「enchant.jsハンズオン資料」
Osakijs #01 「enchant.jsハンズオン資料」
 
Summer camp2019 group2
Summer camp2019 group2Summer camp2019 group2
Summer camp2019 group2
 
RancherがみつめるAWX 〜お前のコンテナ、息してるの?〜
RancherがみつめるAWX 〜お前のコンテナ、息してるの?〜RancherがみつめるAWX 〜お前のコンテナ、息してるの?〜
RancherがみつめるAWX 〜お前のコンテナ、息してるの?〜
 
ラクガキ忍者制作秘話
ラクガキ忍者制作秘話ラクガキ忍者制作秘話
ラクガキ忍者制作秘話
 
Summercamp2020 group3
Summercamp2020 group3Summercamp2020 group3
Summercamp2020 group3
 
プログラミング講座
プログラミング講座プログラミング講座
プログラミング講座
 
Rancherで作る お手軽コンテナ運用環境!! ~ Kubenetes牧場でコンテナ牛を飼おう!~
Rancherで作る お手軽コンテナ運用環境!! ~ Kubenetes牧場でコンテナ牛を飼おう!~Rancherで作る お手軽コンテナ運用環境!! ~ Kubenetes牧場でコンテナ牛を飼おう!~
Rancherで作る お手軽コンテナ運用環境!! ~ Kubenetes牧場でコンテナ牛を飼おう!~
 
Summer camp2018 group2
Summer camp2018 group2Summer camp2018 group2
Summer camp2018 group2
 
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
 
Minecraft remodeling method
Minecraft remodeling methodMinecraft remodeling method
Minecraft remodeling method
 

More from MaxNeetGames

Oculus GoでLAMさんのキャラを7+1人出そうとした話(東京クロノス)
Oculus GoでLAMさんのキャラを7+1人出そうとした話(東京クロノス)Oculus GoでLAMさんのキャラを7+1人出そうとした話(東京クロノス)
Oculus GoでLAMさんのキャラを7+1人出そうとした話(東京クロノス)MaxNeetGames
 
東京クロノスをQuestストア対応した話
東京クロノスをQuestストア対応した話東京クロノスをQuestストア対応した話
東京クロノスをQuestストア対応した話MaxNeetGames
 
東京クロノスサウンドの話 Part2
東京クロノスサウンドの話 Part2東京クロノスサウンドの話 Part2
東京クロノスサウンドの話 Part2MaxNeetGames
 
東京クロノスサウンドの話 Part1 - Bgm編
東京クロノスサウンドの話 Part1 - Bgm編東京クロノスサウンドの話 Part1 - Bgm編
東京クロノスサウンドの話 Part1 - Bgm編MaxNeetGames
 
Mixmatching Mobile VR and Board game
Mixmatching Mobile VR and Board gameMixmatching Mobile VR and Board game
Mixmatching Mobile VR and Board gameMaxNeetGames
 
東京クロノスで製作中のエディターの紹介
東京クロノスで製作中のエディターの紹介東京クロノスで製作中のエディターの紹介
東京クロノスで製作中のエディターの紹介MaxNeetGames
 
プレイテストについて
プレイテストについてプレイテストについて
プレイテストについてMaxNeetGames
 
時代遅れと言われようとMdaフレームワークの紹介
時代遅れと言われようとMdaフレームワークの紹介時代遅れと言われようとMdaフレームワークの紹介
時代遅れと言われようとMdaフレームワークの紹介MaxNeetGames
 
ここが大変だYo !デジタル&アナログゲームの融合
ここが大変だYo !デジタル&アナログゲームの融合ここが大変だYo !デジタル&アナログゲームの融合
ここが大変だYo !デジタル&アナログゲームの融合MaxNeetGames
 
スマホVr向けに電子書籍ノベルゲームを作ってみた話
スマホVr向けに電子書籍ノベルゲームを作ってみた話スマホVr向けに電子書籍ノベルゲームを作ってみた話
スマホVr向けに電子書籍ノベルゲームを作ってみた話MaxNeetGames
 
VRボドゲ実装の話
VRボドゲ実装の話VRボドゲ実装の話
VRボドゲ実装の話MaxNeetGames
 
幽霊の棲む家紹介
幽霊の棲む家紹介幽霊の棲む家紹介
幽霊の棲む家紹介MaxNeetGames
 
FarmFury! 技術資料
FarmFury! 技術資料FarmFury! 技術資料
FarmFury! 技術資料MaxNeetGames
 

More from MaxNeetGames (13)

Oculus GoでLAMさんのキャラを7+1人出そうとした話(東京クロノス)
Oculus GoでLAMさんのキャラを7+1人出そうとした話(東京クロノス)Oculus GoでLAMさんのキャラを7+1人出そうとした話(東京クロノス)
Oculus GoでLAMさんのキャラを7+1人出そうとした話(東京クロノス)
 
東京クロノスをQuestストア対応した話
東京クロノスをQuestストア対応した話東京クロノスをQuestストア対応した話
東京クロノスをQuestストア対応した話
 
東京クロノスサウンドの話 Part2
東京クロノスサウンドの話 Part2東京クロノスサウンドの話 Part2
東京クロノスサウンドの話 Part2
 
東京クロノスサウンドの話 Part1 - Bgm編
東京クロノスサウンドの話 Part1 - Bgm編東京クロノスサウンドの話 Part1 - Bgm編
東京クロノスサウンドの話 Part1 - Bgm編
 
Mixmatching Mobile VR and Board game
Mixmatching Mobile VR and Board gameMixmatching Mobile VR and Board game
Mixmatching Mobile VR and Board game
 
東京クロノスで製作中のエディターの紹介
東京クロノスで製作中のエディターの紹介東京クロノスで製作中のエディターの紹介
東京クロノスで製作中のエディターの紹介
 
プレイテストについて
プレイテストについてプレイテストについて
プレイテストについて
 
時代遅れと言われようとMdaフレームワークの紹介
時代遅れと言われようとMdaフレームワークの紹介時代遅れと言われようとMdaフレームワークの紹介
時代遅れと言われようとMdaフレームワークの紹介
 
ここが大変だYo !デジタル&アナログゲームの融合
ここが大変だYo !デジタル&アナログゲームの融合ここが大変だYo !デジタル&アナログゲームの融合
ここが大変だYo !デジタル&アナログゲームの融合
 
スマホVr向けに電子書籍ノベルゲームを作ってみた話
スマホVr向けに電子書籍ノベルゲームを作ってみた話スマホVr向けに電子書籍ノベルゲームを作ってみた話
スマホVr向けに電子書籍ノベルゲームを作ってみた話
 
VRボドゲ実装の話
VRボドゲ実装の話VRボドゲ実装の話
VRボドゲ実装の話
 
幽霊の棲む家紹介
幽霊の棲む家紹介幽霊の棲む家紹介
幽霊の棲む家紹介
 
FarmFury! 技術資料
FarmFury! 技術資料FarmFury! 技術資料
FarmFury! 技術資料
 

ブロックバスター制作資料