そういうのがいいブログ

アプリ個人開発 まるブログ

アプリ開発覚え書き

【Unity】略称UTSの最新は Unity Toon Shader であるという話

はじめに

ユニティちゃんトゥーンシェーダーの最新が使いたかったのですが、
略称のUTSで検索すると古いシェーダーの情報が出てきてしまい混乱します。
そこで自分用にちょっとまとめました。

結論

最新の名称は「Unity Toon Shader」です。

docs.unity3d.com

バージョンと呼び方まとめ

大雑把に分けると下記のようになります。

Ver1(初代)

  • ユニティちゃんトゥーンシェーダー
  • 略称:UTS(非公式・通称)

Ver2(UTS2系)

  • ユニティちゃんトゥーンシェーダー2.0
  • UTS/UniversalToon(UTSのURP版はこちらで呼ばれる)
  • 略称:UTS2(通称)

Ver3(現行・公式後継)

  • Unity Toon Shader
  • 略称:UTS(非公式で使われることあり)

【Unity】VRM1.0 のリップシンクをする uLipSync

要件

Unity: 6000.3.2f1
UniVRM: 0.108.0
URPプロジェクト

はじめに

音声を解析してキャラクターの口を動かす uLipSync を、
UPM(Package Manager)経由で導入し、
VRM1.0モデルに適用するメモです。

github.com

1.uLipSyncの導入

uLipSync は いろいろな導入方法がありますが、
今回は UPM(Package Manager)で導入します。

1-1. UPM(Package Manager)前準備

→編集
→プロジェクト設定


→パッケージマネージャー
こちらでパッケージの場所を指定します。


下記を入力して保存を押します。
名前:hecomi-npm(なんでもいいです)
URL:https://registry.npmjs.com
Scope(s):com.hecomi
→保存


1-2.パッケージマネージャーからインストール

→ウインドウ
→Package Management
→パッケージマネージャー


→マイレジストリ
→hecomi-npm(先ほどつけた名前)
→uLipSync
→インストール


パッケージが署名されていないというウインドウが出た場合は
「パッケージマネージャー」のボタンを押します。


これでインストール完了です。


2.uLipSyncのVRMサンプルを使用できる状態にする

VRMを動かすサンプルのダウンロード後、
プロジェクト設定を少し変更し、サンプルを使える状態にします。

2-1. VRM サンプルをダウンロード

uLipSyncではサンプルが複数用意されているためこちらを活用していきます。

パッケージマネージャーのuLipSyncを表示した状態
→サンプル
→04. VRM
→インポート


インストール後、プロジェクトタブにサンプルのフォルダが表示されます。

2-2.プロジェクト設定変更

今回、VRM1.0を使用するということで設定が必要です。
→編集
→プロジェクト設定


→プレイヤー
→スクリプトコンパイル
→「+」ボタン


→「USE_VRM10」を入力
→「適用する」を押す

以上で準備完了です。


3.サンプルを動作させる

3-1.サンプルを開く

先ほどインポートした「04.VRM」フォルダの「04-2.VRM1.0」シーンを開きます。

3-2.同梱モデルのマテリアルを変更

URPプロジェクトの場合はマテリアルが対応しておらずピンク色になってしまいます。
修正するには下記の手順でマテリアルの設定を変更してください。
→04.VRMフォルダ
→VRMフォルダ
→1.0フォルダ
→ uLipSync-VRM1 をクリック
→インスペクターの上部「Materials」をクリック
→Render Pipeline を「Universal Render Pipeline」へ変更
→「適用する」をクリック

モデルがエラーなく表示されました。

3-3. 3つのコンポーネントを設定

リップシンクを行うにあたり、
VRMオブジェクトに追加が必要なコンポーネントは次の3つです。
・Audio Source(音声ファイルを再生する)
・U Lip Sync(メインのリップシンク処理コンポーネント)
・U Lip Sync Expression VRM(VRM の表情に反映する)

サンプルのオブジェクトには追加済みとなっています。
リップシンク実現に向けた必要な設定していきます。

3-3-1.Audio Source コンポーネント

Audio Source には再生する音源を登録します。

プロジェクトに使用したい音源をインポートし、
Audio Source コンポーネントのAudio Generator 欄に割り当てます。


3-3-2.U Lip Sync コンポーネント

U Lip Sync コンポーネントは、
音源を解析して指定のプログラムに情報を伝達するコンポーネントです。

まずは、プロファイルの設定を行います。
プロファイルとは?
音声解析結果を“どの口形(Viseme)にどれだけ反映するか”を決める設定データです。

プロファイルデータはサンプルを用意していただいているので
サンプルをそのまま使用します。
→「プロジェクト」タブ
→Packages
→uLipSync
→Assets
→Profiles
→uLipSync-Profile-Sample-Female をプロファイル欄に割当て


割当て後はこのように表示されます。


次に解析情報を伝える設定をします。
実はすでに登録済みなのですが、モデルが変わった時に設定が必要なため書いておきます。

設定する箇所は画像の部分です。


これは下記の情報を登録する内容になっています。
・動作させたいオブジェクトを指定
・どのコンポーネント の どの処理かを動かすか を指定

設定を解除して最初から登録すると次のようになります。

動作させたいオブジェクトを指定


処理内容を指定
→「U Lip Sync Expression VRM」コンポーネントの「OnLipSyncUpdate」を登録


3-3-3.U Lip Sync Expression VRM コンポーネント

U Lip Sync Expression VRM コンポーネントは、
VRMの表情にアクセスするコンポーネントです。

表情に反映する強さを変更することができます。

たとえば、母音の"A"成分をなくしたい場合は、該当する値を0にすることで実現可能です。

実際に実行して調整することになるでしょう。

4.確認

実行してリップシンクしていることを確認します。

おわりに

手軽にリップシンクができてしまうuLipSyncに感謝です。

この記事がなにかお役に立てましたら幸いです。

【Steamworks】アプリデータをアップロードすると Error code was 9 Error text: Did not receive entire file というメッセージが出る

内容

Steamworks上でアプリデータをアップロードしたところ、
以下のメッセージがでました。
・Error code was 9
・Error text: Did not receive entire file

こちらはWindowsMacの両OSで発生しています。

対策

エラーの原因はSteam側の不具合のようで、
対策は「数時間後に何度かアップロードしてみる」になります。

今回の場合、12時間後に数回アップロードを試みたところ、
3回目のトライでアップロードに成功しました。
1回目:同様のエラー
2回目:同様のエラー
3回目:アップロード成功

同じエラーが出た方の参考になれば幸いです。

【Unity × Google AI】無料で使えるのは今だけ?Antigravityで爆速開発環境を作る方法

要件

Unity 6000.0.58f2

はじめに

無料で自動コーディングができるということで
Google のAIエディタ「Antigravity」を導入して簡単なゲームを作ってみました。

ダウンロード方法から実際にゲームが動くところ試した過程を残します。

ダウンロード方法

ダウンロードできるページはこちらです。 antigravity.google



ダウンロードボタンを押します。



PCに応じたファイルをダウンロードしてください。


エディタセットアップ

エディタを起動したら初期設定の画面になりますので進めていきます。
全6ステップです。



まずはNextを押して進めます。


1.エディタ設定インポート

IDEの設定インポートする?的なことを聞かれます。
私はVS Codeは使用していないため「Start fresh」で進めました。


2エディタテーマの決定

エディタのテーマ(デザイン)を決めます。 私は「Drak」を選択。



3.開発方針の設定

次はどの程度AIが勝手に進めるかの方針を選択します。

左側の項目を選択することで右側の方針設定が変わるようになっており、
以下の4つが用意されていました。
・Agent-driven development - AI主導型開発
・Agent-assisted development - AI支援型開発
・Review-driven development - レビュー主導型開発
・Custom configuration - カスタム構成

私はバランスが良さそうな「Agent-assisted development」を選択しました。

右側の3項目の内容は以下となります。
1. Terminal execution policy(ターミナル実行ポリシー)
 ・Turbo:ユーザーの確認なしに進める
 ・Auto:安全なコマンドと判断された場合にのみ自動で進める
 ・Off:コマンドを実行しない
 
2. Review policy(レビューポリシー)
・Always proceed:AIは一切レビューを要求せず、自律的に次のステップへ進みます。
・Agent decides:AIはレビューが必要な場合にのみ要求します。
・Request review:AUは常に人間のレビューを要求してから次のステップへ進みます。

3. Use the default allowlist for the browser(ブラウザのデフォルトの許可リストを使用)
 エージェントがインターネット上の情報にアクセスする際のセキュリティ設定です。
 あらかじめ安全性が確認されたドメイン(許可リスト)のみにアクセスを制限します。



4.エディタ拡張機能の設定

次はエディタの拡張機能の設定です。
3項目の設定をどうするかを決めます。私はそのまま「Next」で進めました。

項目の内容
1. Keybindings(キーバインド
 エディタで使用するキーボードショートカットの配列設定。
 Normal: 標準的なキー操作パターン。
 Vim: テキストエディタVim向けのターン。Vimに慣れている開発者向けです。

2. Extensions(拡張機能
 Antigravityエージェント機能の一部に必要な「一般的な言語拡張機能」を、
 この時点でインストールするかどうかを設定します。

3. Command Line(コマンドライン
 Antigravityをコマンドラインから起動・操作するためのツールのインストール設定です。



5.Googleでサインイン

Googleアカウントでサインインします。



6.利用規約に同意

利用規約はざっくりと以下が書いてあります。

注意点(ユーザーに求められる行動)
・Antigravityには特定のセキュリティ上の制限があることを認識すること。
・データ流出や意図しないコード実行を含む潜在的なリスクに注意すること。
・機密性の高いデータを処理することは避けること。
AUが実行したすべてのアクションを必ず確認(Verify)すること。

同意事項(データ収集に関する承諾)
Googleが、Antigravityの利用を通じて発生した操作データを収集し、利用すること。
・データの利用目的は、GoogleとAlphabetの研究、製品、サービス、
 および機械学習技術の評価、開発、改善のためであること。


利用規約の画面から進めると管理者権限を要求されます。
「OK」を押して進めます。


左下にインストールしてますのコメントが表示されるため消えるまで待ちます。(5分ほど)

以上でセットアップは完了です!



自動コーディングで作る

ではいよいよ自動コーディングをやっていきましょう。

1.前準備 Unityの新規プロジェクトを立ち上げ

UnityでURPの2Dプロジェクトを新規で作りました。
プロジェクトは開きっぱなしで大丈夫です。

2.対象フォルダの指定

青色の「Open Folder」ボタンから先ほど作成したUnityプロジェクトのフォルダを指定します。


フォルダを指定すると「フォルダ内のファイルの作成者を信頼しますか?」と聞かれますので
「Yes, I trust the authors」をクリックして進めます。


3.指示を出す

右側のウインドウに指示を入力します。(日本語でも大丈夫です。)
今回は、「ランダムに出現する数字を1から順番に押していくゲームを作成して」
というなんとも雑な指示をしてみました。



Unityプロジェクトであることも指示が必要だったようで下記のやりとりも交えつつ進めました。
AI:Webアプリですか?Unityプロジェクトですか?
私:Unityプロジェクトです。

AI:(英語の回答)
私: 日本語で回答して

その後、スクリプトが作成され、
UI作成、プレハブ作成、ゲームマネージャーの設定方法まで提示してくれました。


UI作成も自動生成でできないか聞いてみたところ、
Unityエディタを操作するスクリプトを書くことで実現できるようです。


Unityの上部メニューバーにセットアップメニューを作ったということで
確認してみると本当にできていました。


押してみると・・・
UIやプレハブができてる・・・
すごい・・・


そして、実行してみるとちゃんと動きました。


遊んでみた動画はこちら


日本語化

日本語で進めたい方は、以下の設定で日本語化が可能です。
「エディター側の日本語化」と「AIの返答を日本語化」はそれぞれで設定が必要です。

エディターの日本語化

エディターの日本語化は、次の手順です。
→エディタ左側の四角アイコン
→検索窓に「japanese」と入力
→「Japanees Language...」をクリック
→「Install」をクリック


Do you trust the publisher "MS-CEINTL"?
(発行元「MS-CEINTL」を信頼しますか?)
というウインドウが出るため「Trust Publisher & Install」をクリックして進めます。


「Change Language and Restart」というボタンを押して再起動します。

これでエディターの英語表記が日本語になりました。


AIの返答を日本語化

AIの回答をデフォルトで日本語にするためには次の設定を行います。

→右上の三点マーク
→Customizations


→ Rules
→ +Global


→「日本語で回答してください」と入力


入力内容をセーブします。
Windows:Ctrl+S
Mac:command + S


セーブ後、GEMINI.mdファイルの右横の⚫︎のマークが×に変わります。


さいごに、「Rules」横の更新マークを押して完了です。


ちなみに、チャットメニューに戻るには「Back to Agent」で戻ることができます。

おわりに

感想としては、無料でここまで使えてよいの?という感覚です。

グーグルマップのように無料で提供することで、競合に打撃を与え、
市場で圧倒的な優位を築く戦略なのでしょうかね。

いつ有料になってもおかしくないレベルなので早めに触っておくことをオススメします。

【Unity】マテリアルのHDRカラー強さをスライダーで調整する方法

要件

Unity6000.026f1
URPプロジェクト

はじめに

マテリアルのHDRカラーの「強さ」の変更方法で少し詰まったのでメモ

まず、HDRカラーの「強さ」を設定する専用の変数は存在しません。
色のR,G,Bの値に数値を乗算することで実現します。

サンプル

using UnityEngine;
using UnityEngine.UI;

public class HDRColorController : MonoBehaviour
{
    [Header("UI")]
    [SerializeField] private Slider _colorIntensitySlider;   // HDR強度スライダー
    [SerializeField] private Image _colorImage;              // 色取得用UI(ColorPickerなど)

    [Header("Material Settings")]
    [SerializeField] private Material _backgroundImageBaseMaterial; // 操作対象のマテリアル
    [SerializeField] private string _colorPropertyName = "_Color";  // マテリアルのColorプロパティ名(Reference名)

    private void Start()
    {
        // スライダーが設定されているか確認
        if (_colorIntensitySlider != null)
        {
            _colorIntensitySlider.onValueChanged.AddListener(OnColorIntensityChanged);
        }
    }

    /// <summary>
    /// HDR強度スライダーが変更された時に呼ばれる処理
    /// </summary>
    private void OnColorIntensityChanged(float value)
    {
        if (_backgroundImageBaseMaterial == null || _colorImage == null)
            return;

        // マテリアルにプロパティが存在するか検証
        if (_backgroundImageBaseMaterial.HasProperty(_colorPropertyName))
        {
            // UIから選択された色
            Color baseColor = _colorImage.color;

            // HDR強度を2のべき乗で計算
            float factor = Mathf.Pow(2, value);

            // HDR適用(RGBのみ拡張)
            Color hdrColor = new Color(
                baseColor.r * factor,
                baseColor.g * factor,
                baseColor.b * factor,
                baseColor.a
            );

            // マテリアルに設定
            _backgroundImageBaseMaterial.SetColor(_colorPropertyName, hdrColor);
        }
    }
}


スライダーの値を2のべき乗としている理由は、
HDRの強度は「線形に上げる」よりも「指数的に上げる」方が自然なためです。
お好みによりスライダーの値をそのまま使用しても問題ありません。

            // HDR強度を2のべき乗で計算
            float factor = Mathf.Pow(2, value);

参考

https://discussions.unity.com/t/how-to-get-set-hdr-color-intensity/226028

【Unity】Sharder Graph サブグラフ(Sub Graph)の表示をQuad表示にする方法

要件

Unity 6000.026f1
URPプロジェクト

はじめに

Sharder Graph を扱う際、
Sub Graphを使うことがあるのですが、球体表示になっていてわかりにくいです。
2D表示への変更方法をメモしておきます。

初期設定

変更後

 

変更方法

サブグラフを開いてGraph Inspectorの設定を変更します。


変更内容はタブ「Graph Settings」の
項目「Preview」を「Preview 2D」へ変更するだけです。

最後にサブグラフを保存して完了です。

確認

サブグラフを呼び出すと2D表示になっていることが確認できます。

以上です。

【Unity】URPプロジェクトで Mtoon10 のアウトラインを表示する方法

要件

Unityバージョン 6000.026f1
UniVRM 0.108.0
URPプロジェクト

はじめに

VRMのアウトラインの内容を変更するため
Mtoon10のアウトライン項目を変更しても変化がない。

最新のUniVRMのバージョンでは解決されているようだが、
自プロジェクトでは UniVRM 0.108.0 を使用する必要があるため更新できない状況。

そのため、以下の変更内容を自分で書き変えました。

github.com

対策方法

事前準備

まず事前準備として、「Render Features」に
「MToon Outline Render Feature」を追加します。

方法
→Setting
→PC_Renderer
→Add Renderer Feature


→MToon Outline Render Feature を選択

コード変更

下記の通りに2つのファイル内容変更を行います。

github.com

MToonOutlineRenderFeature の変更

ファイルの場所
Assets/VRM10/MToon10/Runtime/MToonOutlineRenderFeature.cs

全文はこちら

#if MTOON_URP
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

namespace VRMShaders.VRM10.MToon10.Runtime
{
    public sealed class MToonOutlineRenderFeature : ScriptableRendererFeature
    {
#if UNITY_6000_0_OR_NEWER
        private RenderObjectsPass _opaquePass;
        private RenderObjectsPass _transparentPass;
#else
        private MToonOutlineRenderPass _opaquePass;
        private MToonOutlineRenderPass _transparentPass;
#endif

        public override void Create()
        {
#if UNITY_6000_0_OR_NEWER
            var profilerTagName = nameof(MToonOutlineRenderFeature);
            var shaderTags = new[] {"MToonOutline"};
            var layerMask = -1;
            var cameraSettings = new RenderObjects.CustomCameraSettings();
            _opaquePass = new RenderObjectsPass(profilerTagName, RenderPassEvent.AfterRenderingOpaques, shaderTags, RenderQueueType.Opaque, layerMask, cameraSettings);
            _transparentPass = new RenderObjectsPass(profilerTagName, RenderPassEvent.BeforeRenderingTransparents, shaderTags, RenderQueueType.Transparent, layerMask, cameraSettings);
#else
            _opaquePass = new MToonOutlineRenderPass(RenderPassEvent.AfterRenderingOpaques, RenderQueueRange.opaque);
            _transparentPass = new MToonOutlineRenderPass(RenderPassEvent.BeforeRenderingTransparents, RenderQueueRange.transparent);
#endif
        }

        public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
        {
            renderer.EnqueuePass(_opaquePass);
            renderer.EnqueuePass(_transparentPass);
        }
    }
}
#endif

MToonOutlineRenderPass の変更

ファイルの場所
Assets/VRM10/MToon10/Runtime/MToonOutlineRenderPass.cs

1行目を変更します。

変更前

#if MTOON_URP

変更後

#if MTOON_URP && !UNITY_6000_0_OR_NEWER

以上の変更でアウトラインが表示されるようになりました。

参考

qiita.com