AtCoderの問題をUE4のブループリントで解いてみる実験
「むしゃくしゃしたので、AtCoderというサイトの、プログラムコンテストに参加してたんだけど……」
妹「最近ブログをさぼってると思ったらそんなことを」
「よく考えると、あんまりプログラムって得意じゃない気がしたので、ちょっと練習しとこうと思って。ネットで参加できるから簡単だし。問題は簡単じゃないけど」
妹「賞金はどれぐらいなの?」
「いやそういうのは別にないんだけど……」
妹「なぜそんなことを?」
「それはなんというか、妹がやってるスプラトゥーンのフェスと同じで、基本的には面白いからやってるだけというか……プログラマーを目指す人が履歴書に書けるというメリットは一応あるんだけど」
妹「面白いんだ」
「たくさん解けたり早く解けたりすると順位が上になっていって、そうするとランク的なものも上がってという」
妹「なるほどゲームっぽい」
「こういうの色々あるんだけど、AtCoderは問題文が日本語だし、結構コンテストも頻繁に開催されてるし、過去問題も公開されてて練習しやすい」
妹「プログラムのコンテストはいいけど、プログラム言語はどうなってるの? いろいろあると思うんだけど」
「色々対応している。C++とかJavaとかPythonとか……」
妹「ちょっと聞いたことある名前」
「有名どころのプログラム言語にはだいたい対応している」
妹「じゃあ兄は何つかってるの?」
「Nimという言語なんだけど……」
妹「まったくこれっぽっちも聞いたことがない気がする」
「使ってる人が少ないマイナーなブキとか見かけたら、とりあえず使ってみたくなるでしょ?」
妹「そんな理由……」
「まあ実際問題としてユーザー数が多い言語の方が、困った時に検索できるし、UE4でも活用することを考えるとC++かPythonでやるのがいいとは思う。ちょうどAtCoderでの利用者数上位でもあるし」
ブループリントで解いてみる
「で、そうやって何の言語を使って解いてもいいわけだから、別にブループリントで解いてもいいんじゃないか? というのが今日の実験」
妹「解けるの?」
「解ける解けないでいうと、解ける。ちょっとめんどくさい問題もあるけど」
「例えばこのサイトに載ってる問題、1問目の場合だとこんなかんじになる」
「通常のプログラムだと、標準入力・標準出力という仕組みが合って、問題文もそこから受け取る仕組みなんだけど、ブループリントには無いみたいなんで、とりあえず文字列として関数に渡して、その結果を文字列で返すという仕組みにした。その関数をレベルブループリントで呼び出してる」
妹「ひょっとしてこれは簡単な問題なのでは?」
「毎回のコンテントには簡単なものから難しい問題まで出る。それにビギナー向けのコンテストの場合は、一番簡単なのはForループを使わなくても解ける問題が出るから。プログラムの基礎と、解答する仕組みがちゃんと書ければ正解できる」
妹「プログラムのコンテストっていうから、もっとやばいやつなのかと」
「初心者から上級者までいるから、全然解けない問題ばかりだと初心者もつまらないし。もちろん上級者用に高得点で難しい問題もある」
C++への変換
「というわけで問題が解けたとして、これを解答する場合、普通はそのソースコードをコピーして貼り付ければいいんだけど、ブループリントの場合はそうもいかない。そこでブループリントのネイティブ化というやつが使えないものかと」
妹「なんだっけそれ」
「ブループリントを速くする仕組みなんだけど、内部的にいうとブループリントをC++に変換してる。だからその変換されたやつをコピペすれば動くんじゃないかと。実際にScratchという言語もビジュルプログラミングだけど、C++に変換して解答に成功してる人がいる」
妹「じゃあUE4でもできるの?」
「できるかなと思ったけど、できなかった……」
「NativizedAssetsというところにC++のソースコードは出てきたんだけど、中身がややこしいことになってる。それにUE4のファイルが一緒じゃないとコンパイルできない状態だから、このへんのを送ってもコンパイルエラーになる。なので計画失敗」
妹「C++ってなんかむずかしいね」
「普通に自分で書けばこんなに文字たくさん書く必要ないんだけどね。機械的に変換されたものはどうしても読みにくいものになりがちというか、元々高速化が目的でこれを読んでどうこうすることが目的の仕組みじゃないというか。そのまま動かせたらブループリントでアルゴリズム学習とか出来るかなと思ったんだけど」
UE4でHTML5パッケージ化すると、SaveGameが効かないことがある
「HTML5にするとSaveGameが上手く動かないという質問があったので、簡単なテストデータを作ってみた。ほうっておくと出てくる数字が増えていくだけなんだけど、Sキーでセーブ、Lキーでロードという仕組みになっている」
妹「普通に出来てるのでは」
「Firefoxというブラウザだと出来る。妹が使ってるのもこれ。だけど一般的に利用者の多いChromeだと、ロードすると0に戻ってしまう。セーブデータ自体が無い感じ」
妹「セーブデータはどこに出来るの?」
「ブラウザ上で動くゲームは、最近はインターネット上にデータが保存されてることも多いけど、SaveGameの場合はクッキー(Cookies)という仕組みで保存されてるみたい。それがChromeだと上手くいってないみたい。UE4じゃない他のゲームだと普通にセーブできてるんだけど」
レベルブループリント
BP_Save(SaveGameクラスを継承)
「空のプロジェクトに最低限のBPだけ入れた、シンプルなシステム。もちろんプレイボタンで動かした時も普通にセーブできる。いまのところChromeだけおかしい。設定がヘンなのかもしれないけど、とくにあやしげなところもみあたらず」
妹「他にはないの? インターネット見るやつ」
「ないことはないんだけど、最新のWebAssemblyに対応してないと、セーブ以前にゲーム自体が動かないだろうから。日本語名とかも使ってないし……いまのところ原因不明」
妹「そしたらどうやってセーブしたら……」
「1つはSaveGameじゃなく直接クッキーに書き込む方法、もう1つはインターネット上に保存するという方法。どちらにしてもブループリントだけではむずかしそうな」
https://answers.unrealengine.com/questions/539566/html5-content-control-browser-from-inside-ue4.html
「ここに書いてある方法だと、C++の中からJavaScriptを呼び出す……みたいな仕組みで出来ると書いてある。他に何かいいプラグインがなければ、この方法しかないかも」
SF背景用キットバッシュアセット『Scifi Kitbash Level Builder』
imoue.hatenablog.com
前回の記事
「引き続き、2月の無料アセットの話なんだけど、今回キットバッシュ用のアセットというのが含まれてる」
妹「キットバッシュ?」
「兄にもよくはわからないんだけど、バラバラのパーツを組み合わせて何かを作る手法というか。今回の場合で言うとSF風の背景作成用のアセットだけど、例えばロボットとか戦車とかのも」
妹「なんかメカメカしいやつなのかな?」
「元々プラモデル方面から出てきた言葉らしいから。他のプラモデルのパーツをくっつけて、オリジナルの改造をするみたいな。ダイヤブロックで別のセットに入ってたパーツをくっつけるのと同じようなことではないかと」
妹「あんまりメカっぽいのは好きじゃないんだけど」
「木とか石とかのアセットは配置自由だし、別のアセットに含まれてるのも混ぜられるから、キットバッシュと言えなくはないと思う。ただ自然系は流用が難しい。木の枝先にを別の木をくっつけるとかも、CG的には出来なくはないけど、継ぎ接ぎした方の根っことか上手く隠さないと変だし」
妹「メカならいいの?」
「金属だったらまあ溶接してくっつけたと考えると、そんなにおかしなことになりにくい。あと直線が多いから、自然物よりもつなぎやすい。あとはローポリ系の素材もわりとこれに近いことが出来る」
「物はためしというやつで、何かのパイプっぽいパーツがあるんだけど。これを壁と地面につながるように置いておくと、何かが流れてるような感じになる」
妹「何が流れてるの?」
「それは知らない」
「同じの4つつなげて、輪っかを作ることも出来る」
妹「これはなんに使うの?」
「特になんということはないんだけど、シューティングゲームの雑魚敵とか、くぐるとポイントがもらえるとか。そのへんは使う人の判断だから何に使ってもいい」
「こういう感じのも、1つだとSAKUKEのステージみたいにもなるし、たくさんつなぐと巨大ロボの通気口っぽい感じにもなる。ちなみにALTキーを押しながらアクターを動かすと、同じのが素早くコピーできるのでこういう作業には向いてる」
妹「他にもキットバッシュ用のアセットみたいなのはあるの?」
「いろいろあるよ。マーケットプレイスにKITBASHというタグがあるから、キットバッシュ用のだけ検索することが出来る」
「それぞれ寸法とか雰囲気とか違うから、単純に組み合わせても上手くいかないかもしれないけど」
妹「丁度いいのがないかも」
「合わないように見えても、色を塗り直すと統一感がでてくることもある。あとはUE4のアセットじゃなくfbxとかのもあるから、Blenderとかで組み合わせたり、加工したり、足りない部分だけ自分で作るというのでもいい」
妹「じゃあキットバッシュというのはUE4の用語とかではないんだ」
「ではないね。一般的な英語とも違う気がするけど、3D関係ではちょくちょく見かける言葉」