bluebirdofoz.hatenablog.com Open in urlscan Pro
54.199.90.60  Public Scan

Submitted URL: http://bluebirdofoz.hatenablog.com/
Effective URL: https://bluebirdofoz.hatenablog.com/
Submission: On January 11 via api from US — Scanned from JP

Form analysis 1 forms found in the DOM

GET https://bluebirdofoz.hatenablog.com/search

<form class="search-form" role="search" action="https://bluebirdofoz.hatenablog.com/search" method="get">
  <input type="text" name="q" class="search-module-input" value="" placeholder="記事を検索" required="">
  <input type="submit" value="検索" class="search-module-button">
</form>

Text Content

読者になる



MRが楽しい


MRやVRについて学習したことを書き残す

2024-01-10


NUGETFORUNITYを利用してUNITYからNUGETパッケージをインポートする

本日は Unity の小ネタ枠です。
NugetForUnityを利用してUnityからNuGetパッケージをインポートする方法です。


NUGETFORUNITY

NuGetForUnityはUnityエディターで実行できるNuGetクライアントです。
NuGetは開発者が役に立つコードを作成、共有、および使用するためのサーバー上のパッケージ管理システムです。
github.com



NUGETFORUNITYを使ってNUGETパッケージをインポートする

NugetForUnityのインストール方法にはOpenUPM、パッケージマネージャ、UnityPackageを利用する3つの方法があります。
今回はUnityPackageを利用します。以下のReleaseページからNugetForUnityのunitypackageファイルをダウンロードします。
github.com


ダウンロードしたパッケージを Unity プロジェクトにインポートします。


NugetForUnityのインポートが完了すると、メニューに[Nuget]が追加されます。
パッケージをインポートしたい場合は NuGet -> Manage NuGet Packages をクリックします。


Nuget For Unity ウィンドウが開きます。
インポートしたいパッケージ名を入力して[Search]をクリックして検索を行います。


パッケージのバージョンを選択して[Install]でパッケージのインポートが実行されます。


NugetForUnityでインポートしたパッケージはAssets/Package配下にダウンロードされます。


ホロモン (id:bluebirdofoz) 12時間前




広告を非表示にする

 * もっと読む

コメントを書く
2024-01-09


UNITYで基本変形(移動・回転・スケール)のアニメーションを作成する その7(全ての状態から割り込みでアニメーションを切り替える)

本日は Unity の技術調査枠です。
基本変形(移動・回転・スケール)のアニメーションを作成する方法についてまとめます。
今回は全ての状態から割り込みでアニメーションを切り替える方法です。


前回記事

以下の記事の続きになります。
bluebirdofoz.hatenablog.com



様々なアニメーションに遷移させる

前回作成した State を遷移するアニメーションコントローラの遷移先を増やします。
それぞれ上下左右移動のアニメーションを作成して State に設定を行いました。


合わせてスクリプトを以下の通り修正して、WASDキーに合わせてCubeが移動するようにしました。

using UnityEngine;

[RequireComponent(typeof(Animator))] 
public class MoveTrigger : MonoBehaviour {
    /// <summary>
    /// Animatorコンポーネント
    /// </summary>
    [SerializeField]
    private Animator animator;

    private static readonly int UpTrigger = Animator.StringToHash("UpTrigger");
    private static readonly int DownTrigger = Animator.StringToHash("DownTrigger");
    private static readonly int RightTrigger = Animator.StringToHash("RightTrigger");
    private static readonly int LeftTrigger = Animator.StringToHash("LeftTrigger");

    /// <summary>
    /// 参照の設定
    /// </summary>
    void Reset () {
        // Animatorコンポーネントの取得
        animator = GetComponent<Animator>();
    }

    /// <summary>
    /// 定期実行
    /// </summary>
    void Update()
    {
        // Wキー押下で実行する
        if (Input.GetKey(KeyCode.W))
        {
            // トリガーを実行する
            animator.SetTrigger(UpTrigger);
        }
        // Sキー押下で実行する
        if (Input.GetKey(KeyCode.S))
        {
            // トリガーを実行する
            animator.SetTrigger(DownTrigger);
        }
        // Aキー押下で実行する
        if (Input.GetKey(KeyCode.A))
        {
            // トリガーを実行する
            animator.SetTrigger(LeftTrigger);
        }
        // Dキー押下で実行する
        if (Input.GetKey(KeyCode.D))
        {
            // トリガーを実行する
            animator.SetTrigger(RightTrigger);
        }
    }
}


この状態でシーンを再生して動作確認してみます。
WASDキーの入力に応じてCubeが移動しますが、アニメーションが終了するまで次のアニメーションの割り込みはできません。


これはWaitStateからのみ遷移が設定されているためです。




割り込みでアニメーションを切り替える

アニメーションを割り込ませるには全ての状態で各 State への遷移を設定する必要があります。
このとき、AnyState を利用すると便利です。AnyState はあらゆる状態からの遷移を設定できます。
docs.unity3d.com

以下の通り、各 State への遷移を AnyState からに変更しました。


この状態でシーンを再生して動作確認してみます。
WASDキーの入力に応じてアニメーションが即座に切り替わり、Cubeが移動するようになりました。


ホロモン (id:bluebirdofoz) 1日前




広告を非表示にする

 * もっと読む

コメントを書く
2024-01-08


UNITYで基本変形(移動・回転・スケール)のアニメーションを作成する その7(アニメーションの終了を検知する)

本日は Unity の技術調査枠です。
基本変形(移動・回転・スケール)のアニメーションを作成する方法についてまとめます。
今回はアニメーションの終了を検知する方法です。


前回記事

以下の記事の続きになります。
bluebirdofoz.hatenablog.com



アニメーションの終了を検知する

前回作成した[Loop Time]を無効化したアニメーションコントローラを利用します。


アニメーションの終了を検知するには normalizedTime を利用します。
normalizedTime は 0 から始まり、アニメーションの再生がすべて完了すると 1 になります。
State が変わらないままアニメーションがループする場合は 1 から更に加算されていきます。
docs.unity3d.com

スクリプトを修正してアニメーションを再生したときにその状態をログ出力するようにしました。
・AnimationKicker.cs

using UnityEngine;

[RequireComponent(typeof(Animator))] 
public class KickTrigger : MonoBehaviour {
    /// <summary>
    /// Animatorコンポーネント
    /// </summary>
    [SerializeField]
    private Animator animator;
    
    /// <summary>
    /// 待機状態ID
    /// </summary>
    int waitSateHash = Animator.StringToHash("Base Layer.WaitState");

    /// <summary>
    /// 参照の設定
    /// </summary>
    void Reset () {
        // Animatorコンポーネントの取得
        animator = GetComponent<Animator>();
    }

    /// <summary>
    /// 定期実行
    /// </summary>
    void Update()
    {
        // Zキー押下で実行する
        if (Input.GetKey(KeyCode.Z))
        {
            // トリガーを実行する
            animator.SetTrigger("AnimTrigger");
        }

        if (animator.GetCurrentAnimatorStateInfo(0).fullPathHash != waitSateHash)
        {
            if (animator.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f)
            {
                Debug.Log("アニメーション再生中");
            }
            else
            {
                Debug.Log("アニメーション終了");
            }
        }
    }
}



動作確認

シーンを再生してZキーを押下し、アニメーションを開始します。


以下の通りアニメーション再生中と終了のタイミングでログが切り替わりました。



ホロモン (id:bluebirdofoz) 2日前




広告を非表示にする

 * もっと読む

コメントを書く
2024-01-07


UNITYで基本変形(移動・回転・スケール)のアニメーションを作成する その6(アニメーションを一度だけ再生する)

本日は Unity の技術調査枠です。
基本変形(移動・回転・スケール)のアニメーションを作成する方法についてまとめます。
今回はアニメーションを一度だけ再生する方法です。


前回記事

以下の記事の続きになります。
bluebirdofoz.hatenablog.com



アニメーションを繰り返さず一度だけ再生する

前回作成したアニメーションコントローラの設定だとアニメーションが繰り返され、オブジェクトが移動し続けます。


今回はアニメーションを繰り返さず、一度だけ再生するように設定してみます。
以下の2つの方法があります。

LOOP TIMEを無効化する

1つはアニメーションファイルの[Loop Time]を無効化する方法です。
アニメーションファイルを選択し、Inspector ビューから[Loop Time]のチェックを外します。


これでアニメーションは一度しか再生されなくなります。
Unity の[再生]ボタンで動作を確認すると、アニメーションが一度だけで止まるようになっています。



STATEを変更する

もう1つはアニメーションの状態を再生次第、すぐに待機状態に戻してしまう方法です。
アニメーションコントローラを選択し、[Animator]画面を開きます。


待機状態に戻す遷移を作成します。
[CubeAnimation]を 右クリック -> Make Transition で[WaitState]へ線を引きます。


ここでトリガーの設定は行わず、[List is Empty]のままにしておきます。
これにより[CubeAnimation]への遷移した後、即座に状態が[WaitState]に戻るようになります。


これでアニメーションが一度実行された後は[WaitState]に戻っているため、アニメーションが繰り返し再生されなくなります。
Unity の[再生]ボタンで動作を確認すると、アニメーションが一度だけで止まるようになっています。


2つの方法は同じ動きですが、それぞれアニメーション実行後の State が異なることに注意が必要です。


アニメーションの繋がり

2つ目の待機状態に戻す方法をそのまま利用すると、アニメーションの最後が少しカクつきます。
これはアニメーションの繋がりがデフォルトだと、以下のように一部重なった状態になっているためです。


以下の通り、アニメーションが重ならないよう変更します。
1.[Exit Time](遷移先アニメーションの実行開始タイミング)を[1]に設定する。
2.[Transition Duration](重なりの秒数)を[0]に設定する。


これで再生を行うとアニメーションが最後まで綺麗に再生されます。

ホロモン (id:bluebirdofoz) 3日前




広告を非表示にする

 * もっと読む

コメントを書く
2024-01-06


UNITYで基本変形(移動・回転・スケール)のアニメーションを作成する その5(アニメーションを任意のタイミングで実行する)

本日は Unity の技術調査枠です。
基本変形(移動・回転・スケール)のアニメーションを作成する方法についてまとめます。
今回はアニメーションを任意のタイミングで実行する方法です。


前回記事

以下の記事の続きになります。
bluebirdofoz.hatenablog.com



アニメーション任意のタイミングで実行する

任意のタイミングでアニメーションを実行するにはアニメーションコントローラに State を定義する必要があります。
前回記事で作成したアニメーションコントローラを編集するため、controller ファイルを選択して[Animator]画面を開きます。


前回記事で自動作成したアニメーションコントローラにはアニメーションへの自動遷移が既に設定されています。
任意のタイミングでアニメーションを実行するため、以下の通りコントローラを修正する必要があります。
1.最初はアニメーション無しの待機状態に遷移する
2.トリガーに応じてアニメーションの状態に遷移する


待機状態を作成する

まず、最初に遷移するアニメーション無しの待機状態を作成します。
作成済みのアニメーションの State を 右クリック -> Delete で削除します。


次に 右クリック -> Create State -> Empty で新しい状態を作成します。


State が作成出来たら分かりやすい名前に変更します。今回は[WaitState]としました。
Motion は[None]のままにしておきます。[None]はアニメーション無しの設定です。




アニメーションの実行状態と遷移を作成する

同じ手順でもう一つ State を作成します。
こちらは Motion に実行したいアニメーションを設定します。こちらは[CubeAnimation]と名付けました。


次にアニメーションを実行するトリガーを作成します。
[Animator]画面の[Parameters]タブを開き、[+]ボタンから[Trigger]を選択して追加します。


作成されたトリガーの名称を設定します。
指定した名称はコード上で利用するため、綴り誤りに注意します。今回は[AnimTrigger]としました。


State 間を結ぶ遷移を作成します。[WaitState]上で右クリックして[Make Transition]を選択します。
遷移を示す線が表示されるので[CubeAnimation]と接続します。


作成したトランザクションの線を選択し、遷移のトリガーを設定します。
[+]ボタンをクリックし、先ほど作成した[AnimTrigger]を設定します。


これでアニメーションコントローラの修正は完了です。


アニメーションを操作するスクリプトを作成する

次に任意のタイミングでアニメーションを実行するスクリプトを作成します。


以下のようなキーボードの[Z]キーでトリガーを実行するコードを作成しました。
・KickTrigger.cs

using UnityEngine;

[RequireComponent(typeof(Animator))] 
public class KickTrigger : MonoBehaviour {
    /// <summary>
    /// Animatorコンポーネント
    /// </summary>
    [SerializeField]
    private Animator animator;

    /// <summary>
    /// 参照の設定
    /// </summary>
    void Reset () {
        // Animatorコンポーネントの取得
        animator = GetComponent<Animator>();
    }

    /// <summary>
    /// 定期実行
    /// </summary>
    void Update()
    {
        // Zキー押下で実行する
        if (Input.GetKey(KeyCode.Z))
        {
            // トリガーを実行する
            animator.SetTrigger("AnimTrigger");
        }
    }
}


スクリプトをアニメーションコントローラを持つ Animator コンポーネントを持つオブジェクトに設定します。




動作確認

Unity の[再生]ボタンをクリックし、動作確認を行います。


キーボードの[Z]キーを押下したタイミングでアニメーションが開始すれば成功です。


ホロモン (id:bluebirdofoz) 4日前




広告を非表示にする

 * もっと読む

コメントを書く
2024-01-05


RIDERのSEARCHEVERYWHEREを使ってプロジェクト内の検索を行う

本日はRiderの小ネタ枠です。
RiderのSearchEverywhereを使ってプロジェクト内の検索を行う方法についてです。


RIDERの環境構築

JetBrains Rider の環境構築手順は以下を参照ください。
bluebirdofoz.hatenablog.com



SEARCHEVERYWHEREを使ってプロジェクト内の検索を行う

RiderのSearchEverywhereを利用するにはエディター上で以下のいずれかを実行します。
・画面左上の[Search everywhere]をクリックする


・[Ctrl+T]キーまたは2回連続で[Shift]キーを押す


SearchEverywhereではソリューション内の様々な要素を検索できます。
例えば、以下のように
All(全て)、Class(クラス名)、File(ファイル名)、Symbol(関数名や変数名など)、Actions(実行可能なアクション)、Text(テキスト一致のみ)
など対象を指定して検索を実行できます。

ALL



本項目は右上のフィルターボタンから検索対象の指定を変更できます。



CLASS




FILE




SYMBOL




ACTIONS




TEXT



本項目は右上のソリューションプルダウンから検索対象のファイル拡張子を指定できます。




特殊な検索文字

"(ダブルクォーテーション)で文字を囲むと、完全一致を検索できます。
例えば、"Test"で検索した場合は Test のみが対象となり、ApplicationTest や Test() は検索結果に表示されません。


:(セミコロン)、+(プラス)、*(アスタリスク) などのワイルドカードも利用可能です。


ホロモン (id:bluebirdofoz) 5日前




広告を非表示にする

 * もっと読む

コメントを書く
2024-01-04


QUEST3で現実空間との境界部分を強調表示させる

本日はMetaQuest3の小ネタ枠です。
Quest3で現実空間との境界部分を強調表示させてみたので記事に手法を残します。


前提条件

以下の記事を参考に、Quest3でのオクルージョン表示を有効にしたプロジェクトを作成してください。
bluebirdofoz.hatenablog.com



現実空間との境界部分を強調表示する

前提条件の記事でカスタマイズしたシェーダを修正し、境界部分が強調表示されるようにします。
オクルージョン用のシェーダは以下に保存されています。

Packages/DepthAPI/Runtime/Core/Shaders/EnvironmentOcclusion.shader



本シェーダファイルの META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLY_WORLDPOS
定義で敷居値を用いたオクルージョンの実装方法が確認できます。

#define META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLY_WORLDPOS(posWorld, output, zBias) \
    float occlusionValue = META_DEPTH_GET_OCCLUSION_VALUE_WORLDPOS(posWorld, zBias); \
    if (occlusionValue < 0.01) { \
      discard; \
    } \
    output *= occlusionValue; \

今回はPackage配下のシェーダファイルを直接編集せず、MRTKのスタンダードシェーダに更に手を加えました。

// META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLYを使用する箇所を変更する
//META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLY(i, output, 0.0);
// 境界部分を赤色強調表示するため、以下のようにコードを修正する
float occlusionValue = META_DEPTH_GET_OCCLUSION_VALUE_WORLDPOS(i.posWorld, 0.0); // 境界値を取得(0.0が隠蔽部分、1.0が通常表示)
if (occlusionValue < 0.01) {
    discard; // 完全な隠蔽部分は描画しない
}
float inversion = 1.0 - occlusionValue; // 境界部分の強調度合い(隠蔽部分に近いほど強調表示する)
float emphasis = output.r + ((1.0 - output.r) * inversion); // 赤色の元値に強調度合いを足し合わせる
output = fixed4(emphasis, output.g * occlusionValue, output.b * occlusionValue, output.a); // 計算後の色を返す






ビルドと動作確認

これで設定は完了です。
以下の記事を参考にプロジェクトのビルドとQuest3へのデプロイを実行してください。
bluebirdofoz.hatenablog.com

以下の通り、現実空間との境界部分を赤色で強調表示させることができました。


あくまでオクルージョンの境界を強調表示しているのみなので、現実空間との接触部分が強調表示されている訳ではない点に注意してください。
接触部分の強調表示を行う方法も別途調査してみます。

ホロモン (id:bluebirdofoz) 6日前




広告を非表示にする

 * もっと読む

コメントを書く
次のページ

プロフィール
ホロモン (id:bluebirdofoz)

MRやVRについて学習したことを書き残す

読者です 読者をやめる 読者になる 読者になる
170
@HoloAdventureをフォロー
このブログについて

検索

リンク
 * 夜風のMixedReality

最新記事
 * NugetForUnityを利用してUnityからNuGetパッケージをインポートする
 * Unityで基本変形(移動・回転・スケール)のアニメーションを作成する その7(全ての状態から割り込みでアニメーションを切り替える)
 * Unityで基本変形(移動・回転・スケール)のアニメーションを作成する その7(アニメーションの終了を検知する)
 * Unityで基本変形(移動・回転・スケール)のアニメーションを作成する その6(アニメーションを一度だけ再生する)
 * Unityで基本変形(移動・回転・スケール)のアニメーションを作成する その5(アニメーションを任意のタイミングで実行する)

月別アーカイブ
 * ▼ ▶
   2024 (10)
   * 2024 / 1 (10)
 * ▼ ▶
   2023 (365)
   * 2023 / 12 (31)
   * 2023 / 11 (30)
   * 2023 / 10 (31)
   * 2023 / 9 (30)
   * 2023 / 8 (31)
   * 2023 / 7 (31)
   * 2023 / 6 (31)
   * 2023 / 5 (30)
   * 2023 / 4 (30)
   * 2023 / 3 (31)
   * 2023 / 2 (28)
   * 2023 / 1 (31)
 * ▼ ▶
   2022 (372)
   * 2022 / 12 (32)
   * 2022 / 11 (29)
   * 2022 / 10 (31)
   * 2022 / 9 (30)
   * 2022 / 8 (38)
   * 2022 / 7 (31)
   * 2022 / 6 (30)
   * 2022 / 5 (31)
   * 2022 / 4 (30)
   * 2022 / 3 (31)
   * 2022 / 2 (28)
   * 2022 / 1 (31)
 * ▼ ▶
   2021 (365)
   * 2021 / 12 (31)
   * 2021 / 11 (30)
   * 2021 / 10 (31)
   * 2021 / 9 (30)
   * 2021 / 8 (31)
   * 2021 / 7 (31)
   * 2021 / 6 (30)
   * 2021 / 5 (31)
   * 2021 / 4 (30)
   * 2021 / 3 (31)
   * 2021 / 2 (28)
   * 2021 / 1 (31)
 * ▼ ▶
   2020 (367)
   * 2020 / 12 (31)
   * 2020 / 11 (30)
   * 2020 / 10 (31)
   * 2020 / 9 (30)
   * 2020 / 8 (31)
   * 2020 / 7 (31)
   * 2020 / 6 (30)
   * 2020 / 5 (32)
   * 2020 / 4 (30)
   * 2020 / 3 (31)
   * 2020 / 2 (29)
   * 2020 / 1 (31)
 * ▼ ▶
   2019 (366)
   * 2019 / 12 (31)
   * 2019 / 11 (31)
   * 2019 / 10 (31)
   * 2019 / 9 (30)
   * 2019 / 8 (31)
   * 2019 / 7 (31)
   * 2019 / 6 (30)
   * 2019 / 5 (31)
   * 2019 / 4 (30)
   * 2019 / 3 (31)
   * 2019 / 2 (28)
   * 2019 / 1 (31)
 * ▼ ▶
   2018 (383)
   * 2018 / 12 (31)
   * 2018 / 11 (30)
   * 2018 / 10 (31)
   * 2018 / 9 (30)
   * 2018 / 8 (38)
   * 2018 / 7 (31)
   * 2018 / 6 (30)
   * 2018 / 5 (31)
   * 2018 / 4 (33)
   * 2018 / 3 (32)
   * 2018 / 2 (28)
   * 2018 / 1 (38)
 * ▼ ▶
   2017 (289)
   * 2017 / 12 (31)
   * 2017 / 11 (40)
   * 2017 / 10 (32)
   * 2017 / 9 (30)
   * 2017 / 8 (32)
   * 2017 / 7 (33)
   * 2017 / 6 (28)
   * 2017 / 5 (29)
   * 2017 / 4 (34)

MRが楽しい

Powered by Hatena Blog | ブログを報告する




引用をストックしました

ストック一覧を見る 閉じる

引用するにはまずログインしてください

ログイン 閉じる

引用をストックできませんでした。再度お試しください

閉じる

限定公開記事のため引用できません。

読者です 読者をやめる 読者になる 読者になる
170