Game制作

Unityなどを用いたGame制作

KCS_AdventCalender2018_4日目::Unity ML-Agentsの導入と自作ゲーム適応時の体験談

こんにちは、何時も元気に這いよる混沌に飲み込まれたk0buです。

いつもはコミケと技術書典でProcedural Generation系を書かせていただいていますが、地味にサイトの方で記事を投稿するのは初めてですね。

さてKCSアドベントカレンダーの4日目を飾らせていただく私の記事の内容は、Unityが提供してくださっているML-Agentsの導入、また自分のゲームに適用する際の考慮点について話させていただきます。

 

Unity ML-Agentsの準備

 

今回説明するUnity ML-Agentsのバージョンはv0.5.0となっております。また自分はWindows 10を使用しておりますので他OSでも同様の操作で使用できる保証はできません。また、Unity2017.4以降を使用しろと公式が書いているためそれ以前のUnityでは動く保証はないです。

また新たにバージョンが更新された場合は公式のドキュメントがあるGithubの方を確認していただいた方が安全です。

 

Unity ML-Agents関係のインストール

 

まず、Unity ML-AgentsではPythonを使用するため、そのインストールが必要です。今の所Python3.6であれば大丈夫そうです。個人的には脳死でAnacondaを通してインストールをしても良いと思います。とりあえずPythonで機械学習を学ぶ際に必要なモノは入っているため、分からない時はAnaconda一択ですね。

自分はPythonをそこまで使わないのでAnacondaしか使用したことなく、仮想環境もそちらの方で用意しました。使い分けをすることは無いと思った場合は仮想環境はなくても良いと思います。

今回は途中でpipを使うためAnacondaはもしかしたらあまりよろしくないかもしれません。元々Anacondaを使っている人は仮想環境を今回のために分け、pipをcondaでインストールし、rootのpipを使わず仮想環境上のpipを用いましょう(これが対策になるかわかっていない)。

Anacondaでの仮想環境の作り方を簡単に説明させていただくと、

conda create -n 仮想環境の名前 python=3.6

という風にCommand PromptかPowerShellで打っていただくと作ることができ、”activate 仮想環境の名前“と”deactivate 仮想環境の名前“で仮想環境に入っている状態と入っていない状態の間を遷移できます。

それではML-Agentsをインストールしていきますが、まずインストールするファイル/ディレクトリを作成(mkdir)し、CommandPromptかPowershell上でそのディレクトリ上に移動(cd)しておいてください。そこで

git clone https://github.com/Unity-Technologies/ml-agents.git

 

と打っていただき、GitHubにあるML-Agentsのディレクトリをダウンロードしてきます。gitに生き恥を曝され恨んでいる人はUnityのGitHubページからzipファイルをダウンロードし、解凍してください。

AdventCalenderUnityML12/04MLdirectory

ダウンロード(clone)終了後、ml-agents\ml-agentsのディレクトリに移動し、そこで

pip install .

をしてください。これで今回用いるUnityが作ったPythonのパッケージであるmlagentsと、他に必要なパッケージがインストールされます。初めてPythonを入れた方の場合はコンソル上に文字がびっしり出てきて、ある程度の時間はかかると思いますので珈琲でもお茶でも飲みながら優雅に待ちましょう。ちなみに私はアールグレイが好きです。

用意されている環境をテストしてみる

まずUnityでGitHubよりインストールしたディレクトリよりml-agents\UnitySDKというファイルを開きます。次にAssets\ML-Agents\Examples\3DBall\Scenes下にある3DBallシーンをUnity上で開きます。

AdventCalenderUnityML12/03scene

ここでUnity上のEdit\Project Settings\Player内のOther Settings以下にあるScripting Runtime Version.Net 4.x Equivalentにします。またScripting Defined SymbolsENABLE_TENSORFLOWになっている事を確認します。そして、Resolution and Presentation以下にあるRun In Background欄がチェックに、Display Resolution Dialog欄がDisableになるようにしてください。またProduct Nameの方も3DBallにしておきます。

AdventCalenderUnityML12/04playerSettingsAdventCalenderUnityML12/03playerSettingNameBG

AdventCalenderUnityML12/03playerSettingEnableTensorflow

また、TensorFlowSharpをUnityに対応させたプラグインのインポートもする必要があるためこのリンクをクリックし、パッケージをUnity上でインポートしてください。

元々学習したモデルが用意されていますので、今回はそちらを利用しUnity ML-Agentsの体験をしてみようと思います。Hierarchy上のBall3DAcademyの子オブジェクトであるBall3DBrain内のインスタンスにBrain Typeを弄るパラメータがありますので、そちらをInternalにします。

AdventCalenderUnityML12/04finidingBrainAdventCalenderUnityML12/03ball3DBrainType

そうすると、モデルを入れるGraph Modelというパラメータが出てきますので、そちらに\Example\3DBall\TFModelsに存在する拡張子がbytesである3DBall.bytesファイルを入れてください。

そしてプレイボタンを押していただくと、ボールを落とさないように各板が動いているのが観察できます。凄いです(小並感)。

AdventCalenderUnityML12/03gameSceneTest

今度は自分で3DBall用のモデルを学習させてみます。まず先ほどのBrain TypeをExternalに直します。

次にビルドをします、ファイルはml-agents\envs下に保存します。

これから学習をさせていくためCommandPromptまたはPowerShellを用います。インストールしたプロジェクトの一番親であるml-agentsディレクトリに移動します。そこで

mlagents-learn config/trainer_config.yaml –env=envs/3DBall.exe –run-id=firstRun –train

と打っていただくと、以下のような画面になりUnityのゲームが起動し学習中の画面を表示してくれます。

AdventCalenderUnityML12/03trainingScene

AdventCalenderUnityML12/03training

学習したモデルはml-agents\models\firstRun-0\3DBall_firstRun-0.bytesとなりますのでこれをUnity上に分かる所に保存しましょう。

後はBrain TypeをInternalに戻し、Graph Modelに学習したモデルを入れゲームを再生すると、先ほど学習させた結果を見る事ができます。

もし学習時のconfigを弄りたい時は、ml-agents/config/trainer_config.yamlでハイパーパラメータ等の値を調整できるのでそちらを見てみてください。また、mlagents-learnを実行する時の引数によっても調整できるモノもあるのでこちらを参照してください。

ML-Agentsの概要

 

まず強化学習を簡単に説明すると、トライアンドエラーによる学習です。学習者であるAgentが存在し、Agentが何らかのアクションを決めて行いそれが環境に影響を与えます、その影響された環境という結果から状態および報酬を受け取り、またアクションを判断し起こすというサイクルでモデルは学習します。ML-Agentsでは端的にその出力するアクションの定義、どのような環境の時に正や負の報酬を出すのかを設定するだけでゲームのAIを作れるという風になっております。

まとめるとML-Agentsを使用する際に把握しておくべき重要な要素として

  • Observations(環境を見るための変数)
  • Actions(環境から決定されたアクション)
  • Rewards(環境から決定された報酬)

の3つとなっています。

ML-Agentsでの強化学習、模範学習のモデルとしてはOpen AI Gymを中では用いているようですが、これにまたラッパー(wrapper)としてUnityが作成したPython API(mlagents)が存在し、そちらを弄る方が簡単に学習を行うことができるようになりました。Open AI Gymを用いたり自身でTensorflow/Kerasでモデルを書いたりし、それを学習させることもできますが、機械学習を何も知らずにできるという利点においてはML-Agentsはそれを成し遂げていると感じました(現に私は強化学習に全く明るくありませんでした)。

またUnity上でTensorflowで学習したモデルを読みこめるようにするため、上でインポートしたTensorFlowSharpをUnityに対応させたパッケージがありました。TensorFlowSharp自身はTensorflowの学習モデルを.Net APIにおいて使用できるようにしたという感じです。

新しいゲームに適応させてみた際の触感

 

のちのち投稿するかもしれない動画のネタとして活用したい為、コード類は省かせていただきますが、それだと寂しいので考慮しないといけない点を書いていきます。

今回適応させたゲームでは画像を入力(環境を表す変数)として試してみましたが、この時の得られた知見を書きます。

  • 1つ目は環境を表すパラメータの数をなるべく少なくする事です。これは機械学習の点で考えた際、単純に入力数が多くなると計算量が多くなるためそれだけ1つ1つの学習に時間がかかるためオススメはできません。また、短期間の間隔でアクションを決定しないといけないとき程、遅延が発生しないように計算量を減らす事が重要です。
  • 2つ目はバグを取り除く作業が通常以上に難しくなる可能性です。大体のエラーはML-Agents内のスクリプト内で現れるのでゲームのコードをML-Agents様に実装している間にどのようなミスが起きたかが分かりにくくなっています。偶に自分が最終的に頼りにしているprintでのデバッギングも予想以上に動かず、バグを取り除くのに1日以上かかる時もありました(分からなくて単にサボタージュしていたとも言える)。
  • 3つ目はドキュメントやGitHubのIssueが潤っていないため、上で生じたバグやエラーは自分で解決しないといけません。そのため通常検索して終わる程度の見落としでも長い時間苦しまないといけないこともあります。しかし、皆さんが使用し始めIssueが潤えば、この問題は解消されますので是非使用してみてください!

 

完走した感想

 

Unity ML-Agentsをワークフローに取り入れれば確かにゲームAIの作成時間が早まる可能性はあります。しかし、学習時の細かい調整(ハイパーパラメータや環境を表すパラメータの取り方)をしなければならないため結果的に現状どちらとも言えないですね。模倣学習の方もあるのでそちらの方も試してみて、出来ればまた記事か動画を投稿したいと思います。

明日はKCSの音楽系の神の一柱であるGMAさんの記事です、どのような記事を書かれるか期待が高まりますね!

私は音楽といえばAtlusの世界樹の迷宮、メガテン、ペルソナが大好きですね。世界樹の迷宮に至っては目を閉じればそのゲームの一つ一つの階層が見え、またボウケンシャー達の活躍や失敗、苦難が見えてきて、現実を忘れるには持ってこいの曲が一杯です!

皆さんはどのような音楽が好きでしょうか、それではまた次の 12月30日(日曜日)にあるc95の東ト59b にてお会いしましょう。

ではでは~

 

←3日目 5日目→

 

超絶簡単unityライフハック -スクリプト生成編-

こんにちは。mo-takusanです。

さて、いよいよ始まりましたKCSアドベントカレンダーです。
第一日目ということで今回はあまり難解なことは書かずに、知っていると便利な機能を紹介していこうと思います。

unityのC#テンプレートがやばい

皆さんも毎日のようにunityを使っていると思いますが、この見出しみたいなこと感じたことありませんか?

2018-11-30_12h33_16

この図のようにunityのテンプレートはC#のコーディング規則に沿っておらずきれにするためにはいちいち書き換えなければなりません。このコメントアウトもいりませんし、ちゃんと名前空間も設定したいところです。さらにMonoBehaviourに限らずScriptableObjectなどもテンプレートとして用意されていれば便利そうです。

したがって今回の記事では、

2018-11-23_23h20_17

2018-11-24_18h59_40

こんな感じで「Create」->「MonoBehaviour」でMonoBehaviourが作成され、いい感じのテンプレートで自動的に初期化してくれることを目標にします。ScriptableObjectも作成したいですが、冗長になるだけなので今回は割愛します。

今回の記事はこの記事を参考にしました。

オリジナルのテンプレートを作る

それではまずはオリジナルのテンプレートを作成することから始めましょう。
参考記事によるとwindowsでは

"unityのアプリケーション位置"\Unity\Editor\Data\Resources\ScriptTemplates\

に存在するテキストを編集することで簡単にテンプレートを作成できるようです。
今回は以下のように編集してみました。なおファイル名は81-MonoBehaviour-NewBehaviourScript.cs.txtとしました。これで「Create」->「MonoBehaviour」から「NewBehaviourScript.cs」を作成することができるようになります。

参考ページに載っているようにテンプレートにはパラメータがいくつか用意されており、スクリプト名などを勝手に置き替えてくれるようです。しかし、5行目のコメントアウトから分かるようにプロジェクト名や作成したディレクトリ名もパラメータとして用意してあれば文句はなかったのですが、さすがにそこまで融通は利かないようです。(ちなみにディレクトリ名を名前空間として設定するってC#でもやるんですかね?)

そこで、次節ではこれらのパラメータも認識するように工夫していきます。

自作パラメータを置き換えさせる

ところが、先ほどのように単に一筋縄ではいきません。ちゃんとエディタ拡張をする必要があるようです。
unityではアセットを作成した際に対応したEndNameEditAction抽象クラスのActionメソッドが呼ばれるそうです。つまり、前節のようにしてテンプレートを作成すると、unity側が命名規則に従って自動的にデフォルトのActionメソッドを呼び出してくれると考えることができます。パラメータを自作する場合はこのActionメソッド内にパラメータを置き換えるコードを書くことになります。

それでは早速プロジェクトを作成します。
まず、プロジェクト内に「Editor」フォルダを作成し、ここに先ほど作成したテンプレートを入れてしまいます。この時、先ほどのコメントアウトは消しておきます。以降で作成するパラメータは他のプロジェクトでは機能しないのでこのようにして隔離しておく必要があります。

それではEditorファイル内にスクリプトを生成します。

23~27行目のようにしてパラメータに対応する文字列を入れ替えていきます。それ以降にも何やらごちゃごちゃと書いていますが、エディタ拡張職人になるわけではないので「このような手順を踏んでアセットが作成されるんだ」くらいの認識で良いと思います。

ところが、これだけではうまく動きません。先ほど述べたようにActionメソッドは対応したアセットに対してのみ実行されるため、作成したC#スクリプトに結び付けてやる必要があるのです。そこで、メニューアイテムも自作し、EndNameEditActionを紐づけます。メニューアイテムを自作するにはstaticメソッドにMenuItem属性を付与する必要があります。ただし、このようにしてメニューアイテムを自作する場合、既存のC#スクリプトと競合させてしまうと色々と面倒だったため、別のメニューとして作成します。また、この際の紐づけには次のメソッドを利用します。

このように事細かく指定する必要があるのは、自作したメニューアイテムからではデフォルトのActionメソッドだけでなく、アイコンを指定するメソッドや、アセット名を自動的に付けてくれる処理も呼ばれないためです。
完成したスクリプトは以下のようになります。

これで見事今回の目標は達成となりました。

全てのプロジェクトで使いたい

しかし、このままでは今回作成したプロジェクト内でしか利用することができません。そこで、以降に作成するプロジェクト全てに自動的に反映されるように工夫しましょう。と言っても非常に簡単です。windowsでは

"unityのアプリケーション位置"\Unity\Editor\Data\Resources\PackageManager\ProjectTemplates\

にデフォルトのプロジェクトが用意されているので、ここに作成したファイルを入れてやるだけです。
今回はcom.unity.template.3d\Assetsに入れてみます。

それでは試にプロジェクトを作成してみましょう。

2018-11-26_20h49_05

プロジェクトに先ほど作成したファイルが存在していることが確認できると思います。

おわりに

日々利用するアプリケーションだからこそ開発環境を自分好みにカスタマイズすることが大切ですね。unityのエディタ拡張は専用のメソッドが多く、わかりにくいように感じられますが、「全てを理解する必要はない」と割り切ってしまえばそう難しくもないと思います。実際エディタ拡張ばかりではいつになってもゲームは完成しませんしね。

それでは明日以降も部員たちによる個性的な記事が投稿されることを期待して本記事を締めさせて頂きます。

矢上祭とSwitch

チョコです.

矢上祭,お疲れさまでした.

今年もぴょんぴょん(+)人気だったな,,,,思った以上に「面白い」,「ハマる」って感想いただけてすごくうれしかったです.

 

さて,ぴょんぴょんですが,去年のゲームジャムで3日で作ったにして結構人気があったシューティングゲーム.今年用に二人プレイできるようにしたのと,かわいいかわいいKCSちゃんモードを入れました.

3

図1:ぴょんぴょん+の宣伝図(宣伝してない)

このゲームを毎年プロジェクターを使って大画面でやるのが恒例なのですが,KCSは Oculusを買う金はあるのに 同じコントローラーを二つも持っていません.ではここで,「試しにNintendo SwitchさまのJoyconを使ってはどう」という発想に至ったわけです.

さっそくSwitchを借りて,やってみよう!と思ったわけですが,ここでとても重要な2ポイントがあります.

1.PCにはBluetoothで通信できる

2.UnityはJoyconをコントローラーとして認識できる

まさに神.2秒で移植できるじゃん.(1日かかりました)

(1ですが,Joyconの上にある小さいボタンを長押ししながらpairingをしないと認識できません.)

とりあえず,ボタンを軸登録することですね.なお,キーボードででも同じ操作ができるように,以下のような入力ラッパーを書きました.

public static bool jbt(int i, int j) {
    return Input.GetKey("joystick " + i.ToString() + " button " + j.ToString());
}
public static bool jump(int i) {
    return Input.GetKey("space") || jbt(i, 4);
}

リスト1:InputManager.csの一部

ボタンのIDはこんな感じですね.

httrhgtrh

図2:JoyconのボタンID

Bluetoothの登録順でjoystick 1, joystick 2, …で決まりますね.つまり,複数台Switch持ってれば(ry

 

最後に,Input.GetButtonDown(“Jump”)を全部InputManager.jumpに変えるだけですね.

 

あ,そう.あとは一人プレイ用に書いたガバスクリプトを二人プレイにしたときに発生したバグの塊を解消する作業ですね...

 

来年も出したいな,,,(卒業しなくていいの?)

完.

UnityでのDeferred Celシェーディング

どうも,チョコです.院試おつ↓かれ↑ーい.

いつものUnityでのCelシェーディングをやっていました.しかし,シェーダを全部Cel式に変えるのはめんどい.そしてunlit shaderで照明を扱うのはどうも釈然としない.そこで,Deferredでなんとかならない?と思ったわけです.

UnityではDeferredの内部シェーダを変えられるようになっています.このように.

(Edit->Project Settings->Graphics)

Screenshot (13)

ここに自分のシェーダを突っ込めば,カメラの出力を制御できるというわけですね.

さて,これをやるにはまずbuiltin_shadersアセットをダウンロードしないといけない(ダウンロードページにあります).そして,Internal-DeferredShading.shaderを見つけます.

シェーダを中を見ると,おっと,この部分は画面に色を吐いているなと,読めばわかると思います.

half4 CalculateLight (unity_v2f_deferred i)
{
    ...
    half4 res = UNITY_BRDF_PBS (data.diffuseColor, data.specularColor, oneMinusReflectivity, data.smoothness, data.normalWorld, -eyeVec, light, ind);
    return res;
}

なるほど.つまり,ここの戻り値を変えればいいと.さて,Celシェーディングでやりたいことを確認しましょう.

deftoon

図の通り,まずは白の材質に対しての照明を得て(1),そしてCel風のカーブにし(2),最後にDiffuseを適用(3)すればいいです.上のコードを書き換えましょう.

uniform float _deferred_cutoff;
uniform float _deferred_shade;
uniform float _deferred_saturate;
half4 CalculateLight (unity_v2f_deferred i)
{
    ...
    half4 inten = UNITY_BRDF_PBS (half3(1,1,1), half3(0, 0, 0), 1, 0.5, data.normalWorld, -eyeVec, light, ind);
    float brg = clamp(ceil(inten.r - _deferred_cutoff), 0, 1);
    float shd = 1-((1-_deferred_shade) * (1-data.smoothness));
    return half4(saturate(data.diffuseColor * (brg * (1-shd) + shd), 1 + _deferred_saturate - (_deferred_saturate) * brg), 1);
}

(デフォルトシェーダの仕組みはどこにも書いていないので,関数の意味などはCGIncludesの中身を自分で読まないといけませんね)

はい.ここで,UNITY_BRDF_PBS は(1)なので,それを(2)にしたのがbrgとなって,最後にdata.diffuseColorを適用しました(3).

最後に,Inspectorでデフォルトのシェーダを変えよう.そしたら(エラーがなければ)オブジェクトのマテリアルを一切触っていないのにカメラの出力が変わります.

Screenshot (12)

これで1つのシェーダでアニメ風にできますね.スタイル変換捗りー.

(実はこの方法は,照明ごとに行われるので,光が重なるととても明るくなります.解決したらパーツ2の記事にします)

では.

unityで外部テキストをC#コードとして読み込む

こんにちは。mo-takusanです。

今まではほとんど記事を書いてこなかったのですが、さすがにそろそろ投稿していこうと思います。

unityで外部コードを読み込むには…

最近とある事情でコンパイル後に外部ソースコードを読み込みたい、という場面がありました。

「あああ、Python書くかぁ」

となっていたのですが、念のため調べると、C#はコンパイル言語ですが、ランタイムでコンパイルができるようです。C#神!!やっぱり.NET最強!!!

ただし、untiyとの相性が悪いものが多く、四苦八苦してしたので、紆余曲折の様子を記事にしていきます。

なお、本記事で使用したunityのバージョンは2017.1.1f1です。

まずはできた方法を、、

まあ、とにかく知りたいのは実際にうまくいったやり方でしょう(需要があれば)から、その方法から話していきます。

なんだかんだとググっていくうちに以下のGitHubにたどり着きました。

https://github.com/aeroson/mcs-ICodeCompiler

このサイトを見たとき、ついに来た!最終コミットもそれなりに新しいしこれはいけるやろ!と思ったのですが、ここからが長かった…(unityのバージョンを合わせればよかったとかそういうツッコミはなしでお願いします、、、)

2018-02-07_23h38_41

早速クローンしてサンプルプロジェクトを開いてみると…

2018-02-07_23h42_07

地獄絵図…。unityはICodeCompilerやCompilerResultsが存在していないと主張してくるのですが、

https://msdn.microsoft.com/ja-jp/library/system.codedom.compiler.icodecompiler(v=vs.110).aspx

https://msdn.microsoft.com/ja-jp/library/system.codedom.compiler.compilerresults(v=vs.110).aspx

のように、System.CodeDom.Compiler名前空間には確かに存在しています。実際コードの方でもusingされており問題はなさそうです。やけくそで丁寧に書き直してみても全然ダメ…

2018-02-07_23h45_47

うーーーん。

これについては解決方法が全く分かりませんでした。ので、ダメもとで一緒にクローンしてきた「non Unity3D usage」のコードを新規プロジェクトに入れてみました。dllはPluginsに入れることを忘れずに…

2018-02-08_00h03_29

おや?エラーが出ない!
やった…やったよ、、おれ、ついにやってのけたよ…
そうするとデモが動かなかった理由がいよいよ謎ですね。

それはともかくとして、あとは適切にファイルを読み込むコードを書いて、、、

 private static Assembly Compile(IEnumerable&lt;FileInfo&gt; files)<br />
 {<br />
     var domain = AppDomain.CurrentDomain;<br />
     var references = domain.GetAssemblies().Select(a =&gt; a.Location).ToArray();<br />
     var options = new CompilerParameters<br />
     {<br />
         GenerateExecutable = false,<br />
         GenerateInMemory = true,<br />
     };<br />
     options.ReferencedAssemblies.AddRange(references);<br />
     var compiler = new CodeCompiler();<br />
     var result = compiler.CompileAssemblyFromFileBatch(options, files.Select(f =&gt; f.FullName).ToArray());<br />
     return result.Errors.Count &gt; 0 ? null : result.CompiledAssembly;<br />
 }

完成しました!!!
なお、こちらのプロジェクトは諸事情で公開していないのであしからず。

ここからはできなかったことを書くぞ!

と言いましたが、疲れたので失敗の様子はダイジェストでどうぞ

System.CodeDom.Compilerを素で使う

なぜかコンパイルすると動かない(unityではよくある泣)

AssetStoreからダウンロード

https://assetstore.unity.com/packages/tools/cs-script-for-unity-23510

このページにいい感じのアセットがあったのでダウンロード。が、だめ。(古かった)

Roslynを使う

unityが.NET4.6に対応したことを利用して、次のサイトを参考にして組んでみよう!

https://www.gaprot.jp/pickup/tips/roslyn

unityが反応してくれない!おい!!nugetからdll落としてPluginsに入れてもダメでした。(むしろそれ以外を知りませんが)

脱出ゲーム(新歓バージョン)近日公開予定!(追記あり)

(2017/4/2追記) 以下にて公開開始しました!(PCブラウザのみ対応) https://kcs1959.jp/dassyutsu2017

こんにちは、GMAです。

近日以下のゲームを公開予定です。

KCS新歓用
※画像は開発中の画面です

なんとなく見覚えのある方は鋭いですね。このゲームは2015年度の三田祭の為に作られた3D脱出ゲームです。昨年UnityがWebGL書き出しに対応し、そろそろホームページにもゲームをアップしたいなと考えていたので、新歓期に合わせてこのゲームを公開することとなりました。

ただ、折角の新歓ですので、オリジナル版にあった通常モードに加えて、今回新たな新歓特別モードを追加しました!このモードは、

  • KCSにちなんだ完全新作の謎解きが楽しめる!
  • KCSや慶應大学に関する様々な豆知識が学べる!
  • 遊ぶときっとKCSに入りたくなる!

という新歓期にとてもぴったりなモードです!

新モードの追加以外にもグラフィックのリファインや操作の改良など、2015年版から様々な箇所に手を加えていますので、遊んだことがある方も無い方も是非挑戦してみてくださいね!なお、このゲームはこのページやトップページに公開予定です。

それでは。

ホラーゲーム作ります:テクスチャ・演出・D言語くん

バイオ7出ました。素晴らしくて泣いた。決して怖くて泣いたのではありません。

せっかくなので試しにホラーゲーム作ってみたい。ホラーゲームも一人称ゲームも作ったことないし。

早速モデル作りました。こんな感じです(Blender内です)
asdfasdf

これどっかで見たような。。って思ったあなた、友達になってください。
(がっこうぐらしですねはい)

でもこれテクスチャがないとあまり怖くないですね。SubstancePainterに移りましょう。(ここから宣伝)

まず古い校舎感を出すために、「Coarse cement」のレイヤーに「Fine cement」をかけて、マスクで削る壁を演出した。さらにその上にほこりを載せる。

Screenshot (683)

おお、いい感じ。(これにはあらかじめ分割したモデルをベースにノーマルなどをベークした(例の椅子のヤツです))

では、ちょっと血を入れます。物理エンジン(?!)が使えるので、HeavyLeakingやBurn効果(Diffuse色やSpecular, Glossinessをいじったもの)を使ってみよう。

血はDiffuse #770000 Specular #ff6666 Glossiness 0.3かな(だいたい)。旧い血痕はSpecular低めで。

particles

グロ。でも好き。

さて、これをUnityにエクスポートしよう。Export Textures押すとUnityのStandard Materialがすぐ使えるDiffuse, Specular, Normal, Height, Occlusionマップが生成される。これを適用してみよう。

普通の照明じゃ面白くないので、カメラについているSpotlightで照らそう。

Screenshot (727)

怖い怖いちょっと待ていい雰囲気じゃねぇか。ほんとのホラーゲームっぽいぞ。(ホラーゲームです)

 

他のアセット:

1.KCSxUnity本

Screenshot (693)

2.D言語くん Screenshot (719)

↑Sketchfabはいいぞ。

この感じでアセットを作ると超便利で速い!

 

(ネタばれしたら実際のプレイも怖くなくなるので、他のシーンのものは見せられません。お楽しみに。)

では。

Virtuleap WebVR Hackathonに出た話

こんにちは.Kishiです.

2017年になりましたね.昨年はVR元年と言われていましたが,今年のVRは果たしてどうなるのでしょう.

自分は,これからのVRでは他者とのインタラクションという部分も発展していくと考えています.FacebookがSocial VRというものを推し進めていますが,これがもっと自然な形になれば普及する可能性はあると思います.

ここで,現在発展途上のVRの分野にWebVRというものがあります.これを使えば,上に述べたようなVRができるのではないかと思い,2月1日まで開催されているVirtuleap主催のWebVR Hackathonに参加しました.

現在VRの開発環境としてはUnityやUnreal Engineが有名ですが,どちらも今のところWebVRには対応していません.ですから,今回はThree.jsとWebVR Boilerplateを使ってWebVRを実現しました.また,A-Frameも有名ですが,今回は使いませんでした.

自分は他者とともに同じ空間でVRをやりたかったので,マルチプレイ機能を実装することになりました.このためにNode.jsでSocket.IOを使いました.

こうしてできたのが, SphereBlast です.手軽にプレイできるように,Cardboardがあれば誰でもアクセスするだけでできるようになっています.具体的な内容としては,各プレイヤーは球状の乗り物に乗っており,迷宮,山,城を散策できるというものです.山には拾って渡すことのできる星が落ちていたり,城には逃げる鳥がいたりします.

ハッカソンの結果としては,ダメでした.やはり同時にプレイする人のいるほどにぎわっておらず,それに今回のハッカソンではHTC Viveなどの最新機器を持っていることが前提のような作品が多く,趣旨もそのようでした.とはいっても,Node.jsを使ったのも今回が初めてでしたし,いろいろ良い経験になったと思います.そういうことにします.

thumbnail_sphereblast

Unityを拡張しよう!#2: 表面分割アルゴリズムの実装(Part 1)

どうも、チョコです。あけましておめでとうございます。

さて、今年初の記事です。わーい。
(もともと去年に完成させたいものですが、バグが出てきてそのまま年越えましたorz)

さて、今回は”Catmull-Clark 表面分割をUnityで使いたい!”と思ったので作ってみました。はいストップ。Catmull-Clarkは何ぞや。説明します。
Catmull-Clark Subdivision Surfaceとは、とあるメッシュを分割し、比較的に滑らかな四角ポリゴンからできたメッシュにするアルゴリズムです。

ニホンゴデハナシテ。

見ていただいた方が早いので、↓の通りピラミッド、キューブとn角はてなメッシュを表面分割させました。

screenshot-426

あらきれい。滑らかになってますね。
ちなみにBlenderではこのようにModifierを追加することで表面分割させられます。

screenshot-428

Catmull-Clark出てきましたね。

では、これをUnityに入れたいと思います。ちょっとまて。なんで入れるのかな。Blenderではもうこの機能ついてるのに??

答え:>>>アニメーションのためです!ボーンを付けてアニメーションさせたところ、Modifierは全部消されてしまいますボーンModifierの前に適用されます。じゃあそもそもボーンの後に表面分割する必要ある?って思ったあなたへ、下の図をご覧ください。

screenshot-434

足ですね。曲がるところに頂点がないことを確認してください。
でもちょっと頂点数少ないので、表面分割しましょう。

screenshot-422

円滑になりました。でも左の方はなんか不自然ですね。これは分割してからボーンを付けたせいですね。曲がるところに頂点が入ってしまいますので、これを2本のボーンだけでは数学的には右のような形にはできません。説明略。
右のほうを見ると頂点は全く同じで、ただボーンと分割の順番を逆にしただけできれいになります!!

疲れた。まだ本文に入っていない。まだちょっとありますので我慢してください。

では、このアルゴリズムをUnityに入れ(たいと思い)ます。Catmull-ClarkのWikipediaページをご覧いただくと、頂点の関係式は中学レベル以下ですね。記事書く必要ある??って思うかもしれません。こんなの3秒で書いてやる!とか、思いましたか?私か思いました。orz

さて問題:よく読むと、このアルゴリズムはN角形に対応しています。そこでUnityは、なんと、三角形(時には四角形)しかできないのです!!!

それだけではありません。メッシュを分割させるために、ボーンに変形された頂点位置が欲しいが、これも、なんと、シェーダー側でしか手に入れられないのです!!!(実はBakeMesh()関数もありますが、indexなどがめちゃくちゃかつ遅いのでやめました。)

ち。面倒なことになってきましたね。そもそも面のデータが取れないのに、どうやって実装するんだ。

あれあれ、この前も記事書きましたよ?この記事#2ですから、#1はどういう内容かな。
それはなんと、Unityにimportされないデータを読み取れるエディタースクリプトでした!!!!!パチパチパチ。
リンク張っておきます。

(ここからが実装の本文になりますが、正直いちいち説明するのがめんどいので手順だけ紹介します。詳しく知りたい人はGithubページへ)

まず、1で作ったスクリプトをEditorで呼ぶことにしました。.netでBlenderのexeを見つけて、それにアセットを入れて、同じフォルダーにデータを出力させました。こんな感じです。(.blend)の隣のn++ファイルが出力ファイル。

screenshot-429

これで面のデータが取れますので、これを表面分割アルゴリズムに突っ込みます。中学レベルの数学なので省略。
*ここでは、頂点を生成するアルゴリズムを実行しました。この関数はStart時点に一回だけ実行したいので、頂点関係をあらかじめバッファーに入れました。データ構造以下のようです。

screenshot-430

次に、変形された頂点の位置を読み込み、関係式に突っ込みたい。あれ、データが入手できない。ち。

シェーダーを使うしかないですね。では、どうやってシェーダーから頂点データを出力すればいいんだ?

やり方は2通りあります。テクスチャに書き込むか、ComputeBufferを使います。

テクスチャ使ったら、まあそれは簡単になりますし、一般のパソコンでも動くでしょうけど、分割したいメッシュ1体につき、カメラが一個増えます!!
仕方ない。ComputeBufferを使います。

待てよ、ComputeBufferつうのは、シェーダー語のRWStructuredBufferなので、行列のindexはどうするんだ??
indexは頂点のindexと同じなので、シェーダーが今レンダ―している頂点のindexを分かればよいのです!。。。どう渡すんだ?

答え:>>>UVマップを使います!!そもそも最終的にオリジナルメッシュは見えないので、UVを使っても問題ない!!

というわけでシェーダーはこんな風になります。

screenshot-431

さすがに長すぎますので、Part 2に続きます!戻ってくるぜ。

DragonDusk コミケに出すVRゲーム

こんにちは.Kishiです.

KCSは木曜日 西地区“み”ブロック-34a に配置されました.

そのため,最近はコミケ向けの活動が多くなっています.周りを見ると,新刊本「KCS Tips!」の執筆が着々と進んでいて,みんな頑張っているなぁ…と思っておりました.ここで改めてKCSの出品する内容を見てみると,なんとソフトウェア「KCS-SOFTWARE!」も出すんですね.そういえば,自分も何かVR出すよ,と言っていたような…(˘ω˘)

はい.早急に取り掛かりました.まるでゲームジャムをやっているようでしたが,完成しましたので下に動画を載せておきます.

VR空間内では移動や攻撃が難しい課題です.最近はコントローラのあるVRも増えてきましたが,Cardboardの場合はなかなか厳しいです.そこで,それならば移動も攻撃も他人任せにしてしまおうということで,すべてドラゴンに任せました.自分のすることは,ドラゴンの攻撃対象を目線で指示してあげるだけです.3Dモデルはすべて昨年のVSGで使われた,サークル内で制作されたものです.(音楽はKCS音楽班のものではなく,VSGと同様にこちらを使わせていただきました)このゲームはAndroid専用でかつCardboardが必要ですのでご注意ください.

2016/12/27追記・・・Oculus Rift DK2用のものも用意しました.Unity 5.5からDK2向けビルドのできる5.3に下げるのが大変でした.

「KCS-SOFTWARE!」にはこの他にも,

・研究映像

・イラスト(原画,制作の流れ付き)

・暗〇ゲーム(PC向け)

・Conway’s Game of Life(ブラウザで動作)

・3Dモデル(4体)

が含まれておりますので,KCSのブースに来ていただきましたらぜひご購入ください.

新刊本「KCS Tips!」もよろしくお願いします.