イラスト、モデリング、Unity、VR関連

unityとかblenderとかvr関連の作業メモ

vrchat vrc_sdkの動作についてのメモ

++swapanで生成されたオブジェクトはInteractが動かない。

++OnTImeはそのオブジェクトがfalseになっても動きつづける。

++DestoryObjectのところにprefabも設定できるが、prefabで生成されたオブジェクトを削除してくれるわけではない。ゲームオブジェクトだけでなく、prefabを指定できるところがあるが、生成系以外は基本的にprefabを指定しても効果を持たない。(position指定としては機能する)なので、生成されたオブジェクトそのものにはなんらかの操作について指定出来ないも同然なので扱いがかなり難しい。特定のレイヤーを付けたオブジェクトは通さないとかなら出来るが、オブジェクト単体ごとの操作が厳しい。

 

++AudioBankにはループ機能がなく、工夫してもループ機能の実装は難しい

 

++確か、OnDropイベントで持ったアイテムを投げる速度を調整できる項目があるのだが機能しない。飛距離を伸ばすならOnDrop時にグローバル座標を使用してy方向にAddForceするとよい。

unity 全体・全部・満遍なく光を照らす+skyboxの設定

Window=>Lighting=>Settingにて

Enviroment LightingのsorceをColorに変更。

Enviroment ReflectionのsorceをCustomに変更

Ambient Colorで光の色を変えられる。白にしたらそのオブジェクト自体の色が出る。

 

ちなみにSkyBox Materialのところで空の模様を変更できる。

Unityの空の色はここで変更する。普通のplaneオブジェクトにテクスチャを張って拡大して空を作ったりはしない

unity vrc_audiobankは使わない方がよさそうな件

vrchatのワールドで複数の音楽を繋げて流そうとしてvrc_audiobankというのを利用したのだが、どうもループ再生が出来ないという致命的な欠陥があるっぽい。

 

なんとかループ出来ないか頑張ったが無理だった。

vrc_audiobankを持つオブジェクトにOnEnableでSendRPC.playを自身に送り音を鳴らし、加えて、全曲の時間を計算して、それをontimerにセットしてdisable,ableをするという設定をしすると、ループはできるのだが、このオブジェクトをinteractでoffにしてもなぜか音が止まらず音がループされ続ける。

よくわからんのだが、OnTimerはそれのオブジェクトがdisableになっても機能しつづけてしまうらしい。

 

またOnTimerをrepeatしてSendRPCを送っても最初の一回しか反応しない。DestoryとSwapanを使おうとしてもprefabかするとAudio Sorceの設定が消えてしまい、prefab状態だとAudioSorceを設定できず音を鳴らせない。

 

鳴り終わるとOnStopイベントが発生するので、それを検知してSendRPC.playを送ればいいんじゃないかとも思ったが、なぜかplayをコールするとOnStopがコールバックされ無限ループが発生してしまう。

 VRC_AudioBank - Programming in VRChat

 

ループ再生機能くらい実装しておいてほしい。

 

常に音楽を繋げて流すのなら音楽ファイル自体をつなげる手もあるが、今回は単体でも流したかった。

 

vrchatとunity

vrchatのunityバージョンが5.6.3p1から2017.4LTSに引き上げられた。

その影響とかは以下で述べられている。

Unity2017.4へのアップグレード - VRChat 技術メモ帳

 

VRChat Upgrade to Unity 2017.4 – VRChat – Medium

vrchat公式が言うには2018に上げない理由は長期的なサポートを重視するからだそうだ。なので2018LTSが出ればそれへの移行を始めると言っている。

 We’re primarily focused on moving to Unity LTS (Long-Term Support) versions rather than every incremental Unity version.  Once 2018 has an LTS version released, we can start looking into moving forward with that upgrade.

 

で、Unityのシェーダグラフを使いたいのでいつになったら2018のLTSが出るのかググってみたらUnityは以下のように言っていた。

  その年の最後にリリースしたバージョンがLTSへ昇格し、 以後24か月間バグ修正更新を行うサポートをします

【Unite Tokyo 2018】Unityの開発サイクルとバグへの取り組みについて

予定だと、Unity2018の場合は.4か.3がLTSに乗るっぽい。

(その年の最後にリリースしたバージョンならunity2018.2がLTSになりそうなんだが・・・)

=>14日に.3が出た。

 

というか、

これまでの年 4 回リリースを行う体制から、年に 3 回 TECH ストリームでのリリースを行う体制に移行します。

Unity の新しいリリースプラン:TECH ストリームと長期サポート(LTS)ストリームの導入 – Unity Blog

とある。なので、2018.4とは2018.3のLTS版ということになるっぽい。2018.2が7月にリリースされているので、期間的にも.3をLTSにするというのなら、12月中には.3がリリースされるのかもしれない。

 

だとすると、12/12である今日にvrchatは2017.4LTSに対応したが、2018LTSへの対応は思ったよりも早く行われるのではないか。というか、早く対応してほしい

 

Unity シェーダ 分かったことのメモ

・シェーダはマテリアルと1対1で結び付けられている。

・シェーダはShaderLab 言語で記述される。要するにグラフィックをプログラムすることなので、原理的にはシェーダでどのような映像表現も可能だと思われる。

・シェーダプログラミングを勉強するよりもシェーダグラフを勉強した方が良いように思える。シェーダグラフは単に楽にシェーダを組めるというだけでなく、今後レンダーパイプラインが多様化したときにシェーダプログラムの互換性を与える。=>ただしvrchatは2017対応なので、シェーダグラフは使えない。2018にはLTS版が出たら移行するらしい。

 

++参考サイト

【Unityシェーダ入門】Unityのシェーダで遊んでみよう - おもちゃラボ

Unity シェーダグラフの使い方 - Unity++blog.

【Unite Tokyo 2018】新機能Shader Graphを使えばプログラミング無しにシェーダーが作れるようになります! - YouTube

文法はここが詳しい

第6回.初めてのSurface Shader…を徹底解剖 - UnityShader 入門

サンプル集ーコードもある

http://www.shaderslab.com/shaders.html

unity vrchat 特定のオブジェクトのみをエリア外から出さない

unityにはオブジェクトにレイヤーを設定できる。

このレイヤーを使うことで指定したレイヤーを持つオブジェクトのみに衝突判定をする、などといったことが出来る。

レイヤーはインスペクターの一番上の右側で設定できる。

レイヤーAがレイヤーBに衝突判定するかの設定は

edit=>project settings=>physycsで出来る。

 

これによってレイヤーAを持つオブジェクトは通すが、レイヤーBを持つオブジェクトは通さない壁、といったものが作れる。

vrchat ワールド作成 オブジェクトをリスボーンする

++やること

ボールなどが指定したエリアを出たら/入ったら、元の場所に戻るようにする。

 

++やりかた

エリアAに入ったらボールXが指定した場所に戻る・移動したいとする。

エリアAにはtarget_area layer作成して付与し、コライダーをis triggerとする。

ボールXにはvrc_trigger(script)とvrc_pickupを付与する。

(vrc_pickupは物を掴んだり出来るようにするためで、リスボーンそのものとは関係ない)

(エリアではなく、ボール側にvrc_triggerを設定することに注意する。私は最初、逆でやっていて無駄に時間を食ってしまった)

vrc_triggerで、OnEnterTriggerを選択してAddする。

layerに先ほど指定したtarget_areaをセット(これでtarget_areaレイヤーのオブジェクトのみを対象に出来る)

ActionにDestroyObjectを追加する。

(DestroyObjectの設定はこれだけ。DestroyObjectはデフォルトで自身、今回の場合はボールXをDestroyの対象にする)

SpawnObjectを追加する。新たに表示されるSpawnObjectの左側の=ボタンを押す。

展開された項目のprefabにはボールXのprefabを設定し、Locationsにはもとに戻したい場所に設置されたオブジェクトのprefabを指定する

(もとに戻したい場所には空のオブジェクトでも設置しておけばいい)

 

これで、ボールXはエリアAに当たると、DestroyObjectによって自身のオブジェクトを破棄し、指定した場所にprefabで設定されたオブジェクト、つまりボールXと同じオブジェクトが生成されることで、元の場所に戻ったように見ることが出来る。

 

++補足

vrchatでは任意のスクリプトを使うことが出来ない。

使えるのはunityのコライダーとリジッドボディ、vrchatSDKのコンポーネントが大体のようである。