SlideShare a Scribd company logo
1 of 28
Download to read offline
SUPER MAOU RUN の作り方
誰?
●
@kagematya
●
2D 横スクロールアクション
作ってます
– オレオレエンジン勢
SUPER MAOU RUN とは
●
前作 SUPER MAOU LAND の外伝
●
ランゲーム
– クリック操作
– お手軽感
デモ
●
https://twitter.com/kagematya/status/929421066287562752
制作背景
●
デジ博まであと 1 ヵ月くらいだけど出すもん何
もない (2017/10/07)
– 続編の SUPER MAOU LAND2 は基礎部分の工事中
●
ランゲームなら 1 ヶ月で作れるっしょ!
– デジ博は 2017/11/12
制作体制
●
Unity オレオレエンジンとは・・・
– アニメーションは SpriteStudio
●
絵素材・アニメーションは前作のを使いまわす
– イラストは何枚か新規で描いてもらった
●
プログラムは新規で書く
●
音は泣きながら探す
●
とにかく 1 ヶ月で作りきる
– LAND2 もあるのでこれ以上は時間かけない
地形の作り方
地形の作り方
●
ひとかたまりの地形として作る
地形の作り方
●
「高さと幅を○ブロック」で作れるようにする
– BoxCollider のサイズを書き換える
void ColliderTransform(int gridWidth, int gridHeight){
BoxCollider box = GetComponent<BoxCollider>();
Vector3 size = new Vector3(gridWidth * SMR.GRID_SIZE, gridHeight * SMR.GRID_SIZE, 1);
Vector3 center = new Vector3(size.x * 0.5f, -size.y * 0.5f, 0);
center.x -= SMR.GRID_SIZE_HALF;
center.y += SMR.GRID_SIZE_HALF;
box.size = size;
box.center = center;
}
地形の作り方
●
「高さと幅を○ブロック」で作れるようにする
– BoxCollider のサイズを書き換える
void ColliderTransform(int gridWidth, int gridHeight){
BoxCollider box = GetComponent<BoxCollider>();
Vector3 size = new Vector3(gridWidth * SMR.GRID_SIZE, gridHeight * SMR.GRID_SIZE, 1);
Vector3 center = new Vector3(size.x * 0.5f, -size.y * 0.5f, 0);
center.x -= SMR.GRID_SIZE_HALF;
center.y += SMR.GRID_SIZE_HALF;
box.size = size;
box.center = center;
}
幅 高さ
ブロックサイズを
かけて大きさを出す!
BoxCollider にセットして終了!
地形の作り方
●
ブロックは幅と高さに合わせて並べればおk
– 上辺、右端左端は違うチップにする
●
図のように、 Ground にたくさん
ブロックがぶら下がる
地形の置き方
地形の置き方
●
プレイヤーの手前の座標でチェックする
●
最後に作った地形の右端の座標と比較
地形の置き方
●
この場合は地形右端の方が右にいるので何もし
ない
●
地形の置き方
●
進んでいくと、チェック位置を通り越す
– 地形作る!
地形の置き方
●
地形を置く場所は、 のチェック位置から、○
ブロック幅の距離に置く
– ブロック幅は min ~ max でランダムで決める
敵の作り方
敵の作り方
●
一定距離動いたら、上下の切り替えを行う
– 地面に当たった場合も切り替える
– ブレーキをかけつつ、
パッと切り替わらないようにする
●
「一定距離」は min ~ max でランダム
– これは作ったとき (Instantiate) に決める
動いた距離で上下切り替え!
敵の置き方
●
地形の置き方と同じ
– プレイヤーの手前の座標
– 最後に作った敵の座標
敵の踏み方
●
踏めたか?判定はプレイヤー側の処理に書いた
– プレイヤーの中央 .y と、敵の中央 .y の比較
●
踏めたらジャンプ状態にする
●
踏めなかったら死亡状態にする
敵の踏み方
void OnControllerColliderHit(ControllerColliderHit hit)
{
Mogutarou mog = hit.gameObject.GetComponent<Mogutarou>();
if (mog) {
//モグラとのヒットなのでジャンプか死亡かの判定になる
Vector3 centerPos = CenterPos();
Vector3 mogCenterPos = mog.CenterPos();
if (centerPos.y >= mogCenterPos.y) { //相手の中心よりも高ければ踏んだことにする
ChangeJump();
mog.ChangeDead(); //モグラは死亡する
m_isAttackJump = true;
}
else {
m_deadVec = (Vector3.left + Vector3.up) * 600;
ChangeDead();
}
}
}
●
処理はこんな感じになってた
敵の踏み方
void OnControllerColliderHit(ControllerColliderHit hit)
{
Mogutarou mog = hit.gameObject.GetComponent<Mogutarou>();
if (mog) {
//モグラとのヒットなのでジャンプか死亡かの判定になる
Vector3 centerPos = CenterPos();
Vector3 mogCenterPos = mog.CenterPos();
if (centerPos.y >= mogCenterPos.y) { //相手の中心よりも高ければ踏んだことにする
ChangeJump();
mog.ChangeDead(); //モグラは死亡する
m_isAttackJump = true;
}
else {
m_deadVec = (Vector3.left + Vector3.up) * 600;
ChangeDead();
}
}
}
座標の比較 ( 踏みつけ判定 )
自分はジャンプ状態に。
そしてモグラは殺す
踏みつけ失敗ならこっちに来る。
自分を死亡状態にする
バランスの取り方
●
ゲームの残り時間に合わせて、プレイヤーの速
度を上げていく
– 速度に合わせて、地形と地形の間隔を調整
– 地形の高さのランダム加減も調整
●
プログラムでベタ打ち
– どうせ調整するの俺だし
バランスの取り方
●
こうなってた
void CheckSpeed()
{
float speed = m_mistila.GetBaseSpeed();
//地形の間隔を空ける
if (speed > 400) {
m_objectSpawner.SetGroundGridIntervalMax(6);
}
else if (speed > 300) {
m_objectSpawner.SetGroundGridIntervalMax(5);
}
else if (speed > 200) {
m_objectSpawner.SetGroundGridIntervalMax(4);
}
//地形の段差をつける
if (speed > 340) {
m_objectSpawner.SetGroundGridPosYMinMax(-7, -5);
}
else if(speed > 240) {
m_objectSpawner.SetGroundGridPosYMinMax(-6, -5);
}
}
プレイヤーの速度を取得
バランスの取り方
●
速度に依存させるのではなく、レベルを表す変
数 (0 ~ 1 で変化 ) を用意するべきだった
●
・・・が、とりあえず今回はこれで押し通した
そのほか
●
画面遷移
●
メニュー
●
UI
●
死亡演出
●
ゴール演出
●
音周り
●
etc...
まだまだ
色々ある!
まとめ
●
ランゲームなめてた・・・
– それなりに考えることがある
– バランス調整するためのあれこれ
– 完成させるためのあれこれ
●
スコア表記はあきらめた。一応右上に獲得コインの表記がある
●
でも本気出したので 1 ヶ月でランゲーム作れた!
●
とりあえずイベントに申し込んで締切りを作ろう!

More Related Content

What's hot

Creators'night#4今井
Creators'night#4今井Creators'night#4今井
Creators'night#4今井Daisuke Imai
 
Scene操作系のエディター拡張Util2セット
Scene操作系のエディター拡張Util2セットScene操作系のエディター拡張Util2セット
Scene操作系のエディター拡張Util2セットTakumi Hanzawa
 
NGUIとUnity2Dをつかってみた
NGUIとUnity2DをつかってみたNGUIとUnity2Dをつかってみた
NGUIとUnity2Dをつかってみた優之 田中
 
Google Apps Japan Users Group #32 Members Talk(Lightning Talk)
Google Apps Japan Users Group #32 Members Talk(Lightning Talk)Google Apps Japan Users Group #32 Members Talk(Lightning Talk)
Google Apps Japan Users Group #32 Members Talk(Lightning Talk)Shigechika AIKAWA
 
プログラミングブートキャンプを開催してみた。
プログラミングブートキャンプを開催してみた。プログラミングブートキャンプを開催してみた。
プログラミングブートキャンプを開催してみた。NAKAOKU Takahiro
 
Google Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみたGoogle Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみたShigeki Yamato
 
20130202 unitycreators prefab
20130202 unitycreators prefab20130202 unitycreators prefab
20130202 unitycreators prefabKonabe Kurisaka
 

What's hot (9)

Creators'night#4今井
Creators'night#4今井Creators'night#4今井
Creators'night#4今井
 
Scene操作系のエディター拡張Util2セット
Scene操作系のエディター拡張Util2セットScene操作系のエディター拡張Util2セット
Scene操作系のエディター拡張Util2セット
 
NGUIとUnity2Dをつかってみた
NGUIとUnity2DをつかってみたNGUIとUnity2Dをつかってみた
NGUIとUnity2Dをつかってみた
 
Maverick az. rev01ppt
Maverick az. rev01pptMaverick az. rev01ppt
Maverick az. rev01ppt
 
Google Apps Japan Users Group #32 Members Talk(Lightning Talk)
Google Apps Japan Users Group #32 Members Talk(Lightning Talk)Google Apps Japan Users Group #32 Members Talk(Lightning Talk)
Google Apps Japan Users Group #32 Members Talk(Lightning Talk)
 
プログラミングブートキャンプを開催してみた。
プログラミングブートキャンプを開催してみた。プログラミングブートキャンプを開催してみた。
プログラミングブートキャンプを開催してみた。
 
Google Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみたGoogle Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみた
 
Itelt vol8 2
Itelt vol8 2Itelt vol8 2
Itelt vol8 2
 
20130202 unitycreators prefab
20130202 unitycreators prefab20130202 unitycreators prefab
20130202 unitycreators prefab
 

SUPER MAOU RUN の作り方