セキュリティ系の勉強・その他開発メモとか雑談. Twitter, ブログカテゴリ一覧
本ブログはあくまでセキュリティに関する情報共有の一環として作成したものであり,公開されているシステム等に許可なく実行するなど、違法な行為を助長するものではありません.

メモ delegateっていうものがあるよ

連載:C#入門 第17回 処理を委譲するdelegate



C#で引数にメソッドを渡し、その処理の中で渡したメソッドを実行してもらう時、引数の型はどうするべき?なんて思った時もありました。


delegateを使うことで、引数にメソッドを取る際の型を作ることができます。


処理を呼び出し元によって変えたい場合など便利。



以下先頭のurl先から引用

 1: using System;
 2:
 3: namespace ConsoleApplication21
 4: {
 5:   delegate int Sample( int x, int y );
 6:   class Class2
 7:   {
 8:     public int methodMult( int x, int y )
 9:     {
10:       return x*y;
11:     }
12:     public int methodPlus( int x, int y )
13:     {
14:       return x+y;
15:     }
16:   }
17:   class Class1
18:   {
19:     public static void calc( int x, int y, Sample calcMethod )
20:     {
21:       int result = calcMethod( x, y );
22:       Console.WriteLine( result );
23:     }
24:     static void Main(string[] args)
25:     {
26:       Class2 instance = new Class2();
27:       calc( 2, 3, new Sample( instance.methodMult ) );
28:       calc( 2, 3, new Sample( instance.methodPlus ) );
29:     }
30:   }
31: }

C# DisposeとCloseメソッド


毎度おなじみ個人的なメモ。詳しくは以下リンクにのってますが、、一応こちらでもメモ。
ufcpp.net

結論を言うと

Dispose()メソッドをしようするべきです。System.IDisposableインターフェースを実装しているものはこれを呼んでください。詳しくは上のリンクにかいてありますが、リソースを破棄する際は極力usingステートメントをするべきという決まりがあるそうで、実装されているのであれば呼んでください。



Close()メソッドもDispose()メソッドと同じことを行っているらしいので完全に重複しています。が、混乱を避けるためにもDispose()メソッドを使うようにするべきです。現在もClose()メソッドが残っているのは互換性のためであり、推奨はされていないでしょう。

Hololens USB経由でブラウザからアクセス

Hololens をUSB接続した際 '127.0.0.1:10080' へPCのブラウザからアクセスすると、インターネット情報やデバイス情報をみることができます。

また、これが確認できれば正常にPCに認識されている証拠にもなります。





初めて Visual Studio からホロレンズアプリケーションをデバッッグしようとした時、以下のような配置エラーがでることがあります。

f:id:thinline196:20170608145043p:plain


これはいろんな原因が考えられるのですが、僕の場合は開発環境がしっかり整っていないために吐かれていました。ブラウザアクセスもできない状況であれば、恐らく以下が原因です。



調べると色々出てくるので割愛しますが、だいたいwindows10のSDKが入っていないか、visual studio 2015を前から使っている人は update3 までバージョンをあげるか、またその両方です。

バージョンの情報は"ヘルプ->バージョン情報"みたいな項目があるのでそこから確認。
ツール類は、コントロールパネルのプログラムの変更とアンインストールから、visual studioを右クリック->変更で確認&インストールすることができると思います。




まぁ、メモ程度に笑

Bash on Ubuntu on Windows PATHの保存 など...

まだベータ版ですが、いつの間に実装されていたんですね!(もう随分立ってる)

ちょうど、Windows上でplayframeworkを動かそうと思っていたので、どうせならlinuxコマンドがいいということもあり、bash機能を使用することに。


注意点

windowsアップデートを怠っている人は、アップデートしてからbash機能を有効にした方がいいです。というのも、初期の段階ではubuntuのバージョンも低いし、sudoに謎バグが潜んでいたりと、色々面倒です。(無理やりubuntuをアップデートするとそこでまたバグが発生)
・もし色々いじってよくわからなくなったら、一度アンインストールをすると初期化できます!(lxrunコマンドで操作できます)

PATH設定は .bashrcファイルに書き込む
export PATH=$PATH:~/hoge/

こういった環境変数定義は、.bashrcに書き込むことで、bash起動時に読み込んでくれました。.profileは未検証ですが、.bashrcはシェルの起動時に読み込まれるので確実かと思いました。

ちなみに、/etc/profileはシェルの起動時も、windowsの再起動時も呼ばれませんでした。(呼ばれているのかもしれないけれど、環境変数は変更されなかった)

Unity VR どこでもドア ポータル ワープ

(` ・ ω ・)
f:id:thinline196:20170506180337p:plain

どこでもドア

をVRで表現した展示があるという噂を聞きました。それ意外と簡単にできるんじゃね?なんて甘い考えから始まった制作。

しかし、既に制作した方がいました笑
qiita.com


そしてそれを unity ネイティブのVRライブラリに書き換えてくれている方もいらっしゃいました。
tuti107.hatenablog.com



あああ、もう何番煎じなんだよって感じです。。。


仕方ないので、レガシーはありがたく参考にさせていただきます。




今回作ったもの

上の方々が作っていない(ブログに書いていないだけかも)、瞬間移動の部分(ワープ)を実装しました。


github.com

上のリンクから、今回のプロジェクトを落とすことができます。一応、HMDの種類は問わないはずです。





気をつけるポイント

・解説されていますが、視差をつけてのレンダリングでしょうかね。unityではカメラで見えているものをそのままTextureにレンダリングする機能がありますが(しかも簡単)、これをHMDで見た場合、当然スクリーンに映し出されたようなものになります。
・後は、合わせ鏡のようなオブジェクトの配置への対策。最適解は見つけ出せていないのでアレですが、処理落ちしてアプリケーション自体も落ちます。



使い方

・移動はWASDでの移動で、視線の先を常にWとしそれを基準にASDも決定される。
・Gで目の前にポータルを生成。
・ポータルをくぐることによって、Main空間とSub空間を移動することができる。

未実装&注意点&バグ

・出現させたポータルの裏側はシースルー状態になっていますが、コライダーの判定が残っているので通り抜けることができません。別の世界へ移動してしまいます。動画では上手くできているように見せていただけです。
・合わせ鏡状になると落ちる趣旨の話をしましたが、それ関連の話で、ポータルから別世界を覗いた時に、別世界にあるポータルは表示されないようになっています。なので、トンネル状態にして今の空間から別空間を挟んで今の空間を覗くことが今の所できません。これはなんとかなりそうな気もするので、いい案が浮かんだらやるかもです。
・動画上ではそれほど気になりませんが、HMDからポータルをのぞいた時、頭の揺れとポータルの映像が本当に少しだけズレる。描画順に問題があるのか、HMDの描画が酔い対策で異常に早くなっているのか。
・もし配置しているオブジェクトにrigitbodyなどを付ける場合、ポータルと被ると移動時に挟まったりエラーになったりしそうなので、その場合はコライダーを空間ごとにまとめてOnOffを管理する機能を作るべきだと思います。
・たまに、ポータルを潜っても空間が移動できずすり抜けてしまうバグがあります。原因不明。主に起動後の最初の1回目に起こります。







このプロジェクトのキモ

・LayerとSkyboxを上手く使っています。
・LayerをmainObjectとsubObjectに分けることによって、カメラに別空間のオブジェクトが写らないように、Skyboxをカメラごとに変更し上手く切り替えることで、まるで移動したかのように見せています。
・qiitaの方にまとめてくださっていた方は、二つの空間を少し離した位置に生成し、それを複数カメラで位置同期を上手く行いながらプロジェクトを作られていましたが、LayerとSkyboxを使うことにより、カメラは全て同じ座標を共有するようにし、二つの空間のオブジェクト配置も同じ位置に移動することができました。
・カメラとポータルの表面で衝突判定を取っているので、それにより世界が切り替わります。
・そのため、どこでもドアとは離れましたが、瞬間移動をお手軽に実装できました。


まとめ

ふと思ったけれど、VR空間上で広い荒野にドアを設置しておいて、開けた瞬間にドアの先に部屋を生成したら意外とそれっぽくなりそう笑