Gaming Life

一日24時間、ゲームは10時間

ほぼ週刊UE4日記02 Editor Utility Widgetを試してみる

UE4.22から、Editor Utility Widgetなる、エディタ拡張をUMGとBlueprintで簡単に実装できる機能が出来たらしいので試してみた。

といっても正直公式の人のQiita記事が十分過ぎる程丁寧に説明してくれている。

qiita.com

qiita.com

ここでは、1つ目の記事で紹介されている「レベル上にあるTick有効なActor, Componentを可視化する」エディタ拡張に、「レベル上にあるTick有効なActorを選択する」ボタンを追加してみた。

BPの中身はこんな感じ。

f:id:ai_gaminglife:20190421171952p:plain

用意したボタンの「On Clickedイベント」で、レベル上のTick有効アクターを配列に格納し、「Set Selected Level Actors」ノードでそれらを選択するというだけ。

Create TransactionとSequenceノードを使うことで、Undo・Redoに対応している。

Create TransactionとSequenceノードの組み合わせでUndo・Redo対応させるのは、毎回使う処理なので、以下のような、"Auto Close Create Transaction"マクロを作成し、マクロライブラリに用意しておくのはありだと思う。

f:id:ai_gaminglife:20190421172002p:plain

まとめ

  • Editor Utility Widgetは現時点でかなり沢山の事が、気軽に実装できる
  • Create Transactionを使えばUndo・Redoに対応させられる

ほぼ週刊UE4日記01 マテリアルで色んな図形を描く1

最近、諸事情でUE4に触る機会が少ない。しかしドンドン進化するUE4をもっと使えるようになりたい。

というわけで始まった、UE4を触って得た何かを、毎週記事にして、UE4に慣れ親しんでおこうという突発企画。

いつまで続くかはわからないが。

今回の元ネタ・参考記事

docs.google.com

nn-hokuson.hatenablog.com

Unityシェーダーを使って、お絵かきする人の記事を見て、じゃあUE4のマテリアルで同じことやってみよう、という話。

2色に塗り分ける

以下のようなMaterial Function、「MF_SimpleStep」を用意

f:id:ai_gaminglife:20190409234434p:plain

中身はUnityのシェーダでいうところのstep関数。UE4標準でValueStepという、同じようなことを実現する関数があるが、個人的に使い勝手が悪いので自作した。

これを使えば、簡単に2色に塗り分けられる。

f:id:ai_gaminglife:20190409234447p:plain

「MF_DrawCircle」を作成。

f:id:ai_gaminglife:20190409234459p:plain

これを使えば円を描画できる。

f:id:ai_gaminglife:20190409234510p:plain

アンチエイリアスな円

「MF_DrawSmoothCircle」を作成。

f:id:ai_gaminglife:20190409234531p:plain

これを使ってアンチエイリアスの効いた円が描ける。

f:id:ai_gaminglife:20190409234547p:plain

繰り返しの輪

参考スライド43枚目以降を参考に実装。

f:id:ai_gaminglife:20190409234602p:plain

frequencyの数字を大きくすれば細かい輪を描画できる。

f:id:ai_gaminglife:20190409234614p:plain

大きさが変化する輪

f:id:ai_gaminglife:20190409234638p:plain

結果

f:id:ai_gaminglife:20190409234643g:plain

TimeノードをSin関数に流すことで、-1から1までの範囲でなめらかに変化する値が得られる。その絶対値を取れば、0から1までの範囲でなめらかに変化する値が得られる。

この値を使って、円の内側と外側の円の半径の長さを決定する。先程作成した「MF_DrawCicle」関数を2つ使って輪の外側と内側を作成し、外側を内側の円でくり抜けば、大きさが変化する輪が作成出来た。

縞模様

縦縞を生成する「MF_Strive_U」。

f:id:ai_gaminglife:20190409234656p:plain

TexCoordにR値でマスクを掛けると、U方向のグラデーションが得られる。

あとは、こちらの記事を参考にすれば実装できる。

横縞を生成する「MF_Strive_V」は、TexCoordをG値でマスクを掛けて得られるV方向のグラデーションを使えばよい。

f:id:ai_gaminglife:20190409234710p:plain

市松模様

こちらの記事にして実装。

f:id:ai_gaminglife:20190409234723p:plain

時間で変化するハート模様

ハートを描く数式にはこちらのサイトのものを、実装自体は参考スライド49枚目以降を参考に実装した。

f:id:ai_gaminglife:20190409234736p:plain f:id:ai_gaminglife:20190409234737g:plain

Customノードの中身は以下。

st = (st - float2(0.5, 0.70)) * float2(2.1, -2.8);
return pow(st.x, 2) + pow(st.y - sqrt(abs(st.x)), 2); 

まとめ

UE4のマテリアルは、Unityのシェーダと違い、作成途中の計算結果を、簡単にプレビューできる為、試行錯誤が容易にできる。触っていてとても楽しいので、もう暫く遊んでみたい。

大学生がゲーム会社にプログラマーとして内定が出るまでやってたことを晒す

表題通り、ゲーム会社に内定が出て内定承諾まで終わりました。何もなければ、来春からゲームプログラマーです。結局コンシューマとスマホ両方合わせて3社内定で、コンシューマの方に進むことにしました。

三年前、大学入学した頃は、ゲームプログラマーになりたいって夢はあったものの、現実は地元で公務員だろうなーと思っていたので、実現してしまってびっくりしている。

折角なので、三年前、大学入学直後に知りたかった情報ってのを、自分の経歴を振り返りつつブログに書き留めようと思う。

対象読者

筆者のスペック

  • 出身高校

    地元だとそこそこ名の通った公立普通科

  • 大学(在学中)

    駅弁中位クラスの国立大学工学部(システム系)

  • 大学入学当初のプログラミング経験

    パソコン他電子機器を弄ることは好きだがプログラムは全く書いたことがない

私のプログラミング・就活歴

大学入学~大学1年前期

Javaの入門書を買う。オブジェクト志向で詰む。調子に乗ってテスト勉強しなかったら高校数学レベルの線形代数のテストで30点を取り無事落単する。

大学1年後期

C言語の講義が始まる。多少なりJavaの勉強をしてたので講義ではさほど苦労しなかった。とは言え、上級者向けの課題では毎回10時間くらい掛けて解いてた。今なら20分あれば終わると思う。

前期の反省を活かし、テスト勉強はめっちゃ頑張った。この期は単位落とさなかった。

大学2年前期

「このままじゃゲーム業界行けないぞ!!!!!」と焦ってプログラミングの勉強を真剣に始める。最初はProcessingっていうJavaっぽい言語で遊んでいた。

その年のE3のYoutube配信で、UE4というゲーム制作ツール(以下、ゲームエンジン)で制作された「ドラゴンボールファイターズ」のPVを見て、殆どアニメみたいな画がリアルタイムで動いていることに感動する。それからしばらくして本屋でUE4の本を見て、これだ!!!と入門書を買う。今思うとこの本を買ったのが分岐点だった。

この辺りで自分で勉強したことをTwitterやこのブログにアウトプットする癖がついた。

大学2年夏

UE4をひたすら触ってた。プログラミング的な考えにこの辺りで馴染むようになり、オブジェクト志向を理解した。嘘。でも一年前Javaの本を読んだ頃の絶望感を思うとずいぶんわかるようになった。

この辺りから進捗をTwitterやブログに上げるようになった。

大学2年後期

10月か11月くらいにUE4を使ったゲームジャムに参加する。何もできなくて絶望する。しかし、そこで作った(チームの人に作ってもらった)プロジェクトのデータを頂いたので、それをひたすら解読して、自分のものとして吸収した。

確か2回ほどUE4関連の勉強会に参加してる。

大学2年春休み

UE4を使って1ヶ月のゲーム制作をするというコンテスト、UE4ぷちコンに参加した。パズルゲームを作る。

大学3年前期

夏にまた開かれるぷちコンに、今度はチームで参加したいと小規模の勉強会を主催するなどして、メンバー集めに奔走する。夏にインターンにも参加したいよなーと思い、知り合いに教えてもらったサポーターズの逆求人イベントに参加する。

確かこの頃にも勉強会に2回ほど参加した。

大学3年夏

ぷちコンにチームで参加する。インターンは逆求人イベントで知ったゲーム系のハッカソンに2つ参加した。

大学3年後期

ジースタイラスさんの逆求人フェスティバルが気になるなーってつぶやいてたらTwitterで公式からリプライ飛んできて参加決定。このイベントは本当に強い人だらけでまだまだ実力足りないなーと思い知らされた。

1月、2年前から存在は知っていたグローバルゲームジャム(GGJ)に初参加。

11月くらいに一社ES提出。12月に2社、2月に1社ES提出し、内三社に内定が出た。

大学に通う事のメリット

講義でC言語Pythonを学んだが、正直講義でやったことはあんまり記憶に残ってない。東大東工大京大の情報系学部クラスじゃないと、大学の講義だけで一線級のプログラマーとして食っていくだけの力をつけるのは難しいと思う。情報系の大学に行けば誰でもプログラミングマスターできるとか変な期待を持ってはいけない(私はちょっとだけ持ってた)。

とは言え、大学が全く役に立たないかというと、そんなわけがなく。基本的なことから体系立てて学べる機会はそうそうない。また、研究の最前線にいる教授に気楽に質問できるのも大学生の特権。いわゆるボーダーフリーの大学であっても、所属する教授陣の経歴を調べると大概とんでもない人だらけ。

大学図書館もとても貴重な存在。市の図書館にはなかなか所蔵されていない専門書が豊富に置いてある上、欲しい本があれば、リクエストして取り寄せて貰える。私は、プログラミング関連の書籍の購入を夜リクエストしたら、次の日の朝に承認が下り、3日後に図書館で借りた、という経験がある。

もう一つ。大学生は、学割が使える、という大きなメリットが存在する。Officeは今どきの大学なら無料で使えるし、Adobeは一般料金と比べてかなり格安で使える。VRChatの流行等で最近注目されてるSubstance Painter / Designerに至っては無料で使うことができる。

電車だって学割を使えば2割引で乗れるし、Amazon PrimeとかSpotifyとかも格安で使える。

調べると、想像以上に色んなものを学割で使えることがわかると思う。

とにかく大学に来た・行く以上は、数多ある、大学生の特権を思う存分使い倒してほしい。私はした。

逆求人系イベントについて

サポーターズさんやジースタイラスさん、あとはキャリアセレクトさん等、最近は色んな学生就活サポートのサービスが存在する。インターン、本選考の情報を沢山知ることができるのはもちろん、選抜制ではあるが、複数社の人事の方と一日にまとめて面接ができる、逆求人イベントも定期的に開催されている。

逆求人イベントの最大のメリットは、交通費が(基本的に)全額貰える事。学生にとっては、交通費が貰え、沢山の会社とまとめて面接ができる、怖いくらいメリットだらけのイベント。どこで利益出してるんだろうか。

本当にハイレベルな人しか行けない逆求人イベントもあるが、ある程度のアウトプット(例えば自作ゲームとか、ブログとか)がある人はかなり高い確率で参加できると思う。もしそういったものがなくても、登録だけはしておいて損はない。

インターンについて

ゲーム業界に限ると、夏のインターンスマホ系、秋冬のインターンはコンシューマ系が多い。(今年からまた新卒採用のシステムがガラリと変わるらしいので傾向は変わると思う)

私はスマホ系のゲーム会社2社のインターンに参加したが、現場で働いているゲーム開発者の方と直接話をしたり、同世代のとんでもねぇ奴らに心を折られたり、プロのアドバイスを受けながら開発出来たり、心を折られたり、貴重な経験が沢山できだ。

また、インターン参加者は早期選考ルートの案内をしてもらえることが多い。

絶対参加すべき、とは言わないが、都合が合うのなら是非参加してみるべきだと思う。お金貰える奴も沢山あるし。

面接について

慣れるまでは緊張する。当然。

こればっかりは当人の性格と、場数がものを言う。逆求人イベントや、インターンの選考などを通じて、慣れておくとよい。

あと、自己紹介と逆質問2、3個は必ず用意しような。

Twitterについて

Twitter、やろう。

Twitterには、沢山のつよいひとがいる。開発過程・進捗を、ハッシュタグをつけて(UE4だったら #UE4Study)ツイートすると、RT・ふぁぼしてもらえたり、アドバイスと言う名のマサカリが飛んでくる。それをモチベーションにしてまた新たな進捗を生み、また拡散・アドバイスしてもらえる。これを「正のSNSループ」と言う。今名付けた。

一人で孤独に開発し続ける、ってのも大切ではあるが、それを続けてると、大体挫折する。

「正のSNSループ」に乗ることがモチベーションを枯らさず開発を続けられるし、時折アドバイスが貰えたりする。

また、Twitterで著名な開発者をフォローすると、TLに開発にまつわる色んな最新情報が得られたりする。私は最近、ニュースサイトをいちいち巡回するよりも、Twitter見てたほうが良いんじゃないかと思っている。

Twitter、やろう。

ただしTwitterで質問するときは礼儀を弁えましょう。燃えるぞ。

結局ゲーム会社に就職するのに何すべきなのか

私なんぞがこんな主語のデカい主張をするのもおこがましいが、ゲーム会社への就職を目指してる人はここが気になると思う。なので、超個人的に思う、「ゲーム会社に就職するのにすべき事」ってのを挙げたいと思う。これをすれば絶対受かるってわけじゃないので話半分に聞いてほしい。

就活までにゲーム一本は作ろう

ここだけは誰に聞いても共通の回答をすると思う。

ゲーム会社の新卒採用ページを見てもらえればわかるが、プログラマー採用の人は、募集条件に、「自分が開発に携わった作品」の提出を求められる。

インターンに参加したいのなら、大学3年(就活1年前)の5月、就職のみを目指すなら就活解禁までに、ゲームエンジンを使って自作のゲームを作るべき。但しRPGツクールを除く。ないよりはましだけど。

また、コンシューマ系なら、Unity、UE4といったゲームエンジンで作ったゲームだけでなく、ある程度C++を生で触れる所を見せられるようにもしたい。大体のコンシューマ系会社がC++を書けることも求めてくる。

C++一本でゲームを作れとは言わないが、多少なり触っておこう。(私は今のところC++だけで作ったゲームはありません)

面接で普通に話せるくらいの経験は積もう

就活する上で面接だけは避けて通れない。バイトするなり、大学等で開かれる面接練習に参加したり、先述の逆求人イベントに参加するなどして、本番の面接で大失敗しないようにしておきたい。

情報をキャッチするアンテナを張ろう

Twitterなり、ブログなり、はてなブックマークなり、その他ニュースサイトなり。八方手を尽くして、最新情報についていけるアンテナを張るべき。

ついこの間まではスマホゲームがこの世の春を謳歌していたのにあっという間に赤字転落するような業界。そんな世界についていけるように情報の入手は怠らないでいきたい。

ゲーム・ゲーム開発を楽しもう

個人的に一番大切だと思うこと。

一般的な新卒採用ルートを通るのであれば、ゲーム業界に就職できる程のスキルを持つ人が、ギャンブル性が高く、平均給与もアプリ系、Web系等と比べて低いゲーム業界に就職するのは、どう考えても損。

それでもこの業界に進むっていうのならそれだけの理由が必要。そして、それが無ければ、就職がゴールとなって、その後は生きた屍になるのがオチ。

やっぱりその理由っていうのは、「ゲームが好き」、「ゲーム開発が楽しい」っていうものだと思う。

その他大学入学前私が気になっていたことのアンサー

Q. 学歴って必要なの?

部分的にYES。海外の超大手パブリッシャーや、京都のN社を狙うってのなら、可能な限り高い学歴が必要。

但し、それ以外の会社であれば、学歴は殆ど必要ないと言ってもいい。重要なのは、一定以上の開発力。主体的に開発に関わったゲームがあるってなら、どこかしらのゲーム会社には行けると思う。

Q. ゲーム業界、給料ってどうなの?

安いよ(N社と黄色いモンスター抱えてるあそこと一部スマホゲーム会社除く)。そもそもゲーム自体大儲けできるようなものでもないし、これは割り切るしか無い。ただ最近は上がってるよ。働き方改革を讃えよ。

Q. ブラックじゃないの?

昨今の働き方改革の煽りを受け、流石に最近は改善されつつあるらしい。働き方改革を讃えよ。

Q. ゲーム開発ってどうすればできるんですか?

そこにUnity or UE4とその入門書があるじゃろ?あとは気合じゃ。

Q. ゲーム専門学校ってどうなの?

ネットで言われてるほど悪いところではないと思うよ。専門学校でチームを組んでスゴクオモシロイゲーム作ってる人はたくさんいる。ウラヤマシイ。

但し、一度専門学校で講師をしている方に話を聞いたんだけど、やらない奴は本当に何もやらないらしい。そういう空気に流されそうなら素直に大学行ったほうが将来潰しが効くと思う。

まとめ

  • 大学から本格的にプログラミング始めてもゲーム会社に内定もらうことはできるよ

  • 逆求人イベントに是非参加しよう

  • 今ある環境にあるものを徹底的に使い倒そう

  • ゲーム一本くらいは作らないと就職つらいよ

  • ゲームは作れなくても、何かしらのアウトプットは継続しよう

  • Twitterはいいぞ(強調)

応援してます。

Windows10×VSCodeで快適なPython3.7開発環境を立てる

WindowsPython開発する機会があったので、その手順を紹介。今回はAnacondaを使って環境構築する。

動作確認

2019/02/13

既に入っているPythonを削除する

人によって既にPythonが入っていると思う。大概Pythonのバージョン更新はうまくいかないので、事情がなければ今入っているPythonをコントロールパネルから削除したほうがいい。

Anacondaをダウンロード

https://www.anaconda.com/distribution/

上記のサイトからwindows版のAnacondaインストーラーをダウンロード。

Anacondaをインストール

基本はデフォルトの設定でインストーラーの指示に従っていけばいいが、1つだけ注意。

f:id:ai_gaminglife:20190213180344p:plain

ここで[Add Anaconda to the system PATH environment variable]にチェックをいれないようにする。

Anaconda Promptを使ってみる

インストールが終了したらAnaconda Promptを起動。pythonコマンドが叩けたら正しくインストールが出来ている。(終了するときはexit()と入力する

VSCodePython開発環境を整える

Pythonに対応したエディタは数多あるが、今回は流行りのVSCodeを採用。

拡張機能からPythonをダウンロードする。

flake8を導入

ここまででとりあえずはpythonの開発、実行環境が出来上がるが、よりPythonを書きやすい環境を作る為、flake8という文法チェックツールを導入する。

このツールを導入することで、大抵のタイプミスを実行前に防ぐことができる上、かなり厳しいコードレビューを自動で行ってくれる為、自ずと見やすいプログラムを書くことができるようになる。

flake8をインストールするにはAnaconda Promptを起動し、以下のコマンドを実行する。

conda install flake8

VSCodeの設定を変更する

flake8をインストールしただけではVSCodeに適用されない。

setting.jsonに以下を記述した後、VSCodeを再起動すると、flake8が使えるようになる。

"python.linting.lintOnSave": true,
"python.linting.pylintEnabled": false,
"python.linting.flake8Enabled": true,

その他おすすめの設定

flake8のコードレビューはかなり厳しく、こんなの気にしなくていいでしょ、というものまで警告を吐く。

python.linting.flake8Argsに無視したい警告を記述すればそういった警告を除外することができる。

私が使っている設定は以下。

"python.linting.flake8Args": [
    "--ignore=W293,W504"
],

その他、setting.jsonに書いておいたほうがいい設定を示しておく。その中身についてはここでは記載しない。

"editor.minimap.enabled": false,
"editor.parameterHints.enabled": false,
"files.autoSave": "afterDelay",
"files.autoSaveDelay": 1000

レオパレス民族大移動に巻き込まれた①

レオパレス民族大移動に巻き込まれた。

https://twitter.com/ai_9684_dct/status/1094171497399169026

家電付きの魅力に囚われレオパレスを選んだのだが、まさかこんなことになるとは。とにかく引っ越しの準備を急いでしなければならない。

で、先程レオパレスの担当者が謝罪と今後の予定について話しに部屋までやってきたので、そこで判明したことを共有。

  1. 本来退去時に必要な清掃費等は一切かからない
  2. 引っ越し先はこちら側の条件を聞きレオパレス側が候補を挙げ、そこから選ぶ。レオパレス物件から優先しての案内になるが、他社物件の可能性もある。
  3. 引っ越しにかかる費用は「全額」レオパレスが負担。(※ここでいう「全額」がどこまでを指すかは不明。見舞金が出るかどうかも言わなかった)
  4. 家電備え付けでない他社物件に引っ越す際、現在住んでいる住居に備え付けられている家電を持ち出すことができる。

特に家電の心配をしなくても良くなったのはデカい。

今後進展があれば書ける範囲で随時ブログに書くと思います。

※現在募集停止【告知】2D経営シミュレーション系ゲームのドッター募集

※今回の記事は個人的な告知です。

現在、私を含む開発メンバー二人で、2Dの経営シミュレーション系ゲームを開発しています。

今年末のデジゲー博、もしくは冬コミで頒布を目標として開発を進めていますが、ドット絵の素材の用意に非常に苦労しています。

そこで、2Dのドット絵を描いてくださる方を募集します。

依頼内容

  • C++(OpenSiv3Dライブラリ)で開発中の経営シミュレーション系ゲームで使用する人物系のドット絵の作成

「48x48のサイズ、差分は各キャラ2個ずつ」の仕様を満たしていればどんなキャラクターでも構いません。

報酬

  • 応相談。金銭的な報酬は多額は出せないと思います……

その他

  • 開発の中心メンバーとして加入という形でも、外注という形でも構いません。

連絡先

  • このブログのコメント欄
  • Twitterアカウント @ai_9684_dct

大々的には募集しませんが、プログラマーとして参加したいという方もいらっしゃれば連絡をください。

どうかよろしくお願いいたします。

UE4 マテリアルとRenderTargetを使ってライフゲームを作ってみる

一体どこに需要があるのかわからないが、マテリアルをとRenderTargetを使ってライフゲームを作ってみた。

wikipediaだったり検索すればすぐに分かりやすい説明が見つけられるので、ここではライフゲームがなんぞやという説明はしない。

バージョン

UE4.21.2

概要

パラメータとしてTextureを与えると、次のタイムステップのライフゲームの結果を吐き出すマテリアルを作成。

ブループリントでRenderTargetを2つ(RT1とRT2とする)用意し、最初に上のマテリアルで計算した結果をRT1、RT2に書き込む。

続けて、

  • RT2をマテリアルのパラメータに与えその結果をRT1に書き込む
  • RT1をマテリアルのパラメータに与えその結果をRT2に書き込む

をTickを使って交互に実行することでライフゲームの時間軸を進めていく。

マテリアルの中身

  • M_LifeGame

f:id:ai_gaminglife:20190202133223p:plain

注意はBase Colorに繋ぐのではなくEmmisive Colorに繋がねばならないこと。理由は後述。

  • MF_8NeighbourPixel

f:id:ai_gaminglife:20190202133236p:plain

f:id:ai_gaminglife:20190202133249p:plain

今見ているピクセルの8近傍ピクセルのR値を取得する関数。

キモはTexel SizeノードとTexCoord。

Texel SizeはTexture Propertyと検索すれば使えるノードで、入力として与えたテクスチャのピクセルサイズを取得することができる。

TexCoordには今見ているピクセルのUV座標が入っている。

  • MF_8NeghbourLifeGame

f:id:ai_gaminglife:20190202133258p:plain

MF_8NeighborPixelで取得した8近傍ピクセルのR値を四捨五入。それと現在のピクセルのR値を使って現在のピクセルの生存・死亡・誕生をCustomノードを使って判定する。

今回採用したライフゲームのルールは、

  • 今死んでいる時周囲のピクセルがちょうど3つ生きていれば誕生する
  • 今生きている時周囲のピクセルが2か3つ生きていれば生存する
  • 今生きている時周囲のピクセルが1つ生きていれば過疎で死亡する
  • 今生きている時周囲のピクセルが4つ以上生きていれば過密で死亡する

Customノードの中身は以下の通り。

float1 count = 0;
if(N1 == 0){count++;}
if(N2 == 0){count++;}
if(N3 == 0){count++;}
if(N4 == 0){count++;}
if(N5 == 0){count++;}
if(N6 == 0){count++;}
if(N7 == 0){count++;}
if(N8 == 0){count++;}

if(thisPixel==0)
{
    if(count <= 1)
    {
        return float3(1.0, 1.0, 1.0);
    }
    if(count >= 4)
    {
        return float3(1.0, 1.0, 1.0);
    }
    else
    {
        return float3(0.0, 0.0, 0.0);
    }
}
else
{
    if(count == 3)
    {
        return float3(0.0, 0.0, 0.0);
    }
    else
    {
        return float3(1.0, 1.0, 1.0);
    }
}

ブループリントの中身

  • 構成

Static Mesh Actorを継承し、MeshにPlaneなりBoxなりを割り当てる。マテリアルには先程作成したM_LifeGameを設定。

ライフゲームの初期状態として与えるTexture2D型の変数、InitialTextureを用意。Instance Editableにチェックを入れて置くと便利。

  • Construction Script

f:id:ai_gaminglife:20190202133309p:plain

メッシュのDynamic Material Instanceを作成し変数LifeGameDMIとして保存しておく。続けてSet Texture Parameter Valueを使ってライフゲームの初期状態を与える。

  • Event Begin Play

f:id:ai_gaminglife:20190202133318p:plain

初期状態テクスチャと同じサイズのレンダーターゲットを2枚作成。それぞれにLifeGameDMIの結果を書き込む。

ここにハマりポイントが2つある。

1つはCreate Render Target 2Dするタイミング。

この関数をConstruction Scriptで実行すると正しく動作しないので、必ずBeginPlayで作成する。

もう1つはレンダーターゲットに描くマテリアルについて。

Draw Material to Render TargetするのはEmissive Colorの結果のみ。Base Colorの結果は一切関係ない。先程ライフゲームの結果は必ずEmissive Colorに繋がなければいけないといったのはこういうこと。

  • Event Tick

f:id:ai_gaminglife:20190202133335p:plain

FlipFlopを使って交互に実行する。

最後にClass SettingでTickが呼ばれる回数を好みに設定して完成。

まとめ

Customノードの中身を変えれば簡単に他のルールのライフゲームを再現できそう。Draw Material to Render Targetはかなり面白いことができるのでもうすこし遊んでみたい。

参考

qiita.com