🖥️

VRChatアバターの動く壁紙の作り方

2024/05/19に公開

https://x.com/HyperShield_720/status/1791057677264777258

先日、こちらのポストを拝見しまして、私も作ってみたい!と思いましたので、
自分でも作ってみました。

https://x.com/Taipui/status/1791801414370591058

本家様のポストのリアクションを見ていると、作り方が知りたいと思っている方が何人かいるようでしたので、私なりの作り方をまとめてみようと思います。

  • アバターを表示する
  • 背景モデルを表示する
  • マウスカーソルに頭が追従する

ものを目標に作ります。

動く壁紙とは?

作り始める前に、まずは動く壁紙について軽く説明をしておこうと思います。

壁紙は、通常は一枚画像または複数画像の静止画だと思いますが、
動く壁紙はその名の通り、常時またはマウスカーソル、音楽等により動きがある壁紙になります。(ライブ壁紙とも呼ばれる)

動く壁紙にする方法やツールはいくつかあると思いますが、今回はWallpaperEngineを使います。

WallpaperEngineとは、Steamで販売されている、Windowsのデスクトップに動く壁紙を設定できるアプリです。

499円で購入できます。(2024/05/19時点)

今回は、WallpaperEngineで設定できる壁紙を作成します。

Unityをインストールする

WallpaperEngineで設定できる壁紙は、動画ファイルの他に、exeファイルも指定できます。

exeファイルの作り方もいろいろあるかと思いますが、
今回はUnityで壁紙を作成し、Unityからexeファイルを作成します。

Unityとは、ゲームエンジンの一つであり、ゲーム開発ソフトの側面が強いですが、ゲーム以外のアプリも作成できます。

まずはUnityをインストールします。

すでにインストールされている場合は、そちらを使うでも問題ありません。

Unityのバージョンはどれでも問題ありませんが、今回は最新(2024/05/19)である
「Unity 6 Preview (6000.0.2f1)」を使うことにします。

バージョン名の横の「Install」を押します。

Add modulesの画面では、「Windows Build Support (IL2CPP)」にチェックを付けておいてください。(exeファイルを作る際に必要です)

他の項目にはチェックは不要です。

インストールが終わったら、プロジェクトを作成しましょう。

左の「Projects」タブを押したあと、右上の「New project」を押します。

テンプレートを「Universal 3D」にして、「Create project」を押します。

VRChatではBuilt-In Render Pipelineが使われていますが、今回はURPで作ることにします。

これで、プロジェクトを作成できました。

アバターを導入する

各自お好きなアバターをプロジェクトに入れましょう。

今回は、カリンちゃんを導入します。

カリンちゃんをプロジェクトにインポートしました。

全身ピンクになってしまっています。

これは、VRChat用のアセットはBuilt-In Render Pipeline用のシェーダーを使っているのに対し、今回はURPのプロジェクトだからです。

なので、シェーダーをURP用のものに変更します。

URP用のトゥーンシェーダーを導入する

今回は、URP用のトゥーンシェーダーである、UnityURPToonLitShaderExampleを使います。

「Code」を押したあと、「Download ZIP」を押します。

zipの中身をプロジェクトにインポートします。

今回は、Assets/Shaders/UnityURPToonLitShaderExample以下に入れました。

カリンちゃんのマテリアルのシェーダーを、先ほどインポートしたシェーダーに変更します。

カリンちゃんのマテリアルを全選択し、シェーダーを「SimpleURPToonLitExample(With Outline)」に変更します。

ここからマテリアルのパラメータを好みに調整していくのですが、今回はこのままいきます。

MissingScriptを削除する

VRChat用のアバターは、VRChat用のスクリプトがアタッチされていることが多いです。

ですが、今回はVRCSDKは導入しておらず、Missingになっています。

このままではビルドができませんので、MissingScriptを削除します。

手動でやってもいいのですが、数が多く大変なので、こちらの記事のスクリプトを使用させていただきます。

注意点として、このスクリプトはUnityEditor上でのみ動くスクリプトであり、ビルドに含まれることを防ぐため、「Editor」フォルダー以下に配置しましょう。

これで、MissingScriptをすべて削除できました。

揺れものを設定する

髪やスカートなどが揺れるように設定していきます。

今回はMagica Cloth2を使用します。

導入および設定方法は、公式ドキュメントが充実しているので、割愛します。

髪、耳、スカート、しっぽに揺れもの設定を、腕、脚にコライダーを設定しました。

アイドルモーションを設定する

このままだとTポーズなので、自然な立ちモーションを設定します。

これも好みになりますが、今回はユニティちゃん3Dモデルデータのモーションを使用します。

インポートしたあと、アバターのアニメーターのControllerをUnityChanLocomotionsにするだけで、アイドルモーションが変わります。
※アバターによっては、これだけではうまくいかないかもしれません

視線追従機能を実装する

マウスカーソルの方向に顔が向く機能を実装します。

こちらも実装方法はいろいろあるかと思いますが、今回はFinalIKを使用します。

インポートしたら、アバターに「LookAtIK」コンポーネントをアタッチします。

そして、Headにアバターの頭の部分をアタッチします。

シーン上に、空のオブジェクトを作成します。(ここでは「LookAtTarget」という名前にしました)

これを、Targetのところに設定します。

これだけで、アバターがLookAtTargetの方を向くようになります。

※説明のため、LookAtTargetにSphereオブジェクトを入れています

あとは、この空オブジェクトの位置がマウスカーソルに位置になるようにします。

ここから、少しだけコードを書きます。

まず、スクリプトを作成します。

Projectビューを右クリックまたはCreateボタンから、MonoBehaviour Scriptを選択します。

名前は「MouseToWorldPositioner」にしました。

これをLookAtTargetにアタッチします。

コードエディターはなんでもよいですが、今回はVisual Studio Codeを使用します。

VSCodeを使う場合、Unity用の拡張機能を入れておくとよいでしょう。

開くと、このような画面になります。

※もしIt was not possible to find any installed .NET SDKs.というエラーが表示された場合は、.NET SDKをインストールしましょう。

以下のように変更します。

using UnityEngine;

public class MouseToWorldPositioner : MonoBehaviour
{
    void Update()
    {
        // マウスの位置を取得する.
        var screenPosition = Input.mousePosition;

        // マウスの位置は2次元なので、Z座標に値を入れておく.
        screenPosition.z = 1.0f;

        // スクリーン座標をワールド座標に変換する.
        var worldPosition = Camera.main.ScreenToWorldPoint(screenPosition);

        // 座標を適用する.
        transform.position = worldPosition;
    }
}

これだけで、LookAtTargetの位置がマウスカーソルの位置と同期します。

※カメラとアバターとの距離、screenPosition.zの値で、追従度合いが変わります

背景モデルを配置する

最後に、背景となるモデルを配置します。

好きなオブジェクトを置くことにより、自分好みの背景にできます。

今回は、Japanese Apartmentを使ってみます。

Built-In Render Pipeline用のアセットでシェーダーエラーになる場合は、
エラーになっているマテリアルを選択した状態で、Edit→Rendering→Materials→Convert Selected Built-in Materials to URPを選択すると、互換性のあるシェーダーに一括変更できます。

※基本的に、Universal Render Pipeline/Litに変更されます

背景モデルを配置し、アバターとカメラの位置と向きを調整します。

こんな感じにしてみました。

ビルドする

この「動く壁紙」を、exeファイルにします。

File→Build Profilesを選択します。

すると、このようなウィンドウが表示されます。

今回はSampleSceneが動いてほしいので、Scene Listの先頭がSampleSceneであることを確認します。

※もし別のシーンにしている場合は、Scene Listから、そのシーンが先頭に来るように編集しましょう

「Build」を押し、exeファイルを含むフォルダーの出力場所を指定します。

ビルドが終わると、指定したフォルダー内に、exeファイルを含むファイル群が出力されます。

壁紙に設定する

ここからはWallpaperEngine側の操作になります。

壁紙を変更する画面で、下部の「壁紙を開く」を押したあと、「新しい壁紙を作る(アニメーションと共有)」を押します。

すると、壁紙エディタが開きます。

ここで、「壁紙作成」を押します。

するとファイル選択ウィンドウが開くので、先ほどビルドしたexeファイルを選択します。

そのまま「OK」を押します。

プレビュー画面が開きますので、閉じます。

壁紙選択画面に、作成した壁紙が追加されます。

これを選択すると、作成した壁紙が適用されます!

おつかれさまでした!

おまけ: 軽量化と手直し

これで完成ではありますが、常時起動しておくアプリになるので、処理負荷には気を配る必要があります。
特に、CPUとメモリの使用率は、PCのパフォーマンスに影響が出てきます。

今回はVRChatと同じくUnityで作成したので、VRChatでの軽量化の手法が使えます。

また、手直しして再ビルドする際は、WallpaperEngine側では、一時的に壁紙を解除するか、別の壁紙にしておきましょう。
でないと、使用中のアプリを上書きできないというエラーが発生します。

また、再ビルドしてもWallpaperEngine側がキャッシュを持っているようで、うまく変更が反映されない場合があります。

その場合は、C:\Program Files (x86)\Steam\steamapps\common\wallpaper_engine\projects\myprojects以下のフォルダーを削除すると、キャッシュが削除され、反映されるようになります。

あとがき

以上が、私なりの、動く壁紙の作り方になります。

今回は、最新(2024/05/19)のUnityで、有料のアセットを使って、なるべく簡単に作る方法をまとめてみました。

気が向いたら、VRChat用のバージョンのUnityを使った方法だったり、有料アセットを使わない場合の作り方、より凝ったものを作る方法などを記事にするかもしれません。

ここまで読んでいただき、ありがとうございました。

Discussion