LawrenceTurner のブログ

ゲームとかAIとかVRとか 文章を書くのって難しいね

Xreal SDKでXREALVirtualControllerを使うとgameプレビューが真っ黒になる問題

XERAL XR Plugin 3.0.0-pre.4
XR Interaction Toolkit 3.0.8で発生
XREALVirtualControllerをシーンに追加した場合(追加しなくても発生するかも)

本来は前にUIが表示されるはずだが表示されない

XREALVirtualControllerのURPUICameraがOverlayになっていない
このXREALVirtualControllerはシーンに追加したものではなく
Project Settings > XR Plug-in Management > XREAL > Virtual Controllerのものが使われている

解決法

URPUICameraのRender TypeをOverlayにする
元のプレハブはPackages内にあり編集できないので、一度シーンに追加してURPUICameraのCameraのRender TypeをOverlayにした後、ヒエラルキーからAssetsに追加してプレハブバリアント化させる(左面が縞模様になっていれば成功)

これをドラッグアンドドロップでProject Settings > XR Plug-in Management > XREAL > Virtual Controllerに入れる

6000.2.7f2だと起きない気がする
なんでだろ

MetaQuest3のパススルーAPIの最小構成を作成する

Quest3でカメラを弄れるようになりました いくつかアプリを作って遊んでいますが毎回セットアップが地味に面倒なので最小構成を作る際の備忘録です

1.プロジェクト作成

Unity Hubからv2022.3.52f1でプロジェクトを作成

2.パッケージを追加

  • Meta MR Utility kit
    • Meta XR Core SDK(Utility kitで自動で入る)
  • Oculus XR Plugin
    • バージョン指定で入れる必要あり(2025.4.6時点)パッケージマネージャの左上の+から名前でパッケージを加える
com.unity.xr.oculus
4.5.0

3.諸々設定

Project settingsを開く
Meta XRタブのAndroidチェックリストをすべてfixする(com.unity.xr.oculusがどうみたいなやつは直す必要ない)

Build Settingsを開く
Androidにターゲットを切り替える
一回ビルドできるか確認してもよい

4.開発

Main Camera削除
Building BlocksからCamera rigを追加、Passthroughを追加 --

Assets内にLibrariesフォルダを作成してhttps://github.com/oculus-samples/Unity-PassthroughCameraApiSamples/tree/main/Assets/PassthroughCameraApiSamples/PassthroughCamera/Scripts フォルダのコードを入れるコピーして入れる(MITライセンス)
githubに上げる予定があるならMITライセンスが含まれたものがあることを明記する

This project includes third-party code:

Oculus PassthroughCameraApiSamplesCode
   - License: MIT License
   - Source: https://github.com/oculus-samples/Unity-PassthroughCameraApiSamples/tree/main/Assets/PassthroughCameraApiSamples/PassthroughCamera/Scripts

--

空のオブジェクト→WebCamTextureManagerPrefabを作成
WebCamTextureManagerとPassthroughCameraPermissionsをアタッチし、WebCamTextureManagerのCamera Permissionsには自オブジェクトを入れた後、プレハブ化する
その後シーンに追加 --

新規スクリプトファイルを作成

using System.Collections.Generic;
using Meta.XR.Samples;
using UnityEngine;
using UnityEngine.Events;
using PassthroughCameraSamples;

public class MyScript : MonoBehaviour
{
    [SerializeField] private WebCamTextureManager m_webCamTextureManager;
    [SerializeField] private float m_refreshTime = 0.1f;
    [SerializeField] private GameObject m_cubePrefab;
    private float m_refreshCurrentTime = 0.0f;

    private void Update()
    {
        var webCamTexture = m_webCamTextureManager.WebCamTexture;
        if (webCamTexture != null)
        {
            if (!IsWaiting())
            {
                // WebCamTextureの状態を確認&refreshTimeを更新
                CheckAndUpdateRefreshTime(webCamTexture);
                // キューブを生成してテクスチャを貼り付け
                SpawnCube(webCamTexture);
            }
        }
        else
        {
            Debug.LogWarning("WebCamTextureが有効ではありません");
        }
    }

    private void CheckAndUpdateRefreshTime(WebCamTexture webCamTexture)
    {
        if (!webCamTexture.isPlaying)
        {
            Debug.LogWarning("WebCamTextureが利用できない状態です");
        }
        m_refreshCurrentTime = m_refreshTime;
    }

    /*
    毎秒処理を行うと、パフォーマンスが低下するので一定時間毎に処理を行うように
    毎フレーム処理したい場合は、m_refreshTimeを0.0fに設定
    参考:https://github.com/oculus-samples/Unity-PassthroughCameraApiSamples
    */
    private bool IsWaiting()
    {
        m_refreshCurrentTime -= Time.deltaTime;
        return m_refreshCurrentTime > 0.0f;
    }

    private void SpawnCube(WebCamTexture webCamTexture)
    {
        if (m_cubePrefab == null)
        {
            Debug.LogWarning("cubeプレハブが設定されていません");
            return;
        }
        // 座標 (0, 1, 0) にキューブを生成
        GameObject cube = Instantiate(m_cubePrefab, new Vector3(0, 1, 0), Quaternion.identity);
        // キューブの Renderer に WebCamTexture を設定
        Renderer renderer = cube.GetComponent<Renderer>();
        if (renderer != null)
        {
            renderer.material.mainTexture = webCamTexture;
        }
        else
        {
            Debug.LogWarning("生成されたキューブにRendererコンポーネントが見つかりません");
        }
    }
}

適当なオブジェクトにアタッチして
WebCamTextureManagerには追加したプレハブを
refreshTimeには適当に0.1を
cubePrefabは新規作成したキューブのプレハブを割り当て
--

Assets/Plugins/Android/AndroidManifest.xml を編集
の下に下記を追加

<uses-permission android:name="horizonos.permission.HEADSET_CAMERA"/>
<uses-permission android:name="android.permission.CAMERA"/>

実機デバッグ

ビルドするとカメラ映像のテクスチャのブロックが飛びまわっている

動かない場合はログを見る
パッケージマネージャ-UnityレジストリからAndroid Logcatを入れる

githubに上げておく github.com

PICO Unity SDK導入時にビルドでpthreadVC2.dll重複エラーが出る

普通にビルド自体はできるけど警告が出ているので気になった

Multiple plugins with the same name 'pthreadvc2' (found at 'Packages/com.spoiledcat.git/sfw/win/x64/pthreadVC2.dll' and 'Packages/com.unity.xr.picoxr/Platform/Plugins/Windows/pthreadVC2.dll'). That means one or more plugins are set to be compatible with Editor. Only one plugin at the time can be used by Editor.

解決法
エラー通り重複が原因なので片方消す
¥プロジェクトのフォルダ\Packages\PICO Unity Integration SDK ***\Platform\Plugins\Windows 内にあるpthreadVC2.dllを削除
もう一方を削除してもよい

PICO Unity SDK導入時にビルドでpthreadVC2.dll重複エラーが出る

普通にビルド自体はできるけど警告が出ているので気になった

Multiple plugins with the same name 'pthreadvc2' (found at 'Packages/com.spoiledcat.git/sfw/win/x64/pthreadVC2.dll' and 'Packages/com.unity.xr.picoxr/Platform/Plugins/Windows/pthreadVC2.dll'). That means one or more plugins are set to be compatible with Editor. Only one plugin at the time can be used by Editor.

解決法
エラー通り重複が原因なので片方消す
¥プロジェクトのフォルダ\Packages\PICO Unity Integration SDK ***\Platform\Plugins\Windows 内にあるpthreadVC2.dllを削除
もう一方を削除してもよい

Stable Diffusionのimg2imgを使って推しの画像を生成してみる

はじめに

2022年8月24日にStable Diffusionがリリースされました。
Stable Diffusion は画像生成AIとして名を馳せる中、文章から画像を生成する部分に焦点を当てられる事が多いですが、
Stable Diffusion には"文章から画像を生成する"機能と"画像から画像を生成する機能"があります。
今回はStable Diffusionのimg2img(画像から画像を生成する機能)を使って推しの画像を生成してみました。

0.作成環境

Windows10
RTX3060(VRAM12GB)
VRAM12GBでは本家 StableDiffusion は動作しなかったため、フォークされた
github.com
を使用しました。少ないVRAMでも動くように最適化されたものです。

環境構築は丸々省きますが、グラボを積んでいないPCの方でもGoogle Collabの無料枠で動かせるようです。

1.元画像生成

皆さんはOИEちゃんを知っていますでしょうか
VOCALOIDのIAは(多少は)有名ですが、その妹です。
one-aria.com
かわいいですね

誰でもが知っている、という存在ではないので界隈の絵師様や創作者様などを糧に生きています。ありがたいことです。
それは置いておきまして、自分は絵が得意な方ではないのですが公式画像などを参考に書いていきます。

うーん、不安になってきました。大丈夫でしょうか?
後から感じたことですが、この画像をもう少し凝るべきでした。腕とか口とか。
512*512のキャンバスで作りました。

2.画像変換①

StableDiffusionに入れてみます。

python optimizedSD/optimized_img2img.py --prompt "cute girl, concept idea, pixiv, kawaii" --init-img (画像指定) --strength (変化度) --n_iter 2 --n_samples (サンプル数) --H 512 --W 512

(画像指定)は参照先です。今回はtestone/one1.png としました(stable-diffusion/testone/one1.pngといったファルダ構成になっています。)
(変化度)はそのまま変化度です。0~1の値で指定でき、値が小さければ小さいほど元絵の影響力が大きくなります。今回は0.5としました。
(サンプル数)は指定した値の数画像が出力されるようになります。
変換後、サンプル数の数だけ画像が出力されます。



思ったより上手く変換してくれて驚きです。
この後、変化度を変えたりして幾つか生成してみましたが、上記4枚目の画像が気に入ったのでそれを使っていきます

3.画像修正

既にかなりいい出来ですが、胸のあたりの謎の模様や左右の目の大きさなどを修正します。

もう一回画像変換にかけます。

4.画像変換②

あまり変化してほしくないので変化度は0.3程度にしてみました

python optimizedSD/optimized_img2img.py --prompt "cute girl, concept idea, pixiv, kawaii" --init-img testone/one2-fix.png --strength 0.3 --n_iter 2 --n_samples 10 --H 512 --W 512





どれも良い出来なのではないでしょうか
個人的には4枚目がお気に入りです。

5.サクッと2枚目

画風の変化を見たかったのでペンを変えて2枚目
自分の絵を描くのが一番時間がかかります。今度は胸下まで書いてみました。
サンプル画像が多いかなと思い学生服をイメージして書き、アルゴリズムにもschool uniformを追加しました。


python optimizedSD/optimized_img2img.py --prompt "a cute girl, school uniform, pixiv, kawaii" --init-img testone/2-one.png --strength 0.5 --n_iter 2 --n_samples 5 --H 512 --W 512


あまり良い画像が生成されなかったので変化度パラメーターを弄ったり出力数を増やしたりして選んだのがこれ


背景がおかしいのですが、黒を取り除くのが面倒そうだったので背景を黒く塗りました()
あとは口や髪を修正、突然生えたアホ毛はAI君の性癖を尊重して残しました。


学生服っぽさはなくなったのでuniformだけに変更するなどして2回目
あんまり良い画像が得られなかったので妥協してなんとなくこれを選びました。

目がうるっとしてて拗ねてるみたいだなって

6.最後に

Stable Diffusion のtext2imgでは思ったような2次元キャラクターを作成する事ができなかったのであまり期待をしていなかったのですが、img2imgは思ったより簡単に、まあまあなクオリティの画像を作ることができました。
クオリティや取り回しなどは語句指定や適切なパラメータ等で向上させていきたいですね。

近々Stable Diffusion のアニメ版が出るようなので、出たらアニメ画像生成を試してみようと思います。


画像生成AIに関して、特に絵の創作界隈ではアーティストの権利侵害への懸念が強くあるように感じています。
しかし一方、VOCALOIDを使ったボカロPのような新しい形のミュージシャンが出現したように、技術は新しい才能を開花させる力があると思っています。
技術自体を遠ざけてしまうのではなく、ルールやモラルを守り、世の中が良くなるように使っていきたいですね。

【PS4版荒野行動】感想とかトロフィーとか

PS4版 荒野行動をトロコンしたのでなんか書きます

f:id:LawrenceTurner:20201223234213j:plain
 

 

トロフィー

コンプ時間:10時間

時限トロフィー:無し

収集:無し

オントロ:全部、手伝ってくれるフレンドが必要

難易度はそんなに高くないですが、最適化されておらずストレスが凄いです。
クロスプレイ設定を切る(PS4のみ)にすると敵がほぼ全員BOTになります。

攻略


クロスプレイ設定を切って挑みましょう。
5人のモードでは一回もプレイヤーがいるのを見ませんでした。
全体を通して「手榴弾のベテラン」「乗り物の天敵」の2つを意識して進めるといいと思います。

荒野孤狼~荒野精鋭、平和主義者、

人はほとんどいないと思いますが、どうしても取れない場合は平日の午前3時ごろにやればいいと思います。

短機関銃のベテラン、小銃のベテラン、短機関銃のルーキー、小銃のルーキー、特殊な技術、ロードキラー

〇〇で〇〇人の敵を撃破系です。
後述する手榴弾キルに失敗したときのために後まわしでいいです。

榴弾のベテラン、手榴弾のルーキー

本作最難関トロフィーです。
そもそも投げにくいし思ったより転がります。
おすすめは胴に銃を2,3発当て、グレネードが爆破するタイミングで足元に投げる手法です。
榴弾の残り秒数が0.5秒の時に投げると良いです。

f:id:LawrenceTurner:20201223234256j:plain

一緒にマルチをやってくれる奇特なフレンドがいるなら簡単になります。
グレネード構え→そのままBOTに密着し自爆→救助
を行うことでカウントされます。

射撃の名人

BOT相手に遠くから体に当てると伏せたり立ち止まったりするのでそこをSRでズドン。

仲間大事、強靭な意志、助けに来たぞ、友よ

フレンドが必要です。
(どうしてもいなければ私にコンタクトを取ってくれれば手伝うよ!)

戦場衛生兵

ひたすら回復アイテムを集め、円ダメージを死なない程度に受けつつ回復しましょう。
ガス弾を使うのも可。

最強なる兵器、ハイリスク・ハイリターン、完璧な変装

AWMと迷彩服は救援物資の中に入っています。
救援物資を見かけたら積極的に漁りに行くことをお勧めします。私は最後のほうまで迷彩服が出なくて焦りました。
完全武装もこれで取れると思います。

f:id:LawrenceTurner:20201223234236j:plain

カーマニア、ヨットマニア

バイク、ホバークラフトも乗り物に含まれます。
ヨットマニアが若干取りづらいですが何回かやればとれると思います。

マスクは必要でしょうか?

当てる必要は無いので拾ったらその場で適当に投げてしまいましょう。

乗り物破壊者

乗り捨てた乗り物は破壊しておきましょう。

石器時代、拳で!

銃で適当に体力を減らしてから殴りかかるといいでしょう。

乗り物の天敵

2番目に厄介なトロフィーです。
ある程度車にダメージを与え、BOTのの真横に車を着けます。
その後車を撃って破壊し、キルします。
10キルでいいのが救いですね。

f:id:LawrenceTurner:20201223234316j:plain

感想

最適化されてなくてめちゃめちゃ重かったです。
コントローラーのデッドゾーンの設定がないので常に右を向こうとして大変でした。
奇特な友人と一緒に3日程度でトロコンしました。
楽しかったかといわれると微妙ですがブーストゲーとしてはいいんじゃないでしょうか。

 

【COD:MW R】感想とかトロフィーとか

Call of Duty: Modern Warfare Remasteredをトロコンしたのでなんか書きます

f:id:LawrenceTurner:20201223175006j:plain

 

 

トロフィー

コンプ時間:20時間

時限トロフィー:無し

収集:有り

オントロ:無し

マルチも時限トロも無く、収集要素も簡単なものですが、多少のFPSの腕と根気が求められます

攻略

難易度ベテランでクリアするトロフィーがあります。とりあえずベテランでクリアしましょう。

翼と短剣~戦争勝利、ストレートフラッシュ、ディープ&ハード~第4の英雄、ロードキル

ストーリークリア(ベテラン)の過程で取得できます。
あるいは普通にプレイしていれば取れます。

探し物上手・情報源

収集系トロフィーです。以下の動画を参考にしましょう。
www.youtube.com

伏せ!、犬なんか大嫌い

伏せ!はベテランの道中で取得することになると思います。
犬なんか大嫌いは襲われる瞬間にナイフを振る必要があります。

新記録達成、最高峰

最難関トロフィーかもしれません。
「新入り」の訓練で15.1秒以下をたたき出す必要があります。
楽をする方法はなく、練習あるのみです。
f:id:LawrenceTurner:20201223175044j:plain

最悪な番組

「タイムリミット」でテレビを全部壊すと取得できます。
チェックポイントかやらやり直すと取得できない場合があるようなのでその場合はリスタートしましょう。
以下の動画を参考にしましょう。
www.youtube.com

市民の味方

「脱出」の冒頭で絡まれている市民を助けると取得。
市民を一緒に撃ち殺すと取得できない模様。

ストレートフラッシュ

「空の脅威」のヘリの爆撃を使用すると獲得できます。
自然に取得できていると思います。

霧に紛れて

「擬装完了」で一度も敵にばれることなくクリアで獲得。
万一ばれてもその瞬間チェックポイントからやり直せば大丈夫です。

ファーストクラス

普通に取るとめっちゃ難しいです。
バグを使うことによって簡単に取得できます。(2019/12/30現在で可能)
最後に解説

追い打ち

足を打つと負傷します。
そこをナイフでサクッと
やみくもと一緒に取ってもいいかも

やみくも

難易度を一番下げ、自分で目の前にフラッシュバンを投げ、ナイフを振り回そう。

フォーカード

4人連続ヘッドショットです。
「ワンショット・ワンキル」の最後などが取得しやすいと思われます。

スリーカード

難易度を下げて突りましょう

タイムパラドックス

若干難しいです。
「ワンショットワンキル」で、ザカエフを狙撃するシーンの後ろで車に乗っている奴です。
マカロフ、ザカエフ共に倒す必要があるので風が落ち着いてから倒すのが無難です。
以下が参考動画です。
youtu.be

ウェポンマスター

すべての武器で倒す必要があります。
私は以下を参考にさせていただきました
youtu.be

ハエたたき、地上の鳥

「ハエたたき」でミニガンで5両、RPGで3両落とす必要があります。
納屋に向かう途中、RPGが拾えるのでそれで撃ち落とすのですが、これが難しい...
左から順にできるだけ近づいて撃ちましょう。撃ち漏らした場合、チェックポイントからの再開で直前からやり直すことが可能。

砂漠の嵐

「クルーの価値」の中盤でいきなり角から出てくる敵が持っています。
めっちゃ強いハンドガンです。
ウェポンマスターに必要。
トロフィー名は「デザート・イーグル」からでしょうか

マスターニンジャ、レトロシューター

「クルーの価値」で味方に任せてゆっくり進みましょう。

高い塔の男

協会に入ると、塔に上れます。
塔の上からRPGを連射できるので、2発当てればOK。

炎上

4両撃ち漏らさずに打つだけ。

人間vs機械

難易度を下げても若干むずかしいです。
教会内部においてあるジャベリンを拾い、ヘリに見つかった後、教会自体を盾に打てる瞬間を見つけましょう。

援軍阻止

どこでも取れますが、ベテラン「ワンショット・ワンキル」の観覧車前などで取得済みと思われます。

仕掛け人

「戦慄」等で意識すれば簡単に取得できると思われます。

ファーストクラス取得バグ

難易度ルーキーでエピローグを開始し、VIPのいる部屋に入った瞬間にセーブして終了します。
その後、難易度ベテランでエピローグを開始。ステージの読み込みが終わる前にアプリを強制終了させます。
再度起動し、「続きから」を選択するとエピローグ終盤から始まります。
敵を一人倒してクリアです。

感想

久しぶりにFPSでもやろうかと思いプレイしましたが若干ハードでした。
MWらしさのあるゲームでPS3時代を思い出しました。
f:id:LawrenceTurner:20201223175126j:plain