20200217のUnityに関する記事は7件です。

Unityのシェーダーができることを初心者視点で調査@202002

Unityでシェーダーしてデスストみたいなレーダーできるかを
シェーダー未経験が調べるメモ
「おっ」って感じたサイトまとめになった。。

A not very handy echolocation effect.

ロケーションソナーてきなことができそう、GC書き換えれば

http://www.shaderslab.com/demo-22---echolocation.html

NoName_2020-2-17_21-30-29_No-00.png

While the player is moving, textures change around him.

マテリアルを指定オブジェクト中心に切り抜きできる便利

http://www.shaderslab.com/demo-97---texture-switch-depending-player-pos.html

NoName_2020-2-17_21-31-5_No-00.png

【Unity】Shaderことはじめ【Shader : 0】

booth参考文献が良さそう
https://qiita.com/Nekomasu/items/6620ab19bfdaeb7743f2

Unityを利用した空間スキャンライン表現

これをベースにCG言語できればできそう
NoName_2020-2-17_20-41-49_No-00.png

https://styly.cc/ja/tips/unity-shader-worldscanline/#x

HoloShield

いろいろエフェクトつくから今後に使ってみたい
https://github.com/AdultLink/HoloShield#getting-started

NoName_2020-2-17_20-39-17_No-00.png

ShadersLaboratory

以下はShadersLaboratoryで気になったやつのメモ
Unityで使えるので助かります

Tessellation depending distance from camera

カメラからの奥行き具合で描画の細かさを変更
http://www.shaderslab.com/demo-46---tessellation-depending-distance-camera.html

Discard faces depending normal and camera

カメラからの奥行き具合で描画する三角形を変化
http://www.shaderslab.com/demo-51---discard-faces-depending-normal-and-camera.html

Section

切り口が描画されるからなにかに使えそう
http://www.shaderslab.com/demo-45---section.html

Volumetric sphere in a cube

矩形中心に円形を描画できる、地形データでもできたら良さそう
http://www.shaderslab.com/demo-32---volumetric-sphere-in-a-cube.html

Object pit wit a stencil buffer

重なり部を消して、裏側のマテリアル表示できるようです
http://www.shaderslab.com/demo-16---pit-an-object-with-stencil-buffer.html

Textures 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.html

Moss on rock,Snow effect

岩に草でてくる具合の調整
http://www.shaderslab.com/demo-27---moss-on-rock.html
岩に雪つもる具合の調整
http://www.shaderslab.com/demo-04---snow-effect.html

Circle 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

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

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のでかいボタンと保存先ディレクトリを開くボタンという激烈シンプルなものです。
録音中は録音ファイル名がボタン下部に表示されるようになっています。

ADX2UnityRecoder.png

ゲーム再生時、任意のタイミングでStart Recordingボタンを押し、止めたいところで同じボタンをもう一度押すだけです。
Add Timestamp to file name オプションで、ファイル名の後ろに日付・時刻を自動で入れます。
オプションをオンにすると、同一ファイル名で上書きしていく挙動になります。

wavの保存フォルダはデフォルトではAssets/Recordingsです。

録音の手法

CriAtomExOutputAnalyzerクラスを使ってミキシング後の音声データを取り出し、wavファイルに書き込みます。
https://game.criware.jp/manual/unity_plugin/jpn/contents/classCriAtomExOutputAnalyzer.html

CriAtomExOutputAnalyzerクラスによる音声データのキャプチャは、Update内でExecutePcmCaptureCallbackを叩き続ける必要があります。

CriAtomRecorder.cs
    private 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月現在)

UnityRecorder.png

Unity RecorderはADX2のエンジンで再生している音をキャプチャできないため、当初はUnity RecorderのAudioRecorderSettingsを拡張してADX2対応させる予定でしたが、必要なクラス一式がinternalで触れないため断念しました。

ただし、UnityEditor.Recorder.RecorderWindow.IsRecording()で録画中かどうかのステートが取れるため、このboolをポーリングしてUnityRecorderで録画が始まったら同時にCriAtomRecorderによる音声録音も開始して、同じくRecorder側での録画終了となったら録音を停止する仕組みを用意します。

CriAtomRecorderEditorWindow.cs
    private 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でのパッケージではコメントアウトしています)

Recorder連携2.png

CriAtomRecorderウィンドウを開くとUnity Recorderも勝手に開きます。このとき、Movieモジュールのキャプチャ設定で「Capture audio」のオプションを外してください。(どのみちADX2を導入したプロジェクトにはAudioListenerがないので、ワーニングが出ます)

Unity Recorder側の赤い録画ボタンを押せば、CriAtomRecorder側も録音を開始します。(昔のカセットテープで録音ボタンを押すと再生ボタンが同時押しされるやつみたいですね)

問題点

どうにかUnity Recorderとの連携はできましたが、わずかながらキャプチャのタイミングにずれがありますなので、トレイラームービーを作る場合はムービー作成ツール上でタイミングを合わせてあげる必要があります。

また、可能であればUnity Editorの時点で音声と動画をつなげたmp4を生成したいのですが、出力ファイルをフックしたりなどの手間がすごそうなので保留しました。

Unity Recorder内部のクラスが触れるようになれば、Recorderウィンドウだけで完結しそうなのですが、Recorder側の開国待ちです。

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

【Unity】時間によってSkyBoxの色を変化させる

概要

時間によって空の色を自由に変えます。
パーティクルのColor Over Lifetimeのように時間で変化するカラーをアニメーションカーブで再現しました。

結果

ezgif.com-optimize.gif

サンプルコード

DynamicSky.cs
using 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-17 17.45.25.png

終わりに

回転なども加えればより現実に近い挙動にできそうですね。

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

【Unity】現在時刻によってSkyBoxの色を変化させる

概要

時間によって空の色を自由に変えます。
パーティクルのColor Over Lifetimeのように時間で変化するカラーをアニメーションカーブで再現しました。

結果

ezgif.com-optimize.gif

サンプルコード

DynamicSky.cs
using 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

スクリーンショット 2020-02-17 17.45.25.png

追記

カーブは手動で編集せずスクリプトから設定することもできます。

        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);

終わりに

回転なども加えればより現実に近い挙動にできそうですね。

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

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
初めの抽象的に書いてる部分がすごいまとまってます。サンプルを複数見た後に読むとグッときます。
なのでここではまだ理解できないで大丈夫です。
image.png

③Unityコードサンプルで把握

https://github.com/QianMo/Unity-Design-Pattern
サンプルが2つあります。
中のサンプル2を自作したクラス図です。
image.png

④UnityでまなぶStrategyPatern

https://techlife.supride.jp/archives/1411
ここまで読むとだいだい理解できます。

⑤ もう一度②を読む

抽象的に書いてあるので、応用するときに気を付けなければいけない点がよくわかります。

StrategyPaternの使いどころ

抽象的に言うと
・アルゴリズム的な処理を入れ替えたいとき

具体的に読みやすくしたいと考えるタイミングで言うと
・Swich文を読みやすいように変更

もっと具体的にいうと
・映画館の価格表
・ポケモンの技みたいな分岐の実装

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

LeapMotionでOculusQuestのジェスチャデータを出力してテストするあれこれ作ってみた( 発展途上 )

OculusQuestのハンドトラッキングが実装されてからUnityでジェスチャを自前で作成してテストする際にいちいち実機に転送するのが結構煩わしかったのでそれっぽいもの作ってみた

最近はOculusLink使ってエディタでテストできるみたいだけど僕は持ってないのでLeapMotionで代用的な

対象となる人

  • OculusQuest持ってる
  • LeapMotion持ってる
  • OculusLink持ってない or 持ってるけどうまく動かなくて使ってない
  • Windowsユーザー( LeapMotionのSDKのバージョンで最新版はWindowsしか利用できないので )
  • ハンドトラッキングの自前ジェスチャを作って何かしたい

環境

OS Windows10
Unity 2018.4.14f1
LeapMotionSDK UnitySDK 4.4.0
OculusIntegration 12.0

できること

現段階では指の伸びたか否かでの判定を用いてのジェスチャのデータ出力及びOculusQuestでのテスト
今回は グー、チョキ、パーの三つのジェスチャデータを出力してOculusQuestでテストしています

データの出力
A.gif

出力されたジェスチャデータをOculusQuestでテスト
B.gif

こちらのリポジトリで公開しています

まだリファクタリング等行ってないのでコードは若干ゃごちゃごちゃしてて扱いにくいけどとりあえず後悔した後で整備していく方針です

あとがき

今後ぼちぼちアップデートをしてできることをもう少し増やしたい...
HoloLensのブルームみたいな特定の一連の指の動きとか
この記事は今後ちょくちょく手を入れる予定
Rift Sでハンドジェスチャのテストができればいいんだがなぁとも思ったり思わなかったり、現時点ではRift Sでのハンドトラッキングは実装されてないので致し方なし

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

LeapMotionでジェスチャデータを出力してOculusQuestでテストするあれこれ作ってみた( 発展途上 )

OculusQuestのハンドトラッキングが実装されてからUnityでジェスチャを自前で作成してテストする際にいちいち実機に転送するのが結構煩わしかったのでそれっぽいもの作ってみた

最近はOculusLink使ってエディタでテストできるみたいだけど僕は持ってないのでLeapMotionで代用的な

対象となる人

  • OculusQuest持ってる
  • LeapMotion持ってる
  • OculusLink持ってない or 持ってるけどうまく動かなくて使ってない
  • Windowsユーザー( LeapMotionのSDKのバージョンで最新版はWindowsしか利用できないので )
  • ハンドトラッキングの自前ジェスチャを作って何かしたい

環境

OS Windows10
Unity 2018.4.14f1
LeapMotionSDK UnitySDK 4.4.0
OculusIntegration 12.0

できること

現段階では指の伸びたか否かでの判定を用いてのジェスチャのデータ出力及びOculusQuestでのテスト
今回は グー、チョキ、パーの三つのジェスチャデータを出力してOculusQuestでテストしています

データの出力
A.gif

出力されたジェスチャデータをOculusQuestでテスト
B.gif

こちらのリポジトリで公開しています

まだリファクタリング等行ってないのでコードは若干ゃごちゃごちゃしてて扱いにくいけどとりあえず後悔した後で整備していく方針です

あとがき

今後ぼちぼちアップデートをしてできることをもう少し増やしたい...
HoloLensのブルームみたいな特定の一連の指の動きとか
この記事は今後ちょくちょく手を入れる予定
Rift Sでハンドジェスチャのテストができればいいんだがなぁとも思ったり思わなかったり、現時点ではRift Sでのハンドトラッキングは実装されてないので致し方なし

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