- 投稿日:2020-06-01T20:59:43+09:00
VRChatにおけるUnityのlightについて
unityにおけるlight
ライトの当て方だけでも公式マニュアルの分量が多い。
スポットとポイントは室内照明、ディレクショナルは屋外の光の環境を想定する。
エリアについてはベイク限定で部分照明をあてる考え方のようだ。https://docs.unity3d.com/ja/2018.4/Manual/LightingInUnity.html
https://docs.unity3d.com/ja/2018.4/Manual/Lighting.html
https://docs.unity3d.com/ja/2018.4/Manual/class-Light.html光源を置くことで三次元空間としての表現力を得る
ディレクショナル
太陽光に相当する。
colortemptyer
色温度
単位はK(ケルビン)
カラーバーを見れば一目瞭然であるが、昼光色である6500k付近は白っぽく、
2000kあたりは赤く、10000kあたりは青い。
ShadowTypeをSoftShadowに設定し比較。ディレクショナルは、スカイボックスと連動しており、高さを変化させると日没、日中の違いが反映される。
Shadowについて
https://docs.unity3d.com/ja/2018.4/Manual/DirLightShadows.htmlポイント
ポイントのレンジは球状に設定される。
Sampleの空間にcubeを追加。
insanityが0、Renge0.16でcubeに光が当たっていないためのっぺりとした印象にみえる。
床まで光が届くようにrengeを広げ、insanityの数値をあげることで光を強くした。
スポット
所謂スポットライトのことをさす。
扇状にひろがるだけでポイントと対して違いはない。
そろそろcubeにも飽きてきたので、unity asset storeからイワシをimportした。
クッキー
光源の前に影となるtextureを設定すると透明度が設定されている部分が反映される。
- 投稿日:2020-06-01T19:54:47+09:00
Photonを利用したプロジェクトでビルドした時のみルームから一定時間後に切断されてしまう問題
概要
Photon を使った Unity プロジェクトで、なぜかビルドした時だけルーム入室から数秒後に切断されるバグが発生していたが、原因が分かったので記事を残しておく。
環境
- Unity 2018.4.22f1
- Photon Unity Network PUN 1.91
事象
下記のコードを仕込んでおいて、DevelopmentBuildでエラーを特定。
DisconnectByClientTimeout
エラーが発生していた。void OnConnectionFail(DisconnectCause cause) { Debug.LogError("通信切断発生 connectionFail"); Debug.LogError(cause); }回線が細すぎたのかと思ったが、環境を変えても再現していた。
通信切断後に下記のエラーも必ずセットで発生しており、もしかしたら RaiseEvent が大量に送られている事が原因なのでは無いかとあたりを付けてみた。RaiseEvent() failed. Your event is not being sent! Check if your are in a Room and the eventCode must be less than 200 (0..199).原因
コードをよく見てみると、毎フレーム RaiseEvent を送っている箇所があった。
早速該当コードをコメントアウトしてみると、ルーム切断がされなくなったので正解だった模様。30秒ちょっとで約3,000回のRaiseEventが...?
コードをちょこっと書き換えて30秒で2回のRaiseEventにまで抑えた?
まとめ
Editor では正常に動作していたのでなかなかハマりやすいのかもしれないと思った。
毎フレーム RaiseEvent を送っても処理が間に合うわけが無いので、状態を他クライアントと共有する場合はカスタムプロパティを使ったほうが合理的だろう。参考
- 投稿日:2020-06-01T12:08:51+09:00
VRIKをアタッチしているキャラクターでAnimatorの歩行モーションを利用する
概要
VRIK の歩行モーションに違和感があったので、自作した Animator の歩行モーションを使いたかったが、そのままだと腕と足の動きが VRIK に依存してしまっていたので記事に残すことにした。
環境
- Unity 2018.4.22f1
- Final IK version 1.8
手順
- 腕の Weight を 0 にする
- Locomotion の weight を 0 にする
- キャラクターの transform を更新し続ける
腕のweightを0にする
下記のようにしたいので、移動時のみ腕のweightを0にする。
止まっている時: VRトラッキング
歩いている時: Animatorスクリプトは下記の通り。
private void Update() { if (_isWalk) ChangeVrikWiehgtForWalk(); else ChangeVrikWeightForIdle(); } // 歩行時のVRIKウェイト設定 private void ChangeVrikWeightForWalk() { _vrik.solver.leftArm.positionWeight = 0f; _vrik.solver.rightArm.positionWeight = 0f; _vrik.solver.leftArm.rotationWeight = 0f; _vrik.solver.rightArm.rotationWeight = 0f; } // 待機時のVRIKウェイト設定 private void ChangeVrikWeightForIdle() { _vrik.solver.leftArm.positionWeight = 1f; _vrik.solver.rightArm.positionWeight = 1f; _vrik.solver.leftArm.rotationWeight = 1f; _vrik.solver.rightArm.rotationWeight = 1f; }Locomotionのweightを0にする
移動モーションは Animator で、transform の更新は自作スクリプトで行うので、Locomotion の weight は常に 0 に設定する。
private void Start() { _vrik.solver.locomotion.weight = 0f; }キャラクターの transform を更新し続ける
Locomotion の weight を 0 にするとキャラクターがその場から動かなくなってしまうので、頭の position を使ってキャラクター本体の座標を更新し続ける必要がある。スクリプトは下記の通りで、適当な MonoBehaviour 継承クラスに記載する。
private void LateUpdate() { if (_vrik == null) return; var d = _vrik.solver.spine.headTarget.position - _vrik.references.root.position; d.y = 0f; var mag = d.magnitude; _vrik.references.root.position += d.normalized * mag; }参考記事
- FINAL IK - Full Body IK, Aim, Look At, FABRIK, CCD IK... [1.0 RELEASED] - Unity Forum
- Final IK の VRIK の Solver にある各値の説明 - Qiita
まとめ
調べても記事がほとんどなく、唯一見つかった UnityForum の記事を頼りに実装しました。
もっとクールな実装を知っている方がいらっしゃいましたら、コメントでご教示いただけますと幸いです。
- 投稿日:2020-06-01T08:14:11+09:00
[メモ]「Rhythm Game Starter」シーケンスエディタの編集画面が足りなくなった時の増やし方
Unity Assets Storeの
「Rhythm Game Starter」
Assets/RhythmGameStarter/Editor/Sequence/SequenceEditor.cs
の114行目
itemLimit = 500;
ここを例えば
itemLimit = 1000;
のように変更すると、このシーケンスエディタの編集画面が拡張される。
- 投稿日:2020-06-01T02:28:39+09:00
【C#】Array.Sortに勝てた話
初めに
本記事では特にコードとかは記載されません。
目的
C#にはusing systemで追加されるクラスでArrayクラスがあります、このクラスの中にはSort関数がありかなりの処理速度でソートをかけてくれます。
この速度になんか勝ちたいなと思いまして色々試してみました。試したこと
とりあえず自分の中でソートといえばバブルソートとクイックソートの2種類が主流です。
とりあえず各ソートの処理速度を見てみましょう。
各ソートは1万回ずつ実行した時の数値となっています。バブルソート
クイックソート
Array.Sort
まとめ
クイックソートすごいですね、爆速です。
機会がありましたらソースも公開したいと思います。追記
数回のテストで勝ってる!と思ってましたがもう何度かテストした結果ほぼ同じ速度であることがわかりました。
悔しい!