- 投稿日:2020-02-17T22:12:46+09:00
Unityのシェーダーができることを初心者視点で調査@202002
Unityでシェーダーしてデスストみたいなレーダーできるかを
シェーダー未経験が調べるメモ
「おっ」って感じたサイトまとめになった。。A not very handy echolocation effect.
ロケーションソナーてきなことができそう、GC書き換えれば
http://www.shaderslab.com/demo-22---echolocation.html
While the player is moving, textures change around him.
マテリアルを指定オブジェクト中心に切り抜きできる便利
http://www.shaderslab.com/demo-97---texture-switch-depending-player-pos.html
【Unity】Shaderことはじめ【Shader : 0】
booth参考文献が良さそう
https://qiita.com/Nekomasu/items/6620ab19bfdaeb7743f2Unityを利用した空間スキャンライン表現
https://styly.cc/ja/tips/unity-shader-worldscanline/#x
HoloShield
いろいろエフェクトつくから今後に使ってみたい
https://github.com/AdultLink/HoloShield#getting-startedShadersLaboratory
以下はShadersLaboratoryで気になったやつのメモ
Unityで使えるので助かりますTessellation depending distance from camera
カメラからの奥行き具合で描画の細かさを変更
http://www.shaderslab.com/demo-46---tessellation-depending-distance-camera.htmlDiscard faces depending normal and camera
カメラからの奥行き具合で描画する三角形を変化
http://www.shaderslab.com/demo-51---discard-faces-depending-normal-and-camera.htmlSection
切り口が描画されるからなにかに使えそう
http://www.shaderslab.com/demo-45---section.htmlVolumetric sphere in a cube
矩形中心に円形を描画できる、地形データでもできたら良さそう
http://www.shaderslab.com/demo-32---volumetric-sphere-in-a-cube.htmlObject pit wit a stencil buffer
重なり部を消して、裏側のマテリアル表示できるようです
http://www.shaderslab.com/demo-16---pit-an-object-with-stencil-buffer.htmlTextures depending the normal
テクスチャ 角度などで表示切り替え 一枚のプレーンにまとまるので管理しやすそう?
http://www.shaderslab.com/demo-54---textures-depending-normal.html
Wireframe
ワイヤーフレームで描画
http://www.shaderslab.com/demo-93---wireframe.html
http://www.shaderslab.com/demo-94---wireframe-without-diagonal.html
ワイヤーフレームっぽい感じ
http://www.shaderslab.com/demo-23---wireframe-like.htmlMoss on rock,Snow effect
岩に草でてくる具合の調整
http://www.shaderslab.com/demo-27---moss-on-rock.html
岩に雪つもる具合の調整
http://www.shaderslab.com/demo-04---snow-effect.htmlCircle on terrain
地形データに直接に描画、ロケーション表現に使えそう
http://www.shaderslab.com/demo-08---circle-on-terrain.html
Triplanar mapping
地形データに複数のテクスチャ
http://www.shaderslab.com/demo-56---triplanar-mapping.html参考サイト
Shaders Laboratory
http://www.shaderslab.com/shaders.html
- 投稿日:2020-02-17T19:19:24+09:00
Unity Editor上でADX2再生データの音を録音する with Unity Recorder
はじめに
こちらの投稿は、
Unity + ADX2環境でゲーム中の音を録音する
https://qiita.com/Takaaki_Ichijo/items/faf96c22740ff5a7587dの続きです。上記記事は実機動作中のゲーム内での録音、当記事はUnity Editor上での録音方法を紹介します。
動作確認環境
- Unity 2019.3.1f1 + ADX2 LE SDK 2.10.05
- Unity 2018.4.13f1 + ADX2 (CRIWARE SDK for Unity 3.00.04)
パッケージ
ADX2 for Unity Recorder
https://github.com/TakaakiIchijo/ADX2forUnityRecorder使い方
パッケージ導入後、Window/CRIWARE/CriAtomRecorderからツールウィンドウを呼び出すことができます。
ウィンドウは保存先ディレクトリ指定、ファイル名指定、Start Recordingのでかいボタンと保存先ディレクトリを開くボタンという激烈シンプルなものです。
録音中は録音ファイル名がボタン下部に表示されるようになっています。ゲーム再生時、任意のタイミングでStart Recordingボタンを押し、止めたいところで同じボタンをもう一度押すだけです。
Add Timestamp to file name オプションで、ファイル名の後ろに日付・時刻を自動で入れます。
オプションをオンにすると、同一ファイル名で上書きしていく挙動になります。wavの保存フォルダはデフォルトではAssets/Recordingsです。
録音の手法
CriAtomExOutputAnalyzerクラスを使ってミキシング後の音声データを取り出し、wavファイルに書き込みます。
https://game.criware.jp/manual/unity_plugin/jpn/contents/classCriAtomExOutputAnalyzer.htmlCriAtomExOutputAnalyzerクラスによる音声データのキャプチャは、Update内でExecutePcmCaptureCallbackを叩き続ける必要があります。
CriAtomRecorder.csprivate void Update() { if (IsRecording) { analyzer.ExecutePcmCaptureCallback(); } }また、CriAtom.CueSheetsAreLoadingをチェックし、再生に必要なデータがロード完了しているかを待つ必要があります。
そのため、ゲームオブジェクトとして録音モジュールをヒエラルキー内に生成し、HideFlags.HideInHierarchyをつけて見えなくしています。
録音停止時点でオブジェクトを破棄します。Unity Recorder連携
ゲーム開発過程において、トレイラームービーを作る際など、ゲームをEditor上で動作させながら動画・音声キャプチャしたいことがあります。
Unityには、Unity Recoderという録画・録音機能が公式に提供されています。以前はUnity Asset Storeにありましたが、現在はPackage ManagerからUnity Recorderを導入できます。
ただしPreview Package扱いです。(2020年2月現在)Unity RecorderはADX2のエンジンで再生している音をキャプチャできないため、当初はUnity RecorderのAudioRecorderSettingsを拡張してADX2対応させる予定でしたが、必要なクラス一式がinternalで触れないため断念しました。
ただし、UnityEditor.Recorder.RecorderWindow.IsRecording()で録画中かどうかのステートが取れるため、このboolをポーリングしてUnityRecorderで録画が始まったら同時にCriAtomRecorderによる音声録音も開始して、同じくRecorder側での録画終了となったら録音を停止する仕組みを用意します。
CriAtomRecorderEditorWindow.csprivate void OnEnable() { UnityEditor.Recorder.RecorderWindow recorderWindow = GetWindow<UnityEditor.Recorder.RecorderWindow>(); EditorApplication.update += () => { if (recorderWindow.IsRecording() && isRecording == false) { StartRecording(); this.Repaint(); } if (recorderWindow.IsRecording() == false && isRecording) { StopRecording(); this.Repaint(); } }; }このウィンドウが有効になった時点でUnity Recorderのウィンドウも開いて参照を取得し、EditorApplication.updateタイミングでIsRecording()を監視します。
(少し不安定なため、上記repoでのパッケージではコメントアウトしています)CriAtomRecorderウィンドウを開くとUnity Recorderも勝手に開きます。このとき、Movieモジュールのキャプチャ設定で「Capture audio」のオプションを外してください。(どのみちADX2を導入したプロジェクトにはAudioListenerがないので、ワーニングが出ます)
Unity Recorder側の赤い録画ボタンを押せば、CriAtomRecorder側も録音を開始します。(昔のカセットテープで録音ボタンを押すと再生ボタンが同時押しされるやつみたいですね)
問題点
どうにかUnity Recorderとの連携はできましたが、わずかながらキャプチャのタイミングにずれがありますなので、トレイラームービーを作る場合はムービー作成ツール上でタイミングを合わせてあげる必要があります。
また、可能であればUnity Editorの時点で音声と動画をつなげたmp4を生成したいのですが、出力ファイルをフックしたりなどの手間がすごそうなので保留しました。
Unity Recorder内部のクラスが触れるようになれば、Recorderウィンドウだけで完結しそうなのですが、Recorder側の開国待ちです。
- 投稿日:2020-02-17T18:10:32+09:00
【Unity】時間によってSkyBoxの色を変化させる
概要
時間によって空の色を自由に変えます。
パーティクルのColor Over Lifetimeのように時間で変化するカラーをアニメーションカーブで再現しました。結果
サンプルコード
DynamicSky.csusing UnityEngine; using System; public class DynamicSky : MonoBehaviour { [SerializeField] private AnimationCurve Curve_R, Curve_G, Curve_B; void Start() { DateTime now = DateTime.Now; float val = (now.Hour * 60f + now.Minute) / (24 * 60); Color col = new Color(Curve_R.Evaluate(val), Curve_G.Evaluate(val), Curve_B.Evaluate(val)); Material mat = new Material(RenderSettings.skybox); mat.SetColor("_Tint", col); RenderSettings.skybox = mat; } }結果のgifと違いstart時にだけ実行されます
解説
DateTime now = DateTime.Now; float val = (now.Hour * 60f + now.Minute) / (24 * 60);時間を取得し0時からの進行度を割り出します。
Color col = new Color(Curve_R.Evaluate(val), Curve_G.Evaluate(val), Curve_B.Evaluate(val));時間に対応する色を返します。
Material mat = new Material(RenderSettings.skybox); mat.SetColor("_Tint", col); RenderSettings.skybox = mat;スカイボックスに色を設定します。
これはシェーダーがSkybox/Cubemapの場合で、デフォルトのスカイボックスでは"_Tint"の部分が"_SkyTint"となります。
また注意点として、RenderSettings.skybox.SetColor("_Tint", col);のようにすると直接プロジェクトのマテリアルを書き換えてしまうので、新しく作ったものを差し替えてます。
カーブの設定
以下を目安に設定すると現実に近くなると思います。
valが時間の進行、R、G、Bがそれぞれの値です。
val R G B 0 0 0.1 0.17 0.16 0 0.1 0.17 0.28 0.38 0.41 0.41 0.5 0.5 0.5 0.5 0.7 0.5 0.45 0.4 0.8 0.1 0.15 0.2 1 0 0.1 0.15 終わりに
回転なども加えればより現実に近い挙動にできそうですね。
- 投稿日:2020-02-17T18:10:32+09:00
【Unity】現在時刻によってSkyBoxの色を変化させる
概要
時間によって空の色を自由に変えます。
パーティクルのColor Over Lifetimeのように時間で変化するカラーをアニメーションカーブで再現しました。結果
サンプルコード
DynamicSky.csusing UnityEngine; using System; public class DynamicSky : MonoBehaviour { [SerializeField] private AnimationCurve Curve_R, Curve_G, Curve_B; void Start() { DateTime now = DateTime.Now; float val = (now.Hour * 60f + now.Minute) / (24 * 60); Color col = new Color(Curve_R.Evaluate(val), Curve_G.Evaluate(val), Curve_B.Evaluate(val)); Material mat = new Material(RenderSettings.skybox); mat.SetColor("_Tint", col); RenderSettings.skybox = mat; } }結果のgifと違いstart時にだけ実行されます
解説
DateTime now = DateTime.Now; float val = (now.Hour * 60f + now.Minute) / (24 * 60);時間を取得し0時からの進行度を割り出します。
Color col = new Color(Curve_R.Evaluate(val), Curve_G.Evaluate(val), Curve_B.Evaluate(val));時間に対応する色を返します。
Material mat = new Material(RenderSettings.skybox); mat.SetColor("_Tint", col); RenderSettings.skybox = mat;スカイボックスに色を設定します。
これはシェーダーがSkybox/Cubemapの場合で、デフォルトのスカイボックスでは"_Tint"の部分が"_SkyTint"となります。
また注意点として、RenderSettings.skybox.SetColor("_Tint", col);のようにすると直接プロジェクトのマテリアルを書き換えてしまうので、新しく作ったものを差し替えてます。
カーブの設定
以下を目安に設定すると現実に近くなると思います。
valが時間の進行、R、G、Bがそれぞれの値です。
val R G B 0 0 0.1 0.17 0.16 0 0.1 0.17 0.28 0.38 0.41 0.41 0.5 0.5 0.5 0.5 0.7 0.5 0.45 0.4 0.8 0.1 0.15 0.2 1 0 0.1 0.17 追記
カーブは手動で編集せずスクリプトから設定することもできます。
Keyframe[] frames_R = new Keyframe[7]; Keyframe[] frames_G = new Keyframe[7]; Keyframe[] frames_B = new Keyframe[7]; frames_R[0] = new Keyframe(0f,0f,0f,0f); frames_R[1] = new Keyframe(0.16f,0f,0f,3f); frames_R[2] = new Keyframe(0.28f,0.38f,3f,1f); frames_R[3] = new Keyframe(0.5f,0.5f,0.2f,0.05f); frames_R[4] = new Keyframe(0.7f,0.5f,-0.05f,-3f); frames_R[5] = new Keyframe(0.8f,0.1f,-3f,-1f); frames_R[6] = new Keyframe(1f,0f,-0.1f,0f); frames_G[0] = new Keyframe(0f,0.1f,0,0); frames_G[1] = new Keyframe(0.16f,0.1f,0f,3f); frames_G[2] = new Keyframe(0.28f,0.42f,3f,1f); frames_G[3] = new Keyframe(0.5f,0.5f,0.1f,-0.05f); frames_G[4] = new Keyframe(0.7f,0.45f,-0.5f,-3f); frames_G[5] = new Keyframe(0.8f,0.15f,-3f,-0.8f); frames_G[6] = new Keyframe(1f,0.1f,-0.1f,0f); frames_B[0] = new Keyframe(0f,0.17f,0f,0f); frames_B[1] = new Keyframe(0.16f,0.17f,0f,3f); frames_B[2] = new Keyframe(0.28f,0.41f,2.5f,1f); frames_B[3] = new Keyframe(0.5f,0.5f,0.1f,-0.07f); frames_B[4] = new Keyframe(0.7f,0.4f,-0.7f,-3f); frames_B[5] = new Keyframe(0.8f,0.2f,-3f,-0.5f); frames_B[6] = new Keyframe(1f,0.17f,-0.1f,0f); // カーブにキーフレームを設定する Curve_R = new AnimationCurve(frames_R); Curve_G = new AnimationCurve(frames_G); Curve_B = new AnimationCurve(frames_B);終わりに
回転なども加えればより現実に近い挙動にできそうですね。
- 投稿日:2020-02-17T14:29:09+09:00
UnityエンジニアがStrategyPatternを調べるおすすめの学習過程
概要
自分がStrategyPaternを学習した軌跡のメモです。
また忘れたときに読む用ぐらいに書きましたが役に立てば幸いです。対象
StrategyPaternの記事が多すぎてどれからよめば良いかわからない方
UnityでC#かけるけど、デザインパターンわからんぐらいの人学習手順
①使わなかった場合の問題点把握
https://twitter.com/MinoDriven/status/1228896043435094016
https://speakerdeck.com/minodriven/kusokododong-hua-switchwen-jie-shuo
これめっちゃわかりやすいです。
Swich文をStrategyPaternにしたら仕様変更に対応できるよ~って内容の動画+スライドです②ざっくり把握 IT専科 Strategy パターン
http://www.itsenka.com/contents/development/designpattern/strategy.html
初めの抽象的に書いてる部分がすごいまとまってます。サンプルを複数見た後に読むとグッときます。
なのでここではまだ理解できないで大丈夫です。
③Unityコードサンプルで把握
https://github.com/QianMo/Unity-Design-Pattern
サンプルが2つあります。
中のサンプル2を自作したクラス図です。
④UnityでまなぶStrategyPatern
https://techlife.supride.jp/archives/1411
ここまで読むとだいだい理解できます。⑤ もう一度②を読む
抽象的に書いてあるので、応用するときに気を付けなければいけない点がよくわかります。
StrategyPaternの使いどころ
抽象的に言うと
・アルゴリズム的な処理を入れ替えたいとき具体的に読みやすくしたいと考えるタイミングで言うと
・Swich文を読みやすいように変更もっと具体的にいうと
・映画館の価格表
・ポケモンの技みたいな分岐の実装
- 投稿日:2020-02-17T09:58:29+09:00
LeapMotionでOculusQuestのジェスチャデータを出力してテストするあれこれ作ってみた( 発展途上 )
OculusQuestのハンドトラッキングが実装されてからUnityでジェスチャを自前で作成してテストする際にいちいち実機に転送するのが結構煩わしかったのでそれっぽいもの作ってみた
最近はOculusLink使ってエディタでテストできるみたいだけど僕は持ってないのでLeapMotionで代用的な
Oculus Integration 13.0も来てた。Oculus LinkでUnityエディタ上でハンドトラッキングが使えるようになってるみたい。 https://t.co/rNaDt6ygiC
— こりん@VR (@korinVR) February 7, 2020対象となる人
- OculusQuest持ってる
- LeapMotion持ってる
- OculusLink持ってない or 持ってるけどうまく動かなくて使ってない
- Windowsユーザー( LeapMotionのSDKのバージョンで最新版はWindowsしか利用できないので )
- ハンドトラッキングの自前ジェスチャを作って何かしたい
環境
OS Windows10 Unity 2018.4.14f1 LeapMotionSDK UnitySDK 4.4.0 OculusIntegration 12.0 できること
現段階では指の伸びたか否かでの判定を用いてのジェスチャのデータ出力及びOculusQuestでのテスト
今回は グー、チョキ、パーの三つのジェスチャデータを出力してOculusQuestでテストしていますこちらのリポジトリで公開しています
まだリファクタリング等行ってないのでコードは若干ゃごちゃごちゃしてて扱いにくいけどとりあえず後悔した後で整備していく方針です
あとがき
今後ぼちぼちアップデートをしてできることをもう少し増やしたい...
HoloLensのブルームみたいな特定の一連の指の動きとか
この記事は今後ちょくちょく手を入れる予定
Rift Sでハンドジェスチャのテストができればいいんだがなぁとも思ったり思わなかったり、現時点ではRift Sでのハンドトラッキングは実装されてないので致し方なし
- 投稿日:2020-02-17T09:58:29+09:00
LeapMotionでジェスチャデータを出力してOculusQuestでテストするあれこれ作ってみた( 発展途上 )
OculusQuestのハンドトラッキングが実装されてからUnityでジェスチャを自前で作成してテストする際にいちいち実機に転送するのが結構煩わしかったのでそれっぽいもの作ってみた
最近はOculusLink使ってエディタでテストできるみたいだけど僕は持ってないのでLeapMotionで代用的な
Oculus Integration 13.0も来てた。Oculus LinkでUnityエディタ上でハンドトラッキングが使えるようになってるみたい。 https://t.co/rNaDt6ygiC
— こりん@VR (@korinVR) February 7, 2020対象となる人
- OculusQuest持ってる
- LeapMotion持ってる
- OculusLink持ってない or 持ってるけどうまく動かなくて使ってない
- Windowsユーザー( LeapMotionのSDKのバージョンで最新版はWindowsしか利用できないので )
- ハンドトラッキングの自前ジェスチャを作って何かしたい
環境
OS Windows10 Unity 2018.4.14f1 LeapMotionSDK UnitySDK 4.4.0 OculusIntegration 12.0 できること
現段階では指の伸びたか否かでの判定を用いてのジェスチャのデータ出力及びOculusQuestでのテスト
今回は グー、チョキ、パーの三つのジェスチャデータを出力してOculusQuestでテストしていますこちらのリポジトリで公開しています
まだリファクタリング等行ってないのでコードは若干ゃごちゃごちゃしてて扱いにくいけどとりあえず後悔した後で整備していく方針です
あとがき
今後ぼちぼちアップデートをしてできることをもう少し増やしたい...
HoloLensのブルームみたいな特定の一連の指の動きとか
この記事は今後ちょくちょく手を入れる予定
Rift Sでハンドジェスチャのテストができればいいんだがなぁとも思ったり思わなかったり、現時点ではRift Sでのハンドトラッキングは実装されてないので致し方なし