Unity3DでDebugする

CUDLRによるデバッグ

CUDLR

CUDLR(Console for Unity Debugging and Loggin Remotely)
Unityアセットストアより無料で入手可能なアセット
ターゲットのデバイスに、簡易なWebサーバ(のような物)を稼働させ、Log等をブラウザから確認可能したり
幾つかの簡単なコマンドを実行可能にするツール

使用方法

デバッグオブジェクトの追加

CUDLRの機能を使用するには、GameObjectとして配置する必要があります。
プロジェクトを開き、HierachyウィンドよりEmptyObjectをシーンへ追加し
追加したGameObjectへ、コンポーネントとしてCUDLRのServerを追加します。


Assets/CUDLR/Script/Serverをコンポーネントとして、GameObjectへ登録する

確認の為に、下記のようなコンポーネントを登録します

ビルドし、Deviceにインストールし、アプリケーションを起動します
起動後、ブラウザでhttp://[DviceのIP]:55055/へアクセスすると、実行中のアプリログが確認できます。
DeviceのIPは事前に確認しておいてください。

サンプルで設定したコンポーネントのログが出力されていますね

コマンドを幾つか実行する事もできます。

オブジェクトリストを表示してみます

注意点

リリースモジュールに含まれると、セキュリティー上のリスクとなります。
リリース時にはCUDLRオブジェクトの削除を忘れずに行いましょう

VSCodeによるデバッグ

次にVSCode上にブレークポイントを設定し、ステップ実行を行ってみます

テスト用のコードを少し改変し、ビルド、インストールを行います

アプリの起動後、CUDLRで確認します。

一定時間毎にログが出ていることが確認できます。

VSCodeにブレークポイントを設定します

左のメニューより虫のようなアイコンを選択します

デバッグ対象をAndroidPlayerに変更し、再生(▶ボタン)を選択する


DeviceにAttacheできました。

しばらく待つと、ブレークポイントで止まる事が確認できます。
変数の中も確認できました。

これで開発が進められそうです。

最後に

執筆時点で、2018.2.0b5がリリースされていたのですが、これはBetaリリースです。
こちらのバージョンはVSCodeからDeviceniにAttacheできませんでした。
xxxx.x.0fxと行ったバージョンが正式バージョンのようですので、利用する際は注意しましょう

UbuntuでUnity3D

UbuntuでUnity3Dの開発環境を作ってみました

事前準備

今回は、Androidデバイスをターゲットにした開発を想定してセットアップします。
AndoridSKD等のセットアップを、事前に行っておきます。

セットアップするもの

  • Java
  • gradle
  • Android SDK
  • Android Studio

まずは、Java及びビルドツールのgradleをセットアップします。

$ sudo apt-get update
$ sudo apt-get install openjdk-8-java
$ sudo apt install gradle

次に、AndroidStudioをセットアップします。

$ unzip android-studio-ide-xxxxx.zip
$ sudo mv ./android-studio /opt
$ /opt/android-studio/bin/studio.sh

AndroidStudioのインストールは、解凍して任意の場所に配置するだけ完了です。
AndroidSKDはAndroidStudioの実行時に行われます。

Unity3Dのセットアップ

Linux版のUnity3Dは下記のコミュニティスレッドに最新の情報が入りますので、チェックします。
Unity3D(Linux版)コミュニティスレッド

スレッドをたどると(Build #20180504)が最新のようですので、ダウンロードページよりインストラーを取得し
記事の通りにセットアップを進めます。


$sudo chown -R $USER:$USER Unity-2018.1.0f2
$chmod +x Unity-2018.1.0f2
$./Unity-2018.1.0f2

インストーラーに沿って幾つか選択をすると、インストール完了です

Unity3Dの起動を行うと、ユーザの登録とライセンスの選択を促されるので
適切な内容を入力します。

ライセンス


personalを選択した場合、ライセンスは3種類より選択となります
無料で使うには、2番め、または3番めのライセンスとなります。
2番目は前年度の売上が100,000ドル以下の会社が対象
3番めはホビーユースとして利用する場合が対象
といったライセンスとなります。
一番上のものは、前年売上が100,000ドル以上の会社が対象となり、PlusまたはProで利用する事になります。
広告等を入れて、配布を行う場合は1番目、または2番目のライセンスを選択する必要があるようです。

アンケート


ライセンスを選択後にアンケートがありますので、入力します。
国籍、会社についての情報、Unityで何を作るのか等の入力をします。

起動


$ [インストールディレクトリ]/Unity-2018.1.0f2/Editor/Unity

正常にインストールが完了していれば、Editorが起動されます。

スクリプトエディタ

このままでも開発はできるのですが、スクリプトのデフォルトエディタがMonoEditorとなっています。

MonoEditorでのスクリプトデバッグでBread等、上手く動作しない部分がありましたので、VSCodeに変更します

VSCodeのインストール

VSCode公式にDebianパッケージが用意されていますので
ダウンロード後にインストールします。
Debianパッケージになっていると簡単で良いすね。

インストール後に、幾つかのプラグインをインストールします。

C#
Debugger for Unity
MonoBehaviour Snippets
あたりをインストールしました。

VSCodeプラグイン

インストールしただけではUnityEditorと連携できません。AssetStoreにプラグインが用意されていますので、検索しImportします。

Import後にスクリプトを選択してみると、VSCodeが表示され当該コードが表示されています(^^)

これで開発する準備ができました。

SpringでNeo4jを利用する際の注意点

spring-bootからNeo4jを利用する場合、spring-data-neo4j(neo4j-ogm)と言ったライブラリでアクセスする事になります。
その際、バグと思われる現象に遭遇しましたので、忘れないように記しておきます。

概要

ValueObjectの配列またはリストをフィールドにもつEntityを作成します。
Neo4jにValueObjectをNodeとして登録させたくない為、フィールドをコンバータで文字列シリアライズしSaveを行いました。
Saveは正常に行われ、Neo4jへのストアされた内容も想定通りのものでしたが、このエンティティをLoadすると、コンバータの処理で型キャストエラーが発生しLoadに失敗します。

詳細

  • LoadできるEntity
    下記のEntityはSave、Loadが行えます

 

  • LoadできないEntity
    下記のEntityはSaveできるが、Load時にエラーが発生する

ValueObjectのListフィールドを追加する。フィールドをコンバーターにより文字列(Json)に変換する

このエンティティをSave後にLoadを実行すると、下記のような例外が発生し失敗します。スタックトレースから、キャストエラーが確認できます。

ここで発生している例外がListからStringへの変換例外だった為、なぜ発生するのか原因がわかりませんでした。Load時に行う処理は文字列(JSON)からValueObjectへの変換のはずです。なぜListを文字列にCastしようとしているのか、、、

原因

スタックトレースを追っていくと、GraphEntityMapperクラスに問題がありそうです。
当該箇所を確認してみます。

配列、Listの場合の分岐があります。どうやら、デシリアライズ先のフィールドがList(配列)の場合のみここで型の変換を行っています。

Neo4jのNodeは、プロパティに数値、文字列、真偽値またはそれらの配列を持つ事ができます。そのため為のロジックだと思いますが、コンバータの有無を確認せずに型変換を行っています。Writerの中でCallされるコンバータは文字列を期待ていますがListが渡される為、文字列にキャストを行おうとし例外となりました。

対応

色々試行錯誤した結果、当該部分を削除する対応を取りました。
テストして見る限り、動作に変わりは無いようなのですが、

まとめ

spring-data-neo4jでList(配列)フィールドにコンバーターを設定する場合は、本現象が発生します。
また、本現象ですが、キャッシュオブジェクトが利用されると再現しませんのでご注意ください。凄くハマりました(–;

Neo4j(グラフDB)

Neo4jに触る機会があったのでちょっと調べた事を書いておきます。

Neo4jとは
・Javaで記述されている
・スキーマレスでデータを登録できる
・データ間の関連を定義、登録できる
・データをCypherと呼ばれるSQLライクな言語で操作できます
・グラフ理論に基づいたデータベース
・関連定義、検索するのが得意

グラフてなんだ?
ノード(Vertices,節点,頂点)の集合とエッジ(edges,枝,辺)で構成され、関連をノードとエッジにより表現したものをグラフと言う,,,らしいです
エッジが向きを持たない場合は無向グラフ
エッジが向きを持つ場合は有効グラフと言われます

無向グラフ:Facebookのフレンド
有向グラフ:Twitterのフォロー
有向-無向グラフ

グラフDBてなんだ?
・グラフ構造を持ったDBはグラフDBと言えるのか
→そういう事では無いらしい
・なので、RDBでグラフ構造を定義してみる
rdb%e3%81%a7%e3%81%ae%e3%82%b0%e3%83%a9%e3%83%95
と、こんな感じになります(ちなみに、DocumentDBでも定義できます)
この場合、Aに隣接する要素(BまたはC)を取得する場合はインデックスツリーを参照しBを特定します
例の場合は単純なので想像しにくいのですが、Facebookの多くのユーザが存在するサービスで、友達の友達に特定の属性を持った人は何人いるか?などを調べる場合、かなりの時間が必要となるでしょう
・では、グラフDBだと
グラフDBでは要素(ノード、エッジ)が隣接する要素のポインタを直接持っています
なので、全体のデータ量が増えたとしても一定のコストで隣接要素を取得することができます
特定のルートノードを起点に関連をたどる事が効率的に行えるといえます

・グラフDBの苦手な事
要素全体に対する処理は苦手です

  • ノードの関連が10以上のノードを取得したい
  • データ全体の平均値を取得したい

まとめ
Neo4jじゃ無くてグラフDBについての記事だよね
関連を中心にデータを操作したいときには有効だよ
データ全体に対する操作は苦手だよ
あまりまとまりの無い文章だったね、、、

NoSQLの過去、今、未来

冷やし中華よろしく、ブログ始めました。

シーマーク上村です。

例年よりも早く梅雨も明け、暑い日が続いていますがいかがお過ごしでしょうか。

暑い日にはやっぱり冷やし中華ですよねってことで、ブログ始めました(なんのつながりがってツッコミはなしで)

 

NoSQLって言葉が世にでて既に結構たつかと思うのですが、、、って文章を考えていたのですが

Cassandra終了のお知らせってポストが飛び込んで着ましたのでその事について、私見を、、

Cassandra終了といってもFacebookeの中の人が俺らもう使ってないよ、時代はHBaseでしょってな類のコメントを発したらしい(すいませんが、原文にあたっていないので伝聞調です)

CassandraといえばFacebookからApacheへソースが寄贈されたことで世に出て一躍脚光を浴び、NoSQLの本命といった形で取り上げられることも多くありました。

その中で、Facebookでもう使っていないよってコメントは、少なからず衝撃があった事は事実です。

ですが、それをもってCassandraの終了を唱えるのは早計ではないでしょうか?

NoSQLは既存のRDBMSではどうしてもまかなえないニーズを満たすために生まれ、発展してきました。

そのニーズを満たす為に合えて不得意な部分ができる事を許容しました。

たとえるなら、RDBMSは総合力に優れたマルチプレイヤーですが、NoSQLは特定能力に特化したスペシャリストといえます。

で、今回のFacebookの件はFacebookの中でのニーズが変わってきてからではないでしょうか?

ニーズの変遷によるデータストアのチョイスとしてHBaseの方がCassandraより適応しているとの判断した結果だと思っています。なのでCassandra終了ってわけではないと私は思っています。

じゃぁ、Facebookのニーズの変遷、HBaseとCassandraの違いは何よって話になるかと思いますが、まだ勉強不足(情報収集不足)で私には見えていません。いづれわかった範囲で何か書きたいと思っていますが、、

 

まとまりの無い文章ですが、今回はここまでということで、、

チャオ!