"そこ"から這い上がるブログ

プログラミングと電子工作が趣味でそこら辺のことを備忘録的に書きつつ這い上がっていこうといったブログ。そこ這い。

Unity1週間ゲームジャム「space」に参加しました~

何度か開催されていて、参加しようとするもののなかなか公開するまでに至らなかった

unityroomさんで行われているUnity1週間ゲームジャムにようやっと参加しました!
ゲームは「すきまシューター」今回unityroom初投稿です。
やりきった感想としては公開してよかったぁーと。
1週間といってもフルで使えるわけではないので、妥協した部分も多々ありつつも公開できる段階までもっていくというのはやっぱり大変ですね~。
作ってて楽しい部分だけをやっていても通して遊べるゲームにはならないというのを改めて再確認しましたね。これまではそれで公開までもっていくことが出来なかった感があります......

それはそれとして今回作ったゲームはお題の「space」から空間→隙間と考えまして、すきまにすぽっ!と収まるゲームを作ろうという感じに決まりました。
最初は自動販売機のすきまとか人と人のすきまとかも考えていたのですが、時間的、素材的に考えて、部屋のすきまに収まるというのだけで3ステージ作ることになりました。

f:id:knasa:20171126050624j:plain

ゲーム画面はこんな感じで、画面下中心にいるこはくちゃんズが1人、らっここと神林ゆうこ氏を左上のすきまにすぽっ!とすればクリアという簡単なものとなっております。操作も簡単でらっこをドラッグでひっぱって離せばしゅーっと滑るというまぁよくある操作システムでございます。
ギミックを付けたり、ステージを大きくして回数制限をつけたりなどやりたいこともありましたが、今回は間に合わなかったのでパスです。唯一ギミックがあるとすればクッション等にあたるとそれらも一緒に滑るぐらいなもんです。

今回ステージを作るにあたってアセットの力を存分にお借りしました。それがこちら「Anime Rooms」です。

名前の通りアニメ風トゥーンな感じの部屋+家具モデルのアセットです。絵は女の子の部屋風ですが男の子の部屋もあります。これがまぁかわいいし、雰囲気がいい感じなんですよね。今回雰囲気をほんわかな感じで行こうとしていたのでカンペッキなアセットでした。このアセットを使ってのアイデアが他にもあるのでこれからもお世話になりそうです。

そしてゲームに欠かせない音楽部分ですが、これは以前セールの時に買っていた「Game Music Pack - SUITE」を

10ドルでありながらかなりの量のループ対応のBGMが、しかも一度買えばアップデートの度に曲が追加されるというお財布にも優しいアセット。ゲームに必要なBGMは大抵ここから用意できる安心感がありますね。

そしてらっこの3Dモデルは公式からでもダウンロードできますが、「Optimize, SD Kohaku-Chanz!」を

見た目はほとんど変わらずポリゴン数が半分以下だったりと、スマホやブラウザで動かすときにはこっちの方がいいはず、という気持ちからよく使わせていただいています。
こんかいはらっこだけでしたがユニティちゃんとみさきちもゲームに登場させたいところです。

最後にらっこを体育座りさせたいなと思って、自分でモーションを作ることも考えましたが、今回はなるだけ時短をと考えていたので、アセットであるならそれを使おうと探し、見つけました。「Taichi Character Pack」です。

モデルだけでなくHumanoidなら使えるモーションも含まれていて(多い)その中から体育座りのモーションを使うことにしました。ただ座っているだけでなくて呼吸も含まれていて、痒い所に手が届くアセットでした。

f:id:knasa:20171126050602j:plain

↑タイトル画面です。やはりモデルによって差があるためか腕が膝まで届いていないですが体育座りです。Anime Roomは一枚絵にしてもいい雰囲気が出ますね。重くなっちゃうと思ってつけていませんがBloomとかをつけるともっと画面が映えます。

今回の雰囲気に合わせてフォントはほにゃ。さんのほにゃ字フォントを使わせていただきました。

f:id:knasa:20171126054850j:plain

↑のようにらっこの頭の上に表示される文字は状況によって変わるようになっています。滑っているときは「しゅー」だったり、コケると「あー」になったり。今回は3DTextをつかって配置しているのですが、本当は「Character Particle」というアセットを使ってやりたかったところなんです。

使おうとするとどうもシェーダーにエラーがあるようでピンク色のマテリアルになってしまうので今回はあきらめました......原因を突き止めて使えるようにしたいところです。

そんなこんなでゲームを何とか作ることが出来たわけですが、えいやと公開してみるとハートがついているわ、かわいいとのコメント(99%アセットパワーですが)があるわでとても嬉しい気分になってしまいますね。遊んでくれた方、コメント、ハートをくれてた方遊んでいただき本当にありがとうございます。コメント欄でお返事をするのはちょっと恥ずかしかったのでここで書かせていただきます。m(__)m
公開後にバグ情報をくれた友人にも感謝です(これから直します)

Unity1week関係なくともunityroomにまたゲームを公開したいと思います。そして目指すはストアへの公開!

Unityで任意のPlaneを作る

UnityのデフォルトのPlaneはサイズはScaleをいじれば変えられますが、メッシュの細かさを変えることはできません。
メッシュを細かくしたPlaneがほしかったので今回作ってみました。

メッシュの動的生成はこの辺りのサイトを参考に
Unity 動的にメッシュを生成してゴニョゴニョする : 超基本編 - 渋谷ほととぎす通信
Unityのメッシュ生成でへにょりレーザーを作ろう – 前編
Unity 動的にメッシュを作成する ~まずは四角形だ編~ - おねむゲーマーの備忘録

正直これらのサイトの説明でメッシュの作り方は十分な感じがあるのでサクッと

出来上がりとしてはこうなります。(左側はデフォルトのPlane)

Plane内の四角の行数、列数と縦横の長さを指定するとそれに合わせたPlaneを生成することが出来ます。(デフォルトはそれぞれ10)

Editor上でパラメータを操作して動かしたかったので

[ExecuteInEditMode]

スクリプトにつけています。


一応デフォルトのPlaneと同じものになるようにしたのですが、なぜかデフォルトのPlaneは三角形メッシュの順番が最後だけ謎です(なのでそこまでは合わせていない)


もうちょっときれいにまとめられそうですが......動作したコードは以下です。
ちなみに動画内で頂点インデックスを表示してたやつも貼っておきます。こいつは意外と使い道がありそうで便利です。

頂点数と長さを変えられるPlaneを生成する

メッシュの頂点インデックス可視化

HoloLensとPCで通信できなくなった時の対処法?

また、間が空いてしまった(n日ぶりm度目)

 

前日まで普通にPCと通信できていたHoloLensが突然つながらなくなって慌てました。
ここで言っている通信はwifi経由でのUDP通信、UnityのHolographic Remoting Player、あとDevice Portal(USB経由では繋がる)です。

Device Portalまでつながらなかったので、ポートが閉じてる?とかも考えたのですが、詳細はわからず......
結局接続先を同じルーターの2.4GHz帯だったのを5GHz帯に変えたら繋がりました。
調べてたらファクトリーリセットしたら直った!とかもあったので、そこまでいかずに済んでよかったなと......正直それしても直らなかったらどうしたらよいかわからなかった......

VisualStudioでUnityのスクリプトが開けなくなってた

最近まで試験が忙しくて色々止まっていました。
ようやっと動けるようになったのですが、久しぶりに開いたプロジェクトのC#ファイルがVisualStudioで開けなくなってました……

開こうとするとVisualStudioは固まり、VisualStudioが立ち上がってもファイルを開こうとすると

f:id:knasa:20170827174837p:plain

「破棄されたオブジェクトにアクセスできません。」と表示されてしまいます。
なぜかMonoDevelopでは開けるし、他のプロジェクトは問題ありません。

結局プロジェクトのフォルダをコピーして、別の場所で開いたら問題ありませんでしたー。

んーソリューションファイルの参照が切れてたとか……?

 

Unity用APIは別スレッドから呼び出せない?

Unity用API(MonoBehaviourを継承して使用)はメインスレッドから(UpdateやStartなど)のみでしか使えないとのことらしいです。

それが原因でHoloLensアプリが落ちるという現象に遭いました。

解決策としてはフラグを立てといて、Updateで見るようにという応急処置が多分簡単です。
……じゃあなんでUnityEditor上ではうまくいったのか……

Assembly-CSharp-firstpass.dllが見つかるようになった話

嬉しすぎてちょっと踊った。

HoloLensアプリを作るときUnityからUWPアプリ用に.slnを出力するわけですが、それをがいままでビルドできなかったわけです。

f:id:knasa:20170718231306j:plain

ちなみにこのエラーはCubeを置いただけのプロジェクトでも出ます。
HoloLensアプリを作るにはUWPアプリじゃないといけないわけで、誰かしらぶつかってるから調べればすぐわかるでしょと。調べて出てきた解決法は

・再起動すればいける

・パスが長いか、ダメな文字(全角スペース?)が入ってるからCドラ直下でいける

・.csproj書き換えればいける

でしたが、どれもうちの環境ではだめでした。

ただ別のPCでは何もしなくても普通にビルドできるので、どっかしらの設定がいけないのだろうと、だけど再インストールしてもダメだったのであきらめてました。Unity C# Projectsにチェック入れなければビルドできていたので、まぁデバッグログも見れるしいいかと。あとHoloTool-Kitはエラーを吐きながらも頑張ってビルドしてくれた(なぜか)のでなんとか。

まぁ何が不便ってUnity C# Projectsにチェック入れると上記のエラーがでる(入れなくても出るときもあった気がする)、のでUWP専用のコードの編集が辛い+毎回Unityのビルドを通す必要がある。だったわけですが、やっと見つけました。

forums.hololens.com

この中のgeorgeさんコメント

This setting is under Tools -> Options -> NuGet Package Manager -> Automatically check for missing packages during build in Visual Studio. 

 ツールー>オプションー>Nugetパッケージマネージャーの「見つからないパッケージのダウンロードをNuGetに許可」にチェックを入れるとのこと。

f:id:knasa:20170718233015j:plain

これを見たとき「へっ、どうせうちの環境では既にチェックが入ってるオチだろ」って思いながら見ると、チェックが入ってないのです!この時「よっs...いやいや、どうせチェック入れても動かないオチだろ」と思いながらビルドすると、動いたんですよ......!

georgeさんにほんと感謝です。そのあとの感謝のコメントに「将来のコミュニティメンバーのために共有してくれてありがとう!」って感じのコメントがあって、まさにその通りです。ほんとありがとうございます!

HoloLensとUWPアプリでUDP通信したかった話(した話)

もう何十日ぶりかわからない更新です。
最近はゲームAIの勉強とHoloLens、時々ステレオカメラという日々です。

さて、最近のHoloLens開発ですが、意味不明なエラーに苦しめられています。
もちろん自分が知識不足なのは重々承知していますが、それにしても!多い……HoloLens自体まだ開発者向けである上、あの値段ですから動かしている人の情報が少ないですね。こんなブログでも同じように困っている人の助けになれば幸いです。

まぁそれはさておき、本題です。

現在開発中のHoloLensアプリで、UDP通信をする必要が出てきまして、苦しみながらもなんとかそれができたのでまとめようと思った次第であります。

 まず最初にHoloLensのアプリ関してなのですが、HoloLensはWindowsが動いているということは皆さんご存知だと思います。ただそこで動いているWindowsはPCで動いているようなものではなく、タブレットやWindowsPhoneなどで動いている方に近い(同じ?)なようです。
そのため動いているアプリも拡張子.exeのアプリケーションとは違っていて、UWP(Universal Windows Platform)で動くアプリケーションなのですね。PC用のWindowsしか使っていない人でも見たことあると思います。ウィンドウの縁がないやつがそれだったりします。Windowsストアで配布しているソフトはみんなそうなんですかね(WindowsストアアプリとUWPアプリの違いはあるのかもしれませんが)。
で。HoloLensで動かしているUWPアプリと別の端末で動かしているUWPアプリでUDP通信をしたい。というのが本題です(前置きが長い)。
紛らわしいので前者をHoloLensアプリ、後者をUWPアプリという風に呼ぶことにします。

HoloLensアプリの開発のメインはUnityとマイクロソフトGitHubで公開しているHoloToolkit-Unity、そしてVisualStudioの組み合わせが一般的だと思います。動いているのはUWPアプリなのでVisualStudioだけでももちろん作れますが、HoloLensの機能を生かしていくには、あの組み合わせがやっぱいいんだと思います。なんだかんだ言ってUnityが簡単にしてくれているので。
今回の環境も同じで

  • Unity 5.6.2f1 (.Net4.6)
  • HoloToolkit-Unity v1.5.7.0
  • VisualStudio 2017

 以上の構成でお送りいたします。

なぜUDP通信をする必要があったのか、Unity同士ならUNETをはじめとするあらゆるネットワーク通信があるのですが、今回は片方がUnityを使わないUWPアプリであった、自分が前にUnityとC++のアプリでUDP通信をしたことがあったからなどが理由ですが。後者は正直なんの役にも立ちませんでした。
面倒なのが、UnityでうごいてもHoloLensでは動くとは限らない(!?)という問題がある為です。今回苦労した点のほとんどはこれにつきます。いやほんと……

HoloLensアプリをUnityで作ったことがある方はご存知かと思いますが、UnityでHoloLensアプリを作るためにはUWPアプリ(Windowsストアアプリ)を対象にビルドしないといけません。

f:id:knasa:20170707003656p:plain

Unityでビルドすると.slnファイルが書き出されて、そのソリューションファイルをVSで開いてビルドするという二段階のビルドを必要とします。大抵の場合(多分)はUnityで動けば何も問題なくビルドできるわけですが、Unityで通ってもVSで通ってもVSではダメ(その逆もしかり)というのが今回時間をごっそり持ってかれた半分の原因です。もう半分は知識不足です。
HoloToolkit使ってんならボタン1つでUnityのビルドからHoloLensにアプリを入れるまでやってくれるでしょ?という声が聞こえてきますし、自分もそうしたいのですが、なぜかまとめてやるとできません……まぁそれでも一つ一つのビルドはHoloToolkitでできるので、VSを立ち上げてビルドする必要はないのですが、Debugログを確認しながらやりたかったのでVSを立ち上げながらやりました。最終的にはVSを立ち上げる必要があったという結果になりました。

ようやく中身の話をします。まず受信側(HoloLensアプリ)のコード

gist.github.com

#define UNITY_EDITOR

 でUnityエディター上とそれ以外(UWP)で分けています。おかげでUWP側のコードはVSの機能が全く効きません……BuildSettingsのDebugging / Unity C# ProjectsをチェックしておけばUnityでビルドした後の.slnからスクリプトを編集できるはずなんですが、うちの環境ではエラー祭りになるのでチェックを入れていません……解決策があったら教えてください。

Unity側ではUdpClientを使っていて、こちらは探すと沢山出てくると思います。ただこれがUWP側ではビルドが通らない(Unityがはいた.slnがビルドできない)のです。
そのためUWPでも使えるDatagramSocketを使うことになります。そしてこれはUnityでビルドが通らない(Windowsに依存してるから)……
そしてこのコードをビルド&ビルドでいざ実行すると……UDP受信できない!

デバッガーの出力にはこんな文字が

Exception thrown: 'System.UnauthorizedAccessException' in Assembly-CSharp.dll

WinRT information: At least one network capability is required to create a socket.

検索すると、なるほど権限がないとのこと
UWPアプリではあらかじめ使う機能を有効にしないといけません。そしてそれはUnityエディターではPlayer Settings->Publishing Settings->Capabilitiesで設定できます。

f:id:knasa:20170707031551p:plain

 今回はネットワーク通信の受信をするのでInternetClientServerにチェックを入れます。
ちなみにInternetClientでは送信のみのようです(HoloToolkitから設定できるのはこっち)。

しかし、これでも同じエラーが出ます。もう涙目です。
じゃあどうするかというとUnityのビルドで生成された.slnで”Package.appxmanifest”を編集します。

f:id:knasa:20170707032400p:plain

Package.appmanifestを開いて機能から「インターネット(クライアントとサーバー)」にチェックを入れます。本来Unityでのチェックが反映されているはずだと思うんですが……

f:id:knasa:20170707033601p:plain

これでHoloLensでUDPの受信ができるようになりました。ふぃー。
UDPClientUWP.csって名前にしちゃったけどClientじゃなくてServerだった……

そして送信側、こちらはUnity関係ないUWPアプリです。

gist.github.com

画面にはテキストボックス(InputText)とボタンがあります。テキストボックスの中身をボタンを押したときに送信するようになっています。
もちろんこれもUWPアプリなので「インターネット(クライアント)」を有効にしないといけないわけですが、なんと勝手に有効になっています。どうやら必要なコードだと判断して有効にしてくれていたようです。VS優秀か。
正直こちらに関してはエラーで詰まるなどなく動いてくれました。助かった。

と、長々と書きましたが、こんな感じでHoloLensとUWPアプリのUDP通信ができるようになりました。UnityとHoloToolkitの組み合わせは便利なんですけど、まだバグが多いのか再起動すると消えるエラーとか、エラーでてるのにビルドできるし動くしみたいな現象が再現性なく多発するのでめげそうになります。
なによりUnityとUWPで同じように書けないのが面倒、Unityの機能から外れると急に崖になってる感じです。
とにもかくにもUDP通信ができたので、やりたいことが進められます。

 

参考記事(ほんと助かりました)