ミラールートをAndroid用に出力しようとしたけど上手くいかなかった話
「HTML5は上手くいかなかったんで、今度はスマホ版にしてみようとは思ったんだけど駄目だった」
妹「ちゃんとスマホ用に作ってないからとか?」
「どうもそれ以前の問題という感じがする。Android……iPhone以外のスマートフォンはほとんどこれなんだけど、テクスチャの圧縮方式の違いでパッケージ化の方式も違ってる。どれがいいのかわからないんだけど、とりあえずわかっていることはATC方式でしかパッケージ化に成功しなかったということ。他の方式とか、全部入り設定とかだと駄目」
妹「あれ? じゃあそのATCというやつは上手くいってるのでは?」
「パッケージ化は出来てるんだけど、なんか動かないんだよ。表示もされない。これは設定の問題とか、実験に使った端末の問題かもしれないけど」
妹「端末って、Androidとかいうのでしょ?」
「それはOSの名前で、同じAndroidでも色々あるんだよ。そのへんがややこしいとこなんだけど」
妹「新しいPreview版も出てなかった?」
「4.10のPreview2も試したけど駄目。むしろATC形式でもパッケージ化できなくなってた」
妹「悪化しとる……」
「スマートフォン対応は力を入れてるとこみたいだし、しょっちゅうアップデートもされてるんだけど、アップデートが多いってことはまだ安定してないとも言えるわけで、少なくとも今日の段階では上手くいかなかった」
ラブ・エネミーのゲームオーバー演出の作り方
妹「そういえば兄が作ってたゲームの、GameOverの字がグルグルって出てくるやつはどうやって作ってるの?」
「あれはウィジェットなんだけど、ウィジェットを動かす方法は知ってる?」
妹「画面外から動かしてくるのは見たことある」
「それとだいたい同じ原理だよ。ただXとYの座標は変えずに、回転の角度と、拡大率、あと透明度を変えてる。最初は薄く大きく表示してぼやけた感じに、それが回転しながら段々ハッキリ見えてくるという演出。上空が地面に落とすようなイメージになる。昔携帯ゲームの演出を色々作ってた時に覚えたやつを応用した。ただゲームオーバー向きの演出ではなかったかも」
「この中には使ってない項目がいっぱいある。透明度(Opacity)だけ変えたくても、ColorAndOpacityをセットで追加するしかなかったとか。使わないとこは触らずに最初と最後が同じになるようにする。RenderTransformも必要なのはスケールと角度だけ」
妹「回転はどうなるの? 角度を変えるのはわかるけど、何回転もするのに角度だけだと足りなくない?」
「それは角度指定の時に360を指定すると1回転、720だと2回転みたいに、角度の数字をたくさん増やすとそうなるんだよ。360は0と同じ角度、同じ表示になるけど、その間をアニメーションさせようとすると回転する。反対方向に回したい時は数字をマイナスにして、同じように数字を増やしていけば回転数が増えるよ」
妹「他にはどういう演出のやり方があるの?」
「例えば逆に小さい字が大きくなる感じでもいいし、左右から別々のがでてきて重なってもいいし、字の色を変えてピカピカ光るように見せてもいい。そのへんはプログラムよりアイデアの問題だから、自分で色々試したり、スマートフォンのゲームを見て研究するのがいいと思う。特に大手のは演出に凝ってるから。速すぎて変化がわかりにくいのでもカメラの録画機能とか使えばだいたいの原理はわかるから」
妹「でもそれやるとパクリになるのでは……」
「使ってる絵とかをそのまま同じように使ったらそりゃ駄目なんだけど、さっきも言ったようにアイデアの問題だから。アイデアは基本的に著作物にならないんだよ。実際問題として真似しあってるからどこも似たような感じになってる部分もある。だからこそ斬新な演出が入ってるとゲーム全体の印象もよくなるんだけど、研究しないと斬新かどうかもわからないからね」
Actorにくっつけたカメラコンポーネントの取り扱い方法
「Twitterでカメラコンポーネントの話をしていたので調べてみた」
「カメラコンポーネントがくっついたActorを、SetViewTargetWithBlendノードの、NewViewTargetに設定するというのが基本みたい。というか標準のカメラ(CameraActor)も、結局ただカメラコンポーネントがくっついてるだけのActorだから、それと同じというか」
妹「でもコンポーネントだったらカメラたくさんくっつけたり出来ると思うけど、その場合にはどれが本物のカメラになるの?」
「例によって正確なルールは不明だけど、有効なカメラの中から1つだけが選ばれる。カメラが有効になってるどうかはIsActivateでわかる。デフォルトだとAutoActivateにチェックが入ってるから全部有効になってる状態でスタートする。Activateを設定した瞬間にカメラは切り替わるからSetViewTargetWithBlendはその都度やらなくていい。どのアクターのカメラを使うかを切り替える時に使う」
妹「でもそんなに複雑なカメラって要るかな? 主人公にくっつくタイプと、固定タイプと、2種類ぐらいじゃない?」
「主人公にくっつけるにしても、何種類か角度を変えられるようにして、FPS風とTPS風と切り替えるような事もできる。あと死んだ時や敵を倒した時、ゴールした時なんかに違うアングルで見せたりということもある。そのへんはプログラムじゃなくて演出の問題になってくるけど。それとBlendTimeとかを使って徐々に変化させたい時は、Activateで切り替えると一瞬で変わっちゃうから、別にアクターを作ってその中にカメラコンポーネントをくっつけて、SetViewTargetWithBlendで切り替えるといいらしい」
「ちなみにこれがキーを押すたびにカメラが切り替わるブループリント。最初にどちらか片方をActiveにしておいて、キーを押すたびにそれが逆になる」
妹「ToggleActive?」
「Toggle(トグル)っていうのは、同じスイッチをカチカチやるとオンとオフが切り替わる仕組みのことだよ。部屋の電気スイッチとか、パソコンの電源ボタンとか。それと同じノリで、今TrueだったらFalseに、今FalseだったらTrueに変えるようなノードにはToggleって名前が付いてる」
妹「そういうの欲しいこと時々あるけど、Toggleとかいう名前のは無かったような気がする」
「そういうの良く使いそうな所には公式でToggle命令が用意してあるんだけど、ない場合はこうやって自力で書くしかない。最低限SETとGETが出来れば同じことは出来る。FlipFlopノードを使ってもいいし、それぞれ逆だとわかってるからIsActiveは1度でいいし(NOTしたものがもう片方の値)、Toggle無しでももっと少し良い書き方は出来る。けどToggleがあるならそれ使うのが一番てっとり早い」