20200601のUnityに関する記事は5件です。

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に設定し比較。

image.png

image.png

image.png

image.png
image.png

ディレクショナルは、スカイボックスと連動しており、高さを変化させると日没、日中の違いが反映される。
Shadowについて
https://docs.unity3d.com/ja/2018.4/Manual/DirLightShadows.html

ポイント

ポイントのレンジは球状に設定される。
Sampleの空間にcubeを追加。
image.png

insanityが0、Renge0.16でcubeに光が当たっていないためのっぺりとした印象にみえる。
image.png
床まで光が届くようにrengeを広げ、insanityの数値をあげることで光を強くした。
image.png

image.png

スポット

所謂スポットライトのことをさす。
扇状にひろがるだけでポイントと対して違いはない。
そろそろcubeにも飽きてきたので、unity asset storeからイワシをimportした。
image.png

クッキー

光源の前に影となるtextureを設定すると透明度が設定されている部分が反映される。

https://docs.unity3d.com/ja/2018.4/Manual/Cookies.html

image.png

image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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が...😰
image.png

コードをちょこっと書き換えて30秒で2回のRaiseEventにまで抑えた😊
image.png

まとめ

Editor では正常に動作していたのでなかなかハマりやすいのかもしれないと思った。
毎フレーム RaiseEvent を送っても処理が間に合うわけが無いので、状態を他クライアントと共有する場合はカスタムプロパティを使ったほうが合理的だろう。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VRIKをアタッチしているキャラクターでAnimatorの歩行モーションを利用する

概要

VRIK の歩行モーションに違和感があったので、自作した Animator の歩行モーションを使いたかったが、そのままだと腕と足の動きが VRIK に依存してしまっていたので記事に残すことにした。

環境

  • Unity 2018.4.22f1
  • Final IK version 1.8

手順

  1. 腕の Weight を 0 にする
  2. Locomotion の weight を 0 にする
  3. キャラクターの 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;
}

参考記事

まとめ

調べても記事がほとんどなく、唯一見つかった UnityForum の記事を頼りに実装しました。
もっとクールな実装を知っている方がいらっしゃいましたら、コメントでご教示いただけますと幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[メモ]「Rhythm Game Starter」シーケンスエディタの編集画面が足りなくなった時の増やし方

Unity Assets Storeの
「Rhythm Game Starter」
Assets/RhythmGameStarter/Editor/Sequence/SequenceEditor.cs
の114行目
itemLimit = 500;
ここを例えば
itemLimit = 1000;
のように変更すると、このシーケンスエディタの編集画面が拡張される。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【C#】Array.Sortに勝てた話

初めに

本記事では特にコードとかは記載されません。

目的

C#にはusing systemで追加されるクラスでArrayクラスがあります、このクラスの中にはSort関数がありかなりの処理速度でソートをかけてくれます。
この速度になんか勝ちたいなと思いまして色々試してみました。

試したこと

とりあえず自分の中でソートといえばバブルソートクイックソートの2種類が主流です。
とりあえず各ソートの処理速度を見てみましょう。
各ソートは1万回ずつ実行した時の数値となっています。

バブルソート

a59c245735815260207550317024280e.png
こんな感じの速度ですね。

クイックソート

c92314c24c00d07349481f08ae57325a.png
やっぱりソート最速と噂されるソートなだけあって早いです。

Array.Sort

eb6f944a19fd535acfc8469efc0ca7ba.png

まとめ

クイックソートすごいですね、爆速です。
機会がありましたらソースも公開したいと思います。

追記

数回のテストで勝ってる!と思ってましたがもう何度かテストした結果ほぼ同じ速度であることがわかりました。
悔しい!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む