るっちょ らいつ

るっちょ ぷれぜんつ 開発の日々。

Unityでドット絵っぽいエフェクトをつくろう

f:id:ruccho:20190616225048p:plain

Unityでドット絵っぽいエフェクトを作るの巻です。

 
注意

「ドット絵っぽい」パーティクルの作り方です。完全なドット絵(ピクセルパーフェクト)にするためには追加の操作が要るので注意してください。

 

方針

円形のドット絵のテクスチャシートを用意してParticle Systemでアニメーションさせます。

 

素材を用意するの巻

 

f:id:ruccho:20190616225726p:plain

 こんな感じで、大きさの異なるドットの円を並べます。Particle SystemのSizeは固定にして、テクスチャのアニメーションで大きさを変化させます。

 

 

素材を読み込むの巻

テクスチャをインポートして、新しいマテリアルにぶち込みます。

Particles/Additiveあたりがいいでしょう。発光してるっぽい表現ができてかなり良いです!(特に炎や爆発におすすめ)

f:id:ruccho:20190616230606p:plain

 

パーティクルを設定するの巻

設定したマテリアルを新しいParticle Systemに適用しましょう。RendererセクションのMaterial欄にあります。

f:id:ruccho:20190616230902p:plain

 

次にテクスチャアニメーションの設定です。Texture Sheet Animationを有効にします。

f:id:ruccho:20190616230956p:plain

Tiles欄に、用意したテクスチャのコマ数を指定します。

 

ここがキモです。Frame Over Timeは「時間ごとのコマ番号」の指定ができるので、ここでパーティクルの大きさを制御できます。作ったテクスチャは一番左が大きく、右に行くほど小さくなるような配置だったので、コマ番号0が一番大きいコマ、8が一番小さいコマになります。

なので、画像のカーブは「開始後すぐに大きくなって、次第に小さくなる」という制御をしていることになります。

 

 ピクセルパーフェクトにする場合は、最後にサイズの指定をします。画面サイズに合わせてStart Sizeを設定します。

例えば画面サイズが640x360で、Pixel Per Unitが32の場合、パーティクルのテクスチャの一コマが16x16なら、Start Sizeは0.5になります。

今回こちらで用意した素材は一コマが17x17なので、17/32=0.53125になります。

私の環境ではこれに加えて2D PixelPerfectのPackageを導入してピクセルパーフェクトにしています。

 

 あとはお好みでColorやEmissionの設定などをしておしまいです。

超かっこいいサウンドライブコーディング環境 "ORCA" であそぼう

f:id:ruccho:20190501022015p:plain

メモリダンプを彷彿とさせるサイバーな画面のなかを、たくさんの文字が躍り音楽を奏でる―――ライブコーディング環境「ORCΛ」 (ORCA) は、特有の機能を持ったアルファベットたちを画面に配置することで音楽を作ることができるソフトウェアです。

 

あっ……好き……(絶命)

 

ダウンロード

Windows / Mac / Linux対応です。

hundredrabbits.itch.io

ORCΛは標準でMIDI出力に対応してるので、デスクトップで鳴らすならLoopMIDIとVSTHostで鳴らすのが普通というところなのでしょうが、実は同じ作者がORCΛで使える音源ソフト「Pilot」を公開しており、圧倒的に簡単に音を鳴らせるので今回はそちらを使います。

hundredrabbits.itch.io

やってみる

 ダウンロードできたらOrcaとPilotの両方を起動します。

f:id:ruccho:20190501012619p:plain

 

 ORCA側の画面にコードを入力していきます。

ORCAでは大文字アルファベットそれぞれが特有の機能を持っており、それらを組み合わせることでコードを構築していきます。詳しい機能の一覧はGitHubにあります。

では早速入力してみましょう。

 

f:id:ruccho:20190501013104p:plain

まずは「D」を配置してみます。Dの真下が点滅しているのがわかるでしょうか。Dは「Delay」という命令で、一定間隔でDの下側に信号(bang)を配置します。bangはほかの命令を実行するトリガーとなるもので、例えばbangの右側に音を鳴らす命令を並べると……

f:id:ruccho:20190501013538p:plain

bangの間隔に合わせて音が鳴りました。

セミコロンは、Pilotで音を鳴らすための記号です。セミコロンの右に、チャンネル番号、オクターブ、音名を並べます。この場合は「Pilotのチャンネル0の音色でオクターブ4、C(ド)を鳴らす」という意味になります。(余談:MIDIで音を鳴らす場合はセミコロンではなくコロンになります)

たとえば、Pilotにはチャンネルが0~Fまであるので、この部分を変更することで音色が指定できます。

 

こういう感じで、ORCAの命令はその左右や上下に入力値や出力値を持ちます。

 

また、D (Delay)の左右がハイライトされてますが、ここはDelayの入力値です。例えばDの右を2に変更すると……

f:id:ruccho:20190501014349p:plain

音の鳴る間隔が短くなりました。Dの右側の値を変更すると、bangを生成するフレーム間隔を指定できます。

ORCAでは処理がフレームという単位で実行され、音の再生、画面や処理の更新はこのフレームごとに行われます。このフレームが全体のリズムをつかさどっており、拍のようなものと考えてOKです。画面下部にテンポと現在のフレーム数が表示されています。 

f:id:ruccho:20190501015026p:plain

 

また、Dの入力値を別の命令の出力値で書き換えることも可能です。

f:id:ruccho:20190501015912p:plain

乱数を生成する命令の「R」(Random)はRの左に乱数の最小値、右側に最大値を置くと、Rの真下に生成した乱数を配置します。

このコードではRの出力した乱数がDの入力値(フレーム間隔)となっており、結果、音が不規則に鳴るようになりました。

 

雑まとめ

……とまあ、こんな感じで、命令ごとの入力値や出力値をつないでいくことでコーディングができるという寸法なのです。

ほかの命令を利用して組み合わせることで、もっと複雑な動作をさせることもできます。こちらの動画で主要なものが紹介されています。

www.youtube.com

この動画内のORCAはバージョンが古いようで、一部の命令の入力・出力値の配置場所が異なりますが、基本は同じです。

 

また、Twitterではハッシュタグ #ORCΛ でたくさんの作例が投稿されています。こちらを見ながら、どこがどうやって動いているのかを観察するのも面白いです。

 

サウンドライブコーディング環境「ORCΛ」の紹介でした!

 

余談

公式が「ORCA」と「ORCΛ」と「Orca」と記法揺れしまくっているので(特殊な文字なのでしょうがない)、どう書くべきか悩んだ結果全部混ざりました。ゆるして。

 

 

https://twitter.com/neauoire/status/1114770190552653824

https://twitter.com/neauoire/status/1114770190552653824

AviUtlとffmpegでDVD-Videoの奇怪な仕様に挑む

とある事情で、とある映像作品の編集とDVD出力を任されました。

編集に使用しているのはAviUtl。

 

今回はAviUtlからできるだけ画質と時間をセーブしてDVD出力するためにいろいろ試した記録をつづります。

 

市販のDVDプレイヤーで再生できるようにするという制約があるので、DVD-Video仕様で出力します。このDVD-Videoというのがどんな仕様なのかというとWikipediaを見れば大体わかります。

 

映像フォーマット:MPEG2

画面サイズ:720x480 (NTSC)

アスペクト比:4:3または16:9

 

あまり古い時代の映像事情に詳しくない私はここで引っ掛かります。

「なんで画面サイズは720x480で4:3として策定されているのにアスペクト比が16:9も選べるんだ?」と。単純にレターボックスをつけるだけでいいのなら4:3だけで決めちゃえばいいじゃないか。

実は16:9の場合でも720x480の画面はフルで使い、アスペクト比情報を別に書き込んでおくことで、再生機器側で横に引き延ばしするんだそうです。なんという……

 

しかしここで問題が発生します。

AviUtl側では1920x816のシネスコサイズで編集しているという点です。

つまり、MPEG2のファイルとしては720x480で出力し、DVD書き出しの際は16:9として記録しつつ、シネスコサイズ対応用のレターボックスをあらかじめつけるというあまりにもあまりな手段を取らざるを得ないわけです。

そこで、これだけ柔軟な出力をするために、ffmpegを活用することにしました。

 

AviUtlからのffmpegを通じた出力にはffmpegOutというAviUtlプラグインを利用させてもらいます。mp4出力のx264guiExで有名なrigayaさんの公開されているソフトウェアです。

 

出力設定はこんな感じです。

f:id:ruccho:20180810221009p:plain

 

出力コマンドです。

 

-target ntsc-dvd -vcodec mpeg2video -vf "scale=720x363,pad=720:480:0:58" -r 29.97

 

キモは-vfオプション欄です。-vfはffmpegにおいて映像にフィルタをかけるための引数で、ここでサイズ変換等を行います。様々なフィルタをカンマで区切って入力すると順番に実行されていきます。

①scale

名の通り、単純に入力映像を指定サイズにスケールします。アスペクト比が変わればストレッチも入ります。ここでは入力映像の1920x816から720x363にリサイズしています。前述のDVD-Video仕様で、16:9として記録して、再生機器側で横引き延ばしされた場合にアスペクト比が1920:816になるよう計算した値が363です。小数点以下は適当に丸めましたが。

②crop

レターボックスを追加するために使用しています。"720:480"は最終的な映像サイズ、あとの"0:58"は左右に0px、上下に58pxずつ黒帯を追加するという意味です。

 

あとのオーサリングにはDVDStylerを使用しました。適切な形式にエンコードされていれば無変換でDVDに書き込めるので、多重にエンコードすることを避けることができます。

Unity公式の機械学習ライブラリが公開されたので試す

概要

blogs.unity3d.com

Unity上で機械学習ができるライブラリが公式より発表されたみたいです。

記事を読んでみると、

・多くの自律エージェントが互いに作用する世界でのエージェントのふるまいをシミュレーションできる(漠然としてるけど行動学とかそのへんかしら)

・車の自動運転技術など産業用アプリケーションに関する研究を物理の効いたUnityの世界で実行できる

・自律的な思考を持つAIプレイヤーをゲームに導入できる

みたいなことが書いてあります。以前からUnityはゲーム以外の学術方面での利用も推し進めてるようですが、やっぱり気になるのは開発するゲームに訓練されたAIプレイヤーを導入できることでしょうか。

ゲームでの機械学習というと、DeepMindのDeep Q-Networkなんかが有名ですが、このライブラリでもDQNが利用できるみたいです。

 


Unity Machine Learning - Reinforcement Learning Demo

 

実際に試す

GitHubに必要なファイルがあるので、CloneするなりDownload Zipするなりします。

まだベータ版ですので扱いにはお気を付けください。

Unityは2017.1以上のバージョンが必要です。

 

Unity Editorでml-agent/unity-environmentを開いて、Assets/ML-Agents/Examples/3DBall内のSceneを読み込みましょう。これはあらかじめ用意されたサンプルシーンです。

 

f:id:ruccho:20170922200023j:plain

 

こんな感じのシーンが読み込まれます。

 

HierarchyからBall3DAcademy > Ball3DBrainのInspectorを開き、Type Of BrainをExternalにセットしてください。学習を有効にするために必要な設定です。

 

実際に学習を行うにはビルドする必要があります。

 

どういうことかというと、学習機能自体はこのプロジェクトには含まれておらず、ビルドしたのち外部ライブラリであるTensorFlowによって行われるようです。

 

f:id:ruccho:20170922200844p:plain

 

 ビルドする前にPlayer SettingsからRun in Backgroundにチェックを入れ、Display Resolution Dialogのチェックを外しておきます。

ビルドはダウンロードしたルートフォルダの中のpythonフォルダに保存します。

 

ではビルドも済みましたし実際に学習……と行きたいところですが、そのまえにpythonの学習環境を整える必要があります。

 

Pythonの設定

まずはPythonをインストールします。ドキュメンテーションにはPython2.7でもPython3でもいけるとありますがTensorflowはWindowsではPython3系でしか動かないようなのでこちらをインストールします。(Macでは2.7系でもうごくっぽいですが未検証)

Python Release Python 3.6.2 | Python.org

インストールが済んだらコマンドプロンプトからpython --versionを入れてPython3系がインストールされてることを確認しましょう。

 

では設定に移ります。先ほどビルドを展開したpythonフォルダに移動し、

pip3 install .

を入力すると自動で必要なパッケージ類をインストールしてくれます。

 

学習

インストールが済んだらいよいよ学習を始めていきます。

pythonフォルダーで jupyter notebook を入力してjupyterを立ち上げます。

ブラウザから localhost:8888 にアクセスし、 PPO.ipynb を開いて Hyparameters セクションの env_name にビルドしたバイナリの名前(拡張子抜き)をセットします。

また、デフォルトでは訓練を 5e5(50万)回行う設定になってますが、筆者のPCは貧弱なのでこれを減らしておきます。

Hyparameters セクションの max_steps を5e4に変更します。

 

一番トップのコードのセクションにフォーカス(青カーソルが出る)を合わせ、 Run をカチカチと押してすべてのコードを実行していきますと、ビルドした実行ファイルが立ち上がり、学習が始まっていきます。

 

しばらく放置すると Train the Agents セクションに学習してるログが吐かれます。

 

Mean Reward: 9.350500454959013
Mean Reward: 76.65897435897344
Mean Reward: 88.24444444444323
Mean Reward: 56.52788461538383
Mean Reward: 54.5907834101375
Saved Model

 

こんな感じで続いていき、学習が終了するとビルドしたアプリケーションが終了します。

python/models/ppo/<バイナリ名>.bytes

があることを確認してください。これが学習データです。こいつをExamples\3DBall\TFModelsに移動しておきます。

 

学習した結果を確認する

こんな感じで学習が終了したので、こんどはこれをUnity Editorに読み込んで結果を確認してみます。

もう一度さっきのプロジェクトを開きます。

まず、TensorFlowSharpのunitypackage をプロジェクトに追加します。

Player Settings で Other Settings から、

1) Scripting Runtime Version を Experimental (.NET 4.6 Equivalent) にセット

2) Scripting Defined Symbols に ENABLE_TENSORFLOW を追加

したのち、一度Editorを再起動します。

 

3DBall のSceneを読み込んで、最初に設定したBall3DBrainのInspectorを開きます。

Type Of BrainをInternalにセットし、Graph Modelに先ほど移動したbytesファイルをセットします。

Graph PlaceholdersのSizeを1にセットし、

Name : epsilon

Value Type : Floating Point

Min Value : 0

Max Value : 0

に設定します。

 

ではいよいよPlayしてみましょう。板がボールを落とさぬよう勝手に傾きを調整しています。

 

感想

 とりあえずWikiのまんまに一通り試してみましたが、数多ある機械学習ライブラリとそのサンプルの中では圧倒的に手軽にすごいことが試せますね。(どこでもMNISTしかやらないから)

 

これがUnityという強力なプラットフォームで実現可能になった効果は大きいと思います。カスタムのプロジェクトでのML-Agentsの導入方法についてもWikiにあるのでまだまだいろいろなことが試せそうで夢がひろがりんぐしてます

 

 

Unity1週間ゲームジャム「夏」に参加した日記

 

1週間ゲームジャムとは、Unity製ゲームの投稿サイトunityroomが月イチで開催してるイベントで、月曜に発表されたお題に沿ったゲームを日曜までに制作し、投稿するものです。

 

第一回のお題「跳ねる」に始まり、第二回「転がる」、第三回「積む」、ときて今回第四回で発表されたテーマは「」でした。

 

んー夏か…夏に絡めたゲームアイデア…ん…?なんかこれデジャヴ…

 

そうでした。去年のUnityインターハイのテーマも「夏」だったのでした。(結局テーマこじつけになっちゃいましたが)

 

これまでの1週間ゲームジャムも参加はしたかったのですか時間が捻出できなかったり、アイデアがまとまらなかったりで指をくわえてみざるを得なかったのです。今回は時間があったのでとりあえず完成を目標に…

そんでもって月曜からあれこれ考えて…

夏らしい要素を主軸においてアイデアを出そうとするのはなかなか難しく、かといってとってつけたような夏要素にするのは心苦しかったのでだいぶ悩みました。

なんか最初はスイカを割らないように衝撃を避けながら運送するゲームみたいなのを考えてましたが夏である必然性が薄い。

既存の確立したゲーム性からいかに夏らしさを演出していけるか、みたいな方向性でスイカ割りシューティングというアイデアに落ち着きました。

プロジェクト作成ボタンを押したのは木曜のこと。

 んで、形から入ろうと思ってタイトルを最初に作りました。

スイカを降らせたあたりからこれは行けると思ってメイン画面の開発に着手。

 

ここから花火でスイカを打ち落とせるようになり…

 金曜

 

スイカが割れるようになったり割れたスイカを喰った数がスコアになったり

土曜

 

 細かい部分を整えて…

日曜

 

完成!

 

 

今回の学び

やりたいことを大まかに決めとくのは大事だけど、形から入って始めるとありえんくらい序盤の開発が捗る。雰囲気だけ出してスクショ撮ってTwitterに上げるだけでモチベが上がる。特に1週間という期限が「とにかくやれぃ!」と背中を押してくれる。ヘタクソな素材を描いても1週間で作ったから!と言える安心感もすごい。あと汚いコード書いても1週間経てばオサラバだしね()

 

自分もこんなスピードで開発したのは初めてです。1週間という期限と、それに向けて頑張る一体感が心地いいですね。 #unity1week タグをしょっちゅう見てました。

これは来月も参加不可避……!時間があればだけど

 

 

 

 

 

【1.7.2~1.10対応】MinecraftのMODをつくりたい第二回 ~環境構築②~

さて、環境構築編二回目です。

 

今回からはForgeの環境を整えていきます。

具体的には、

・Forge ソースコード類のダウンロード

・Forge ワークスペースの構築

IDEでインポート

になります。

 

Forgeダウンロード

続きを読む

【1.7.2~1.10対応】MinecraftのMODをつくりたい第一回 ~環境構築①~

こんにちは。

題の通りやります。まずは開発環境の構築。

大まかに手順を言うと、……

1.JDKのインストール

2.Eclipseのインストール

3.Forgeのソースをダウンロード

4.ソースを準備

ForgeというのはMODで遊んでいる方ならほぼお分かりだと思いますが、ほとんどのMODを導入する際に前提として導入するMODのことですよね。Forgeの機能を利用するとMOD制作が大変容易になるのです。いまのMOD制作はこのForgeを利用するのが主流なのです。

早速やっていきます。

1.JDKのインストール

MinecraftやForgeはJavaと呼ばれるもので開発されており、MODもまたJavaを使って開発します。え?JavaならMinecraftと一緒にインストールした?実は、一般にJavaと呼ばれるもの(JREJava Runtime Environment)はJavaでつくられたソフトウェアを実行するために必要なものですが、さらにJavaを使った開発にはJDKJava Development Kit)といわれるものが必要になります

早速インストールしましょう。まずはJDKのサイトに飛びます。

f:id:ruccho:20161129213759j:image

Javaのロゴのところを開きます。

 

f:id:ruccho:20161129171611j:plain

いくつかのバージョンの「Java SE Development Kit」の項目のうち、一番上のものを見てください。

f:id:ruccho:20161129171648j:plain

(8u11の部分はJavaのバージョンを示しているので、画像と異なるかも)

Oracle Binary Code License Agreement for Java SE」から利用規約を読み、「Accept License Agreement」にチェックをつけて同意します。それができたら下のリンク群から自分のパソコンに合う版を選びましょう。この記事ではWindowsで話を進めます。64bit(ほとんどの方はこちら)なら「x64」を、32bitなら「x86」です。(わからなかったらこちらからググって)

 

ダウンロードした「jdk-~~~-windows-~~~.exe」を開くとインストールが始まります。

f:id:ruccho:20161129172758j:plain

「次」

f:id:ruccho:20161129172821j:plain

!ここに記載されている「インストール先」をメモっておいてください!

「次」を押すとインストールが始まります…

f:id:ruccho:20161129173006j:plain

f:id:ruccho:20161129173032j:plain

「次」

f:id:ruccho:20161129173134j:plain

f:id:ruccho:20161129173149j:plain

「閉じる」で完了です。

 

2.Eclipseのインストール

Eclipseとは所謂IDE統合開発環境)で、プログラミングをする際に便利な機能を盛り込んだテキストエディタ…という説明で通しちゃいます。地道にメモ帳で書く手段もなくはないですが激しくお勧めしません。

また、Forgeが推奨しているIDEとしてもう一つIntelliJというものがありますがEclipseでいきます。IntelliJでも進められますが(筆者未検証)、後の手順が若干変わることを覚えておいてください。

 

Eclipseは日本語化されたバージョンをインストールしましょう。このサイトの上段にある「Pleiades All in One」をダウンロードします。バージョンの一番新しいものをクリックしましょう。

Eclipse 日本語化 | MergeDoc Project

 

f:id:ruccho:20161129183040j:image

 

Java」の「Full Edition」を選択します。64bitか32bitかについては前述の通りです。ダウンロードしたzipを解凍して任意の場所に配置しましょう。どこでも構いませんが、プログラミングの基本として、(フル)パスに日本語が入らない場所が理想です。

できましたら、その中のeclipse.exeから起動できます。その前にデスクトップにショートカットを作っておくことを勧めます。

 

起動時に、「ワークスペース」設定のダイアログが現れます。EclipseをMOD開発のみに使う方にはあまり関係ありませんが、私の場合は「C:/Users/<ユーザー名>/workspace」にしました。

 

Eclipseがうまく起動しましたか?

長いのでここで一回切ります。次回はForgeの設定を行なっていきます。

 

【1.7.2~1.10対応】MinecraftのMODをつくりたい第二回 ~環境構築②~ - るっちょ らいつ