196の日記

完全に開発メモと雑談、その他忘れそうな計算式などを書き溜める場所になっています!

Unity コルーチンが止まる

呼び出し元のクラスが削除, またはActiveがfalseになった場合, コルーチン処理は途中で中断されます。


[Unity]コルーチンは呼び出し元が無効になるとストップしてしまう | ma_comu雑記帳


ただし、呼び出し元が消えるのと同じフレーム内の処理はおそらく呼ばれるかと思います。(体感) 念のため, 消える可能性があるクラスからは呼ばずに別の常駐するクラスにコルーチン呼び出しメソッドを作って、それを呼ぶことで中断が回避されるかと思います。(当然ですが、削除されるクラス内に実装されたコルーチンも中断するはずです)

Distance 耳コピ&tabメモ

Distance 好きなんです。笑

寒い冷たい夜な感じの曲調が好きです!ギターのディレイがとてもいい空気感を作っていると思います。とっても切ない曲ですね。今のミスチルがさらに編曲するならきっとラスサビでもう少し盛り上げてくれそうな感じもします笑 



で, 一応コピッタときのメモ書きも残しておきます。相変わらず楽譜書けません笑
昔コピーした曲をふと弾きたくなった時に、これあると便利なんですよね。 もっと昔からメモ取っておけばよかったです。


六弦は五線譜の下にはみ出して書いてあります。が、今回はあんまり6弦使わず。。。今回は5カポですが、カポなくても弾けます。ソロなんかは, カポがついているとサスティンが衰退してしまって少し残念になるので、本当はカポなしがいいと思います!

f:id:thinline196:20170815021428j:plain
f:id:thinline196:20170815021414j:plain



少しでもコピーの助けになれれば幸いです。。。

Unity SpriteからTextureを切り抜き 透明ポリゴン

tsubakit1.hateblo.jp


2Dゲームなんかを作る時に、一つの画像データに複数のイメージをまとめておいて、読み込む時に切り抜いて使用する事ありますよね。
その時、少し注意しないと、大きさが崩れます。特に、切り抜いた後その画像のサイズなんかを使う際には、意図した大きさと変わっている事で、配置バランスが崩れることもあるので注意ですね。

原因は、透明なポリゴンが画像の周りに含まれていること



デフォルトでは、どうやら透明ポリゴンが画像の周囲を囲っている場合、上手くそれを無視して切り抜くそうで、結果的にtextureのサイズは一回り小さくなります。
Unityさんやっぱり賢いので、そういうところまで融通を聞かせてくれるんですね。





上のリンク先の方が解決してくれていますが、Sprite.Create()の第6引数に注意することですね。

// スライス
Sprite tile = Sprite.Create(textureMap.texture, rect, pivot, this.tiledMap.TileWidth, 0, SpriteMeshType.FullRect);


FullRectを指定することによって、透明なポリゴンの部分も考慮して切り抜かれます。全てのマップのピクセルを統一している時などに、注意が必要です。

Unity TiledMapEditorで作成したものをUnityで読み込む


タイトル通り!

今回参考にさせていただいたサイト様はこちらです

https://anz-note.tumblr.com/post/120453126046/unitytiledmapを読み込んでマップ作ってみたけど無念っていう話
tmblr.co



とてもありがたいです!ただ残念ながらTiledMapEditorさんの保存ファイルの中身が若干変わっていたので, そのままでは使えない状態でした。。なので、最低限使えるように色々と書き足しました。
最後に今回のプロジェクトのgitを貼っておくので、動かしながら僕の汚いコードを読み解いて見てください。。(原作者さんのコードはきっと綺麗ですよ!)



ちなみに、TiledMapEditorはこちらから無料でインストールできます。



バージョン

Unity 5.5.1f1 Personal
TiledMapEditor 1.0.2


使い方

基本的には原作者さんのページをご覧ください。どういう意図で作られているかが、わかるかと思います。



まず、TiledMapEditorの方はこんな感じ
f:id:thinline196:20170811020226p:plain




カスタムプロパティやオブジェクトの情報は読み込めはしますが、そこから料理するのは個々で変わってくると思うので、ほとんど何もできません。(唯一、原作者さんが作ってくれたIsCollision機能は、Sprite描画パターンでのみ動きます。)




今回のメインの保存ファイルはtestMap.tmx, メインに使ったタイルの情報はsiba.tsxとtownObject.tsxファイルに保存されています。Unityではこれらのファイルは読み込めないので、手動でxmlファイルに書き換えてください。



今回はこのように配置します。(Resourcesフォルダ以下の内訳です)
f:id:thinline196:20170811020648p:plain



Resources/Tiles/以下のファイルはタイルのxmlファイルとそれに使用した画像を配置します。一応仕様になっているので、変更したい方はスクリプト内から "Tiles/" の文字列を探して見てください。
testMap.xmlファイルは今回はエディタ上で紐付けしていますが、そのうち動的に呼び出すと思うので、まとめてフォルダに入れておくのがいいと思います。



その紐付けしているのがココ
f:id:thinline196:20170811021055p:plain


Spriteチェックをつけると、全てのパネルが別々のSpriteに格納された状態で、マップが生成されます。外した場合は、レイヤーごとに1枚のTextureとしてマップが生成されます。後者の方が総合的におそらく負荷が軽いはず。ただ、動的に変更させる部分はSrpiteで個別に作るのがいいかもです。



実行するとこのようになります。
f:id:thinline196:20170811021402p:plain




その他

xmlの情報は全て格納されているはずなので、カスタムプロパティなどはNameで検索して、そこからうまく使ってあげてください!おそらくまた保存の仕様が変更になる事があると思うので、その時は格納クラスを上手く書き換えてください。
・どこから手をつけていいかわからない方は、僕のtestMap.xmlファイルとそれに対応するTiledMapクラスを見比べていただければいいかと思います。


最後に

コード汚くてすいません!!
他人のコードの沿って、色々と機能をつけていると、どうしても汚くなってしまう。。。。おそらく仕事などで普段から大人数が目を通すコードを描いているなら、読み方書き方がわかると思うのですが、、笑 


今回僕が行なったのは、xmlからデシリアライズできるように、格納するクラスを仕様変更に沿って書き換えたりしただけですので、やはり原作者さんは素晴らしいですね。痛感いたしました。
と、同時にxmlに対して食わず嫌いな部分があったので、少し克服できたかなと思います。



github.com

himawari 耳コピtabメモ

Mr.Childrenさんの himawari 耳コピした時の雑メモを、乗っけておきます。


半分ぐらいは合ってるでしょう笑 精度にはかけますが、とりあえずなんとなく弾きたいなんて方は頑張って解読して見てください笑


五線譜は上から1弦を表して、6弦は五線譜の下にはみ出して書いてます。今回は2カポだったので、カポをはめた状態だと思って見てください。

メモなので、音符とか詳しいことは一切書いてありません笑

f:id:thinline196:20170730022707j:plain
f:id:thinline196:20170730022652j:plain

Unity Oculus Vive Hololens など HMDのトラッキングを無効に...

...したいですね。僕にはわからないです笑 なので教えてくださる方がいるとありがたい。

擬似的にHMDを動かないようにする

 設定でなにやらできそうな気もしますが、わからないものはわからないので、トラッキングによる移動分を相殺することで、擬似的に動かないように見せることは可能です。

手順
1.MainCamera を新たに作った GameObject の子オブジェクトにする。
2.Update 内で UnityEngine.VR 内の InputTracking.GetLocalPosition(VRNode)により、HMDの座標を取得。
3.固定したい座標を真ん中として、2で取得したHMDの移動分を先ほど作った親オブジェクトに移動してもらう。
(例として、原点座標に固定しておきたいのなら、取得したVector3の値に-1をかけたものを親オブジェクトのpositionに設定する。)



おすすめは、親オブジェクトを固定したいポイントに置き、カメラはローカルで 0, 0, 0の座標に。あとはstart時に親のポジションを記憶し、カメラが移動した分を取得し、"親の最初の座標+毎回取得したHMD値*-1" を親のpositionに上書きしていけばうまく相殺できるはずです。

//Update内
positionParent.transform.position = ( -1 * InputTracking.GetLocalPosition (VRNode.CenterEye) );

今回はたまたま原点に固定だったので、毎回-1をかけたものをそのまま使用しております。この値に任意のポジションを足してやれば、自分で指定したワールド座標にHMDを持っていくことができます。


回転も似たような手法で解決可能ですが、首の位置を固定する出番はHMDではさすがにないと思うので省略。





余談

Unity - マニュアル: イベント関数の実行順


このリンクを見てもらえるとわかるのですが、マウスのInputEventはupdateより前に処理されています。なので、HMDのInputもおそらくUpdate前でしょう。(不確か)
ただ、その値の上書きはUpdateより後です。なのでUpdateで毎回原点座標で上書きしても、それをトラッキングの値でさらに上書きされるので、結局相殺ができません。どのタイミングで上書きされているのか、またトラッキングをオフにする機能もあるのであれば教えていただきたいです。笑



とりあえずなんとかなってます。以上

Hololens カーソルがUIの後ろに表示される GUIの描画順

f:id:thinline196:20170705133654p:plain



上の写真は真ん中に丸いカーソルが表示されています。もちろん、これはHololensで正面に表示される選択カーソルですよ。では、下の写真をみてください。

f:id:thinline196:20170705133833p:plain


こちらは、見えにくいですが、Buttonの後ろに隠れてしまっています。スクリプト的にはしっかりUIの当たり判定の前にカーソルを表示することになっているのですが。

unityの描画順

cfm-art.sakura.ne.jp


こちらのサイトさんで勉強させてもらいました。なんとなく知ってはいたものの、実際に問題に直面した際に正確な描画順がわかるのはありがたいです。以下印象含みます。

これは上にあるオブジェクト順に描画されていきます。これはおそらくほとんどの方が経験しているでしょう。


      • その他設定により決まる描画順(一部引用)---

Render Mode

CanvasのRender ModeがOverlayのものがCameraとWorldのものより必ず手前に表示されます。

CameraのDepth

Render ModeがOverlay以外のものでの組み合わせの場合、設定されているCameraのDpethが大きいものが手前に表示されます。

Sorting Layer

Render Modeが同一、もしくはCameraとWorldの組み合わせの場合はSorting Layerの下のものを選択しているCanvasがより手前に表示されます。

Order in Layer

Sorting Layerも一緒の場合は、Order in Layerが大きいものが手前に表示されます。

Plane Distance

Render ModeがCameraで、かつ同じカメラが設定されている場合にPlane Distanceの値が小さいものが手前に表示されます。





引用終わりーー


僕の場合は、カメラのorder in layerが悪さをしていました。


f:id:thinline196:20170705134909p:plain



hololensのアプリを作っているとだいたいこの辺りで一旦止まりそう笑





以上。