テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】1週間ゲームジャムに参加しました。メイキング・オブ・超速ブロック崩し(仮)

一週間ゲームジャム(#unity1week)が面白そうなので、参加してみました。

作ったゲームはこんな感じのゲームです。

超速のブロック崩し(仮) | ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

f:id:tsubaki_t1:20170501210819g:plain

 

一週間ゲームジャム

f:id:tsubaki_t1:20170501210445j:plain

大体1週間でゲームを一本作ろうというイベント企画です。
お題に沿って開発し、最終的にUnity RoomにWebGLで公開…というのが大雑把なレギュレーションです。

 

最初は時間無くて見てるだけの予定でしたが、ハッシュタグ#unity1week)を見ているとやっぱ楽しそう…

 

いやいやしかし、時既に時間切れ、もう勝負ついてるから…

 

 よし、やるか!

 作るものを決めよう

まずは作るものを決めます。実は「跳ねる」と聞いた時に頭に浮かんだキーワードがあるのです。「首をはねる」というもの

f:id:tsubaki_t1:20170501212602j:plain

昔やった超名作ゲームの一つで、ボタン一つで左右に移動、敵を打倒するというゲームです。少しゲームをプレイさせてもらっただけなので最早うろ覚えですが、凄い楽しかった事は覚えています。

それをもう一度プレイしたい…よし作ってしまおう

 

 

サクっとプロトタイプを軽く作ると単なる連打ゲーに成り下がりました。おかしい…こんなハズでは…

Y軸を増やして忍者ゲーにする

何度かプレイしていて思ったのですが、ふと

忍者が壁蹴りで近づいて敵を一掃する

の方が面白いのではと魔が差します。 丁度少し前に読んでたWeb小説で、壁蹴りで視界に入らず近づいて抹殺するシーンが…これは面白くなるのでは…

 

f:id:tsubaki_t1:20170501213426j:plain

スタート地点から開始、

時間を停止して、ルートを指定し(5回くらいまで着地とジャンプする方角を事前に設定)、一気に移動…その途中にいた敵は最後のジャンプ後にズババンと一掃。
(スパパっと切った後に鞘に収めると敵が一気に死ぬアレ)

…いや、面白いんじゃないか。いや、面白いに違いない多分

よし、

仕様を一部変更する!

 

サクッとプロトタイプを作ってみた所、キャラクターの移動ルート毎に向きを設定するのが面倒という感想…どうしてこうなった。

もう操作を単純にしてブロック崩しで良いんじゃないかな

敵を複数置いて一掃するのは楽しい。凄く楽しい。ココを伸ばすべきだ。

…もういっそ移動先は簡単な反射で…あれ、これブロック崩しか?

もういいや、ソレで行こう。

f:id:tsubaki_t1:20170501221501j:plain

ブロック崩しの面白い所(ポケットに入ってゴリゴリ削る)だけ抽出して、つまらないブロック移動時間を限りなくゼロにする…いや、これは面白くなるんじゃないか…?

 

よし、

仕様を一部変更する!!

 

スピードに物を言わせて大量のブロックをゴリゴリ削るブロック崩し。楽しそうじゃないか。ずっと速度が早いのはきついので、何らかの条件で速度を抑える感じで。

プロトタイプを作っていこう

時間も余り無いので、サクっと作ります。

周囲の壁はEdge Coliderで作成。元々はCompositeColliderでしたが、別にエッジで良いかな…という。まぁ、大した問題ではあるまい。

弾の移動は、Vector2のReflectionがあるので、ソレでサクっと計算してしまいます。壁の隅に当たると無限反射するかもしれませんが、まぁ仕様という事で。嫌なら角取りすれば良いかな(その為のEdgeColliderでしたが、面倒でやってないという話も)

弾は最初の企画通り、1フレームで目標地点まで到達するタイプ。

f:id:tsubaki_t1:20170501214823j:plain

サクッとブロックと地面の板を配置。スピードに物を言わせて飛ばすことは出来るには出来るが、一瞬で元の位置に帰ってきて面白くない。

 

あとゆっくりにするタイミングが難しい。

  • 「衝突確定コース時」にゆっくりにすると待ち時間が面倒だし、「距離に応じて」だと角度によって超待つ事になる。そもブロック崩しの一番つまらない所は待ち時間なので、これは避けたい。
  • 「落下確定したら3秒で落下するように」みたいな物はゲームが忙しすぎてゴリゴリ削る部分が楽しめない。

そも、板反射では思った所に飛んでくれない。ぐぬぬ

このアイディアも駄目なのか…?

f:id:tsubaki_t1:20170501215339j:plain

そういえばハッシュタグで面白い挙動があったような…

 これだ!コレで行こう!

これなら何処にでも板が置けるから、地面衝突コース時に即座に超ゆっくりに出来て、落下時の待ち時間を殆ど0に出来て、

プレイヤーはゴリゴリ削る所だけ楽しめる! 結果が即反映されるトライ&エラーだ。

さあやろう、すぐやろう!

 

ちなみに当たり判定はEdgeColliderでスタートとエンドを指定するだけです。長さが無限だとつまらなかったので、3mとします(適当

後付ですが、EventSystemを使ってモバイルWebGLでも動作するようにします。

f:id:tsubaki_t1:20170501224623g:plain

エフェクトをつけよう

大体挙動が出来たのでエフェクトを付けます。

とりあえず破壊時のパーティクルと弾の向きを表現するトレイルは確定として、後は何を付けるか。そして、何色を使うか。

このゲーム、やってみると弾がゴリゴリと壁を削っていく所が楽しいので、それ以外の要素ノイズです。

一応、操作はターンベースなゲーム(準備フェイズと効果測定フェイズ)に近いので、効果測定フェイズ時には何を積んでも良いといえば良いのですが、画面内に色を足してトレイルやパーティクルの出す「効果」をボカしたくない…ぐぬぬ、どうすれば

f:id:tsubaki_t1:20170501222100j:plain

よし、見なかったことにしよう

 

絵面だけ見ると、赤いパーティクルとトレイルが十分に画面を埋めてます。

でも今思えば、コンボ数に応じて文字を大きく派手にする的なものは付けてもよかったかもしれない

 

ルールを決めよう

振る舞いが出来たのでゲームオーバーのルールを決めます。

このゲーム、時間がほぼ停止する以上「弾の落下に依るゲームオーバー」は想定外です(リリース時弾が下に行ってもゲームオーバーしなかったのはこのせい)。

なので、もっと別のアイディアが必要になります。例えばこんな感じ。

  • ゲームのプレイ時間
  • 線を引ける回数(プレイヤー操作回数)
  • n%破壊までに引いた線の数
  • 反射回数
  • 指定したターゲットブロックの撃破
  • ブロックを補充しての破壊回数
  • ゲームオーバーなんて無い、心ゆくまで砕いてもらう

という事で色々と考えましたが、線を引ける回数がそれなりに面白かったのでそのまま採用。

 

完成

しばらく寝かせた後、少しパラメータを調整してUnity Roomにアップロードして完成です。ということで完成したゲームがコチラ。

超速のブロック崩し(仮) | ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

 

プレイに必要そうな所だけ作って後は演出という言い訳の下オミットしまくった結果、偶然中々に悪くない感じのゲームが出来上がりました。

 

一応モバイルでも動かしたかったので、コードは大体300行、使用素材は背景絵1枚という可能な限りシンプルな構造に設定しています。AndroidFirefoxの組み合わせならサクサク動きます。Chromeは若干カクカク。iOSはお察しください。

感想

面白いかどうかは兎も角として、脳汁が出るゲームを目指して作ってみました。しかし予想以上にプレイしてくれる人が居てビビってます。

やはりWebGL…インストール不要な環境はゲームがプレイしやすいのか。

 

また暫くしたら開催するみたいなので、面白いアイディアが来たら参加してみようと思います。 今回は初期アイディアから離れまくりでしたが。

 

しかし、今回投稿されたゲームを幾つかプレイしましたが、結構ハイクォリティで面白いゲームが結構あってビックリです。明日は幾つかプレイしたゲームを紹介したい

関連

Unity 1週間ゲームジャム | ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

www.urablog.xyz

mirai-no.hatenablog.com

w-shunn.hatenablog.com

kyuuko.s7.valueserver.jp

【Unity】Soft Particleを使って、ポリゴンとパーティクルの交差点がハッキリ見えないようにする

今回はSoft Particleについてです。

Soft Particleはエフェクトの交差点をフェードアウトする

ビルボード(常にカメラを向くビルボード)でパーティクルアニメーションを行うと、ビルボードがポリゴンと交差した際に境目がハッキリ見えてしまう事があります。

そういった時にSoft Particleの機能を使うと、境目をフェードして表現してくれます。

f:id:tsubaki_t1:20170429202157j:plain

対応してるシェーダーとDepthTextureが必要

この機能を有効にするには、Soft Particleに対応しているシェーダー、あとDepthTextureが必要です。

Soft Particleに対応してるシェーダーとは、大雑把に言えばビルトインシェーダーでSOFTPARTICLES_ONが入ってるシェーダーです。

Particleのシェーダーには大抵入っていますが、Mobile/Particleのシェーダーには殆ど入っていません。

f:id:tsubaki_t1:20170429203557j:plain

 

Depth Textureは、Deferredレンダリングならば特に設定しなくても動作しますが、

Forwardレンダリングの場合はCameraコンポーネントのdepthTextureMode で明示的にONに設定する必要があります。

gist.github.com

あとはPlayerSettingsのQuality SettingsでSoft Particleを設定すれば準備完了です。

f:id:tsubaki_t1:20170429204639j:plain

モバイルでも動く

Soft Particleはモバイルでも動作します。

Quality Settingsで設定する際、MobileはSimpleが標準設定で、SimpleはSoft ParticlesがOffになっているので、これをOnにしてやれば動きます。

f:id:tsubaki_t1:20170429205800j:plain

ただしパーティクルはオーバードローが激しくなりやすい項目で、しかもSoft Particleは比較的重いシェーダーとされています。

炎のような単純なスプライトアニメーションなら兎も角、濃い煙を表現する等の、大量かつ広範囲に描画するパーティクルには使わない方が良いかもしれません。もしくは画面解像度を下げるか。

 

Particle AditiveをMobileで選択すると、Mobile/Particleシェーダーをお薦めされます。f:id:tsubaki_t1:20170429210040j:plain

関連

tsubakit1.hateblo.jp

sssslide.com

 
 

【Unity】Ctrl + Dで複製したオブジェクトから(1)を無くし、元オブジェクトの下に生成する

昨日のエディタ拡張で調子に乗って作ってみました。

ただ色々確認してる所、Macでは動かないかもしれません。

Ctrl + Dで複製しかし()は無し

Ctrl + Dでオブジェクトを複製しますが、複製したオブジェクトに(1)等は付きません。また、元となるオブジェクトの真下に生成されます。

f:id:tsubaki_t1:20170428005050g:plain

 

ちなみに、上の並びを本来の機能でやろうとすると、こんな感じ

f:id:tsubaki_t1:20170428005130g:plain

 

 ファイルの複製(適当)

ついでにファイルの場合は複製する機能の残しましたが、適当に作ったのでEdit/Deplicateでやるほうが安全かもしれません。

f:id:tsubaki_t1:20170428004428g:plain

コード

これをEditorフォルダ以下に突っ込めばOKです多分。

gist.github.com

関連

tsubakit1.hateblo.jp

【Unity】Create Emptyは何処に作られるのか?

f:id:tsubaki_t1:20170427232113j:plain

ふと気になったので確認してみました。

空のゲームオブジェクトをを作成する

Unityでコンテンツを作る際によくやるのが、Create Emptyで空のゲームオブジェクトを作成する事です。

作成した空のゲームオブジェクトは、フォルダのように暑かったり、適当なコンポーネントを追加してマネージャーにしたりと、まぁ色々します。

f:id:tsubaki_t1:20170427232323j:plain

ただ、オブジェクト作成時変な座標にある事も多々あります。それを毎回ResetPositionで [0,0,0] にしてる訳ですが、正直面倒と感じる事もあります。*1

f:id:tsubaki_t1:20170427232445g:plain

と、言うことで少し確認しました。

オブジェクトはフォーカスしたオブジェクトと同じ位置に作られる

まず一つ目の要素は、Create Emptyで作成したオブジェクトは、フォーカス(Hierarchyダブルクリックでシーンビューの中心に持っていく)したオブジェクトと同じ位置に生成されるという事です。

参考までに、P1~P3の順にフォーカス→Create Emptyでオブジェクトを生成すると、生成したオブジェクトはP1~P3と同じ位置に生成されている事が分かります。

f:id:tsubaki_t1:20170427233145g:plain

これは「キャラクターの位置フォーカスを置きCreate Emptyすると、キャラクターの位置(Pivotの位置)にオブジェクトが生成される」という動作が期待出来ます。

SceneViewを動かすと、生成位置がズレる

ここでメデタシメデタシで終われば良かったのですが、この多くの人を混乱させる挙動には続きがあります。つまり、SceneViewを動かすとCreate Emptyで生成されるオブジェクトの位置がズレるという事です。

下のアニメでは、フォーカス後に左にシーンビューを動かしています。そうすると、Create Emptyで生成されるオブジェクトの位置がズレます。

f:id:tsubaki_t1:20170427233647g:plain

また質の悪いのがズームの扱いです。

SceneViewのズームはFOVを弄って実現しているらしく、ホィールでズームを行った場合 シーンビューの位置は変わりません

なので、右クリック上下左右でカメラの位置を動かしたケースと違い、ズームだけならフォーカスを当てた位置に生成されます。

f:id:tsubaki_t1:20170427234120g:plain

Create Empty Childは親と同じ座標

なお、Create Empty Childは親と同じPosition・Scale・Rotationを持ちます(なので、相対座標は0となります)

これを便利ととるか微妙と取るかは…いや、微妙ですよね

f:id:tsubaki_t1:20170427234732j:plain

CreateEmptyで変な挙動になるならCraeteEmptyの挙動を上書きすれば良いじゃない!と思ったんですが、残念ながら出来ませんでした。

Cannot add menu item 'GameObject/Create Empty %#n' for method 'CreateEmpty.CreateEmptyObject' because a menu item with the same name already exists.

f:id:tsubaki_t1:20170428000556j:plain

 

と思いましたが、何とかなりました。

MenuItem名を少しズラし、かつGameObject/Create Emptyより高い優先度でMenuItemを用意してやれば、Ctrl + Shift + Nで自分が用意したGameObjectが生成出来ます。あと()とか要らない

gist.github.com

ちょっとした応用・Deplicateから(1)を抜き、親オブジェクトの下に生成する

このギミック使うと、Deplicate(Ctrl + D)も上書き出来ました。()が付かない・現在のオブジェクトの下に生成する複製…みたいな感じで。

f:id:tsubaki_t1:20170428003111g:plain

まぁアセットの複製がCtrl + Dでできなくなる弊害がありますが…ちゃんと拡張すれば何とかなるかな…?

関連

asus4.hatenablog.com

*1:フォルダやマネージャーとして使う場合、座標が0,0,0以外の所にあると色々とややこしい事を起こす事がある