Game制作

Unityなどを用いたGame制作

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!」もよろしくお願いします.

 

Unityを拡張しよう!#1: .Blendファイルを使いこなそう!

どうも、チョコです。

Unityで「これやりたい!」って思ったとき、機能不足でできないこと多いよね。拡張(エディタースクリプト)を書けばいいんだけど、そもそもアセットで使えるデータが限られているからできない。。。なんて思ったことあるかな。

今回はBlenderファイルをUnityで開いて、普通じゃ手に入れられない情報を抽出してみよう!

**この文書を読むにはUnity、C#、Pythonと英語(?)の前提知識が必要です。

Blenderを背景で開く

Blendファイルを読み取るためには、ユーザーが(当然ながら)Blenderを持っていないとできないので、まずBlenderの居場所を確認する。Windowsの場合は、RegistryEditorのSOFTWAREMicrosoftWindowsCurrentVersionUninstallキーにあります。

**注意:RegistryEditorをいじる時に注意してください。変なものいじったりしまうとOSが動かなくなる場合があります。

このキーの中にはすべてインストールされたプログラムが入っているので、Blenderのキーの存在を確認します。

screenshot-246

あった。ではここからBlender.exeの場所を出そう。

<br />
using (RegistryKey key = Registry.LocalMachine.OpenSubKey (registry_key)) {<br />
    foreach (string s in key.GetSubKeyNames()) {<br />
        using (RegistryKey key2 = key.OpenSubKey(s)) {<br />
            if ((string)key2.GetValue(&quot;DisplayName&quot;, &quot;&quot;) == &quot;Blender&quot;)<br />
                location = (string)key2.GetValue(&quot;InstallLocation&quot;, &quot;&quot;) + &quot;Blender.exe&quot;;<br />
         //なんかする<br />
        }<br />
    }<br />
}<br />

**細かい説明は省略させていただきます。(レポートまだ書いてないorz

BlenderでPythonスクリプトを実行

Blenderは、アッドオンやTextEditorでPythonスクリプトを実行し、シーン内のデータを編集したりできます。これを活かしてみよう。具体的には、Pythonを実行し、Unityのアセットフォルダになんか書き込もう。

まず、「System.Diagnostics.ProcessでBlenderを起動し、Pythonを実行して、自動で閉じる」のを背景でやってもらおう。Blender APIに書いてある通り–backgroundコマンドを送ります。
fileはアセットの中の.Blendのパス(例えば、F:/MyProject/Assets/Hoge.blend)。
**以下のコードはエディタースクリプトに入れます。やり方省略

<br />
Process.Start (location, file + &quot; &#8211;background&quot;);<br />

これでBlenderは背景起動された。コマンドみたいなものが起動されますね。

では、Pythonスクリプトを実行しよう。まずはこのスクリプトを実行してみよう。

<br />
Process.Start (location, file + &quot; &#8211;background &#8211;python &quot; + Application.dataPath + &quot;/Editor/hoge.py&quot;);<br />

そして、エディターフォルダに以下のhoge.pyを入れよう。

<br />
import bpy<br />
import sys<br />
class Hoge():<br />
 def execute(self):<br />
   print (&quot;hi&quot;)</p>
<p>if __name__ == &quot;__main__&quot;:<br />
 Hoge().execute()<br />

コマンドにhiが表示されたら勝ち。

次に、pythonスクリプトにパラメータを送ろう。 — のつぎに来るものがコマンドとしてパースされないので、pythonに使えばいいね。例えば、今のアセットフォルダの位置を渡してみよう。

<br />
Process.Start (location, file + &quot; &#8211;background &#8211;python &quot; + Application.dataPath + &quot;/Editor/ExportSS.py&quot; + &quot; &#8212; &quot; + new DirectoryInfo(file).Parent.FullName);<br />

**Python側では、sys.argv[sys.argv.index(“–“) + 1:]でパラメータ行列を取れます。

さて意味のあるものができるようになった。できることはさまざまあるが、例としてシーン内の「メッシュではないオブジェクト」の名前を出力してみよう。自明のコードは省略。

<br />
args = sys.argv[sys.argv.index(&quot;&#8211;&quot;) + 1:] #パラメータを取る<br />
scene = bpy.context.scene<br />
obj = bpy.context.active_object<br />
dir = args[0]<br />
name = args[1]</p>
<p>def execute(self):<br />
    if os.access(self.path, os.W_OK) is False:<br />
        print(&quot;permission denied : &quot; + self.dir)<br />
    return False<br />
    self.path = os.path.join(self.dir, self.name + &quot;.txt&quot;)<br />
    print (&quot;writing to: &quot; + self.path)</p>
<p>    with open(self.path, &quot;wb&quot;) as file:<br />
    for obj in self.scene.objects:<br />
        if obj.type != &#8216;MESH&#8217;:<br />
            self.write(file, obj.name + &quot;rn&quot;)<br />
    sys.exit() #自殺</p>
<p>def write (self, file, _str):<br />
    file.write(_str.encode())<br />

すると、.Blendファイルと同じ名前の.txtファイルができます。

以上、拡張機能でした。なんかやりたいときに使えるとうれしい。
では。

Oculus Rift DK2で使えるコントローラを作ってVR音ゲー作り

お久しぶりです.Kishiです.

一切誰も記事内で触れていませんが,KCSは三田祭に出展します.それに向けたチーム制作も複数動いています.やはり,記事にしないと外部に伝わらないので,それぞれのチームに記事を書いてもらおうかな….

さて,KCSはVR,Virtual Realityにも力を入れています.昨年はOculus Rift DK2を購入してこれを三田祭でのゲーム制作に利用したところ,非常に好評でした.(→VSG

最近の世の中を見ると,HTC ViveやOculus Rift CV1,PlayStation VRが出てきてVR業界は非常に盛り上がっています.KCSは昨年DK2を買ったばかりなので今年の三田祭には昨年同様DK2を用いることになりましたが,ここであることに気づきます.

コントローラがない…!

ナウいVRには皆,VR空間に直接干渉できるコントローラがあります.しかし,DK2にはありません.

そこで,一切のお金を掛けずにコントローラを作ってみました.正確には,昨年サークルで購入したWebカメラと色のついた紙とマスキングテープと労力で作りました.

dk2-controller2

dk2-controller4

簡単に説明すると,色認識をしてコントローラの位置を把握し,これとVR空間内の物体をリンクさせています.(簡単に説明も何もそもそも簡単な原理だった.)

これを使って音ゲーを作りました.音楽はKCSの音楽班が提供してくれました.ありがとうございます.

今年は他にも多くのVRゲームが展示されます.もちろん,VRでないゲームや,KCSの技術力の詰まった(自分には全く理解できない)展示もあります.ぜひお越しください!

UnityでUWP(Windows Store)アプリを作るときに気を付けること

こんにちは。Kishiです。

まずは宣伝。以前紹介したアプリの公式ホームページができました。

http://trsasasusu.sakura.ne.jp/spinactioncreator/ja/

では、本題。

Unityは本当に様々なプラットフォームに対応しています。その中にUWP、Universal Windows Platformも含まれています。そこで、せっかくスピンアクションクリエイターをAndroid向けに出しているのだからこちらにも進出してみようということで、Android版から何も変えずにBuild SettingsからSwitch Platformしてビルドしてみました。

すると、エラーが出るわ出るわでビルドできませんでした。

最終的にはリリースまでこぎつけたのですが、そこまでにぶつかった壁を紹介していきます。

1. AES問題

このゲームではAESを用いて暗号化していたのですが、なんとAesManagedなどの暗号化で通常用いられているクラスが使用できないのです。そのため、

<br />
#if NETFX_CORE<br />
// UWP用の処理<br />
#else<br />
// その他のプラットフォーム用の処理<br />
#endif<br />

を用いて他のプラットフォームと分岐させなければなりません。UWP用の暗号化については、 http://qiita.com/utisam/items/4ff154335519650d189b#_reference-834101a5ec3afe6a51acが非常にわかりやすいです。

2. StreamWriterのClose()がない

ただびっくり。Dispose()を使いましょう。

3. シェーダーでTRANSFER_SHADOW(o)が使えない

必要な場所でこれがないと死ぬプラットフォーム(Androidで強制終了くらった)と、これがあると死ぬプラットフォームがあるので注意。

4. タッチのできるデバイスとできないデバイスがある

公式にこれに対応するためのソースコードが出ていますが、以下の

<br />
UnityEngine.WSA.Application.InvokeOnUIThread(() =&gt;<br />
    {<br />
      isInTouchMode =<br />
        UIViewSettings.GetForCurrentView().UserInteractionMode ==<br />
        UserInteractionMode.Touch;<br />
    }, true);<br />

<br />
UnityEngine.WSA.Application.InvokeOnUIThread(() =&gt;<br />
    {<br />
      isInTouchMode =<br />
        Windows.UI.ViewManagement.UIViewSettings.GetForCurrentView().UserInteractionMode ==<br />
        Windows.UI.ViewManagement.UserInteractionMode.Touch;<br />
    }, true);<br />

としないとビルドできません(または、usingするか)。そもそもタッチのできるWindowsデバイスを自分は持っていないので本当に動いているのか検証できていません。(おそらくテスターの方々によるテストを通っているので動作しているのだと思います)

5. Handheld.PlayFullScreenMovie()に注意

StreamingAssetsに入れたビデオが再生されなくてびっくりしました。公式には確かに使えそうなことが書いてあったので。そこで、調べてみるとどこかの海外のフォーラムにて、第1引数を

<br />
&quot;hoge.mp4&quot;<br />

から

<br />
System.IO.Path.Combine(Application.streamingAssetsPath, &quot;hoge.mp4&quot;)<br />

と書き直すと動く、と書いてあったので実際にやってみたら動きました。Android(おそらくiOSも)だったら省略できるのに…。

 

ここからは、.slnを作った後の話です。

6. ここまで来てビルドできない

UWPアプリをUnity以外で普通に開発するときのクラス名と被っているとエラーが出ます。自分はUnityで独自にFileIOクラスを作っていたので、これと被ってエラーを吐かれました。Windows.Storage.FileIOというように名前空間を直接つけて修正しましょう。

7. Debugビルドの実行が異様に遅い

普通の動作テストはReleaseビルドで行いましょう。そして、リリースするときはMasterビルドにしましょう。海外のフォーラムにも結構上がっています。

8. Masterビルドのx64版が死ぬ

正確には、uGUIのScroll Rectが死にます。他にも何か死んでいて、もう実態がつかめないのでx64版はあきらめました。x86版とARM版だけで行きました。

 

ここからはリリース前後の話です。

9. 手続きが大変

これはしょうがないです。決められた大きさのスクリーンショットが必要だったり、課金のために条約が何とかあったりといろいろありますが、がんばりましょう。もちろん認定のために審査があるので、Androidに比べてリリースには時間がかかります。

10. 突然の更新リジェクト

謎。テスターへの文面を英語と日本語両方で丁寧に書いたら通りました。

 

とりあえず、以上です。予想以上に大変でしたが、無事リリースできました(宣伝)

以下の公式バッジは https://developer.microsoft.com/en-us/store/badges で作ることができます。

Get it on Windows 10

スピンアクションクリエイターはWindows Storeで「ゲームを作る」と検索するだけで候補に出てきます。この記事を読んで役に立った方は、ぜひ評価をしていただきたく存じます。そうしていただけるとものすごく嬉しいです(ものすごくものすごく宣伝)

Spin Action Creator スピンアクションクリエイター

お久しぶりです。Kishiです。

前回の自分の記事で8月中にトレーラーを出したいと書いておきながら、気が付けば9月になっておりました。

自分だけのアクションゲームのステージを2Dにおいても、3Dにおいても作成できるゲームです。

https://play.google.com/store/apps/details?id=com.trsasasusu.spinactioncreator

 

Get it on Google Play

以下は動画です。

サムネイル

Screenshot_2016-09-02-00-39-17

メタボールで洞窟

こんにちは。Kishiです。Unityで洞窟を作りました。

kcs_cave

メタボールをつなげ、さらにその法線を反転させることにより、任意の洞窟を作ることができます。

具体的には、マーチングキューブ法を使っています。その実装は、まず等電位面を計算し、そして空間を小さな立方体に分割して(ここであまり細かく分割するとUnityが固まるので注意)、その閉曲面内に各々の立方体の頂点が入るかを調べて入っている頂点を線形補完してつないで、そしてひたすら面を張っていくという単純なものです。Unityには最大頂点数があるのでこれをいかに超えるかが面白いところだと思います。

(テクスチャをもう少しきれいに貼りたい)

さて、8月には自作ゲームをリリースしようと思っているので、どこかのタイミングでトレーラーを出したいなと考えています(いつだろう)。

Unityにおける親子関係構築時のサイズ変更問題 その2

こんにちは。Kishiです。

昨年、Unityにおける親子関係構築時のサイズ変更問題 という記事を書きましたが、これでもまだ解決できない場合があることに気づきました。

まず、このときの記事の概要はUnityにおいて親子関係を構築した時に子供のサイズがおかしくなるというもので、これはヒエラルキー上で

<br />
▽親オブジェクト<br />
  ▽New Game Object<br />
     子オブジェクト<br />

のようにすればよく、つまりスクリプトにおいて

<br />
// parentObjectは親オブジェクト, childObjectは子オブジェクトを指す。<br />
GameObject emptyObject = new GameObject();<br />
emptyObject.transform.parent = parentObject.transform;<br />
childObject.transform.parent = emptyObject.transform;<br />

とすれば解決できるというものでした。

しかし、今日親のRotationを変更した状態で親子関係を構築したら再びこの悪夢がやってきたのです。

kcs_lift

今回はGoogle検索は使わずRotationを手掛かりにスクリプトを書いてみたところ解決したので、これを以下に残します。

<br />
// parentObjectは親オブジェクト, childObjectは子オブジェクトを指す。<br />
GameObject emptyObject = new GameObject();<br />
emptyObject.transform.rotation = parentObject.transform.rotation; // この行を追加。<br />
emptyObject.transform.parent = parentObject.transform;<br />
childObject.transform.parent = emptyObject.transform;<br />

↑のように1行加えるだけで解決しました。

ちなみに、この写真はスピンアクションクリエイターからです。

Unityで関数の引数にListを使うと…

こんにちは。Kishiです。

ある日、Unity Editor上で軽快に動いていたアプリをAndroid向けにビルドしてみました。そして、いざ実行してみると…、

動かない。

正確には、アプリの一部の機能が動かないのでした。そこで、デバッグのためにDevelopment Buildにしてみると…、

こいつ・・・動くぞ!

訳がわからない。

とりあえず適当にデバッグしていると、Listを引数にとる関数が怪しいとわかりました。そして色々テストした結果、驚愕の事実が判明しました。

その関数内で引数にとったListをAddしたら異常終了する環境がある。

はい。しょうがないですね。意味はないかもしれないですがrefにしてもダメでした。

仕方がないので、Listをメンバ変数にすることでうまくやり過ごしました。みなさんも気をつけましょう。

以上。