はこねのはこ

はこねさんの備忘録

UnityでSpriteModeがMultipleのTexture2DからAddressablesでSpriteをロードする

はじめに

タイトルで伝わるか正直わからないのですが、
やりたかったこととしては、下記のようなTexture2Dデータをロードして、Sprite名で使用できるようにしたかったです。

やり方

下記のようにします。

        public List<Sprite> IconSprites = new List<Sprite>();

        public async UniTask IconSpritesLoadAsync()
        {
            string iconPngPath = "Assets/Arts/AssetStore/Modern GDR - Free icons pack/00_Atlas/BrightIcons.png";
            AsyncOperationHandle<IList<Sprite>> iconPngHandle = Addressables.LoadAssetAsync<IList<Sprite>>(iconPngPath);
            var sprites = await iconPngHandle.Task;
            IconSprites = new List<Sprite>(sprites);
        }

参考

tsubakit1.hateblo.jp

使用したアセット

Classic RPG GUI | 2D GUI | Unity Asset Store

おわり

はじめは下記のようにロードして、Texture2からなんやかんやするのかと思ったのですが...
でも何か手法はあるような...

Addressables.LoadAssetAsync<Texture2D>(path);

BlueRetoroを作った話

はじめに

そこそこNINTENDO 64を遊んでいるのですが、画面から離れた位置からでもプレイしやすいようにコントローラを無線でつなぎたいと思いました。

そこ64でBluetoothコントローラが使えるようになる変換機、BlueRetroを組み立てました。

詳しくはこちら github.com

使用したもの

ESP32-DevKitC-32E

秋月で1600円くらい

akizukidenshi.com

コントローラコネクタ

ハードオフでジャンク100円でVRSユニットが売っていたのでこちらを使用しました。 VRSユニットとは、ピカチュウげんきでちゅうなどで使用されていた64とマイクをつなぐユニットです。

https://www.nintendo.co.jp/n01/n64/software/nus_p_npgj/sound/index.html

ESP32基盤を隠すカバーになるのでちょうどよかったです。

組み立て

VRS基盤
念のためテスターで確認しました。

ESP32-DevKitC-32E
VDD33| 3.3V
GND| GND
IO19| Data

https://akizukidenshi.com/goodsaffix/esp32_devkitc_v4-sch-20180607a.pdf

VRSユニットの中身を取り出して中に基盤を入れました。雑に絶縁テープで固定。

参考

note.com

Unity マルチシーンで別シーンにあるカメラをCanvasのRenderCameraに設定したい

はじめに

Sorting Layersの設定により、Canvasよりもパーティクルを画面前に出したかった。
そのためにCanvasのRenderModeをScreenSpace-CameraにしてRenderCameraにMainCameraを設定したかったが、
マルチシーン環境で、別シーンにあるMainCameraをInspector上で設定することはできないようだ。

やったこと

いろいろやり方はあるようだが、シーンが読み込まれた際に他のシーンのカメラを自動でアタッチするやり方をとった。

下記のスクリプトをMainCameraがないシーンのCanvasにアタッチした。

using UnityEngine;

namespace GameLogics
{
    public class DynamicCameraAssign : MonoBehaviour
    {
        private Canvas _canvas;

        private void Start()
        {
            _canvas = GetComponent<Canvas>();

            if (_canvas != null)
            {
                AssignCamera();
            }
        }

        private void AssignCamera()
        {
            Camera targetCamera = FindCamera();

            if (targetCamera != null)
            {
                Debug.Log("ScreenSpaceCameraに設定しました。");
                _canvas.renderMode = RenderMode.ScreenSpaceCamera;
                _canvas.worldCamera = targetCamera;
            }
        }

        private Camera FindCamera()
        {
            // 他のシーンにあるカメラを検索
            return FindObjectOfType<Camera>();
        }
    }
}

DirectX12の魔導書 Chapter8 (8.3シェーダーへの転送と表示に関してのメモ)

はじめに

8.3のあたりで数時間躓いた。 Chapter8のサンプルコードは正直参考にならないくらい差分があったので自分が動いた環境を残しておく。

この内容はDirectX12の魔導書 初版 を読みながら書いています。

8.3.3のビューの作成までは記載の通り。

追記

8.4.6テクスチャ用ディスクリプタレンジとルートパラメーターでディスクリプタレンジの現状がどうなっているのか記載があった。 これを見るとCBVが2つだけのよう。SRVはなかった。 つまり8.3あたりの記述は正しそう? どこでこの記述に変わったんだ...

追記2

Chapter8のサンプルコードと照らし合わせて、順番の整理とと不要になっているものの削除を行った。すると正しく表示されるように、余計なSRVが設定されていたようだ。 どこかに消す、置き換えるような記述があったのかな?見逃したのかな。

ゴール

8.3.7の描画ごとにマテリアルの切り替えまでの動作確認をする。

以下は追記前でのこと。余計なSRVが残っている場合のもの。

続きを読む

DirectX12の魔導書を読んだ。それと躓いたところ

はじめに

DirectX12の魔導書を進めています。
(育休のお供に始めたのですが育休終了までに終わる気しないです。そもそも育児が大変)

2024年にAmazonで購入したのですが、第1版(初版)が届き誤記されている文章に結構苦労しています。
(仕方がない。本屋で印刷日を確認して購入すればよかった。重かったのよ。)
タイポくらいなら気づけるのですが、そもそも記載漏れだと気付きにくいので大変...

ここに書いてある内容も誤記表を見れば書いてあるのでそちらを...。
www.shoeisha.co.jp

まだ写経中なのでまた何かあれば追記予定

躓いたところ

4.5はじめてのシェーダー

.hlslファイルを作成した後、テキスト上はエントリポイント名とシェーダーモデルの変更について記載があるが、
シェーダーの種類も合わせて変更する。(7.8で困ったのでここに記載しておく)

4.10.3 描画命令

ビューポートとシザー矩形の設定が抜けていた。

_cmdList->RSSetViewports(1, &viewport);
_cmdList->RSSetScissorRects(1, &scissorrect);

誤記表に記載があったが、そもそも説明抜けだったので気が付かなかった。
viewportとscissorrectの設定内容の説明はあったが、これらが反映されていないことに疑問を持てれば気づけたと思う。ちょっとくやしい。

いろいろためしてみよう

テキスト記載のコードでうまくいかない→誤記を確認→誤記があったのでので下で試した→白色のまま色が変わらなかった。

return float4((float2(0, 1) + pos.xy) * 0.5f, 1, 1)

hlslでのデバッグの方法がわからなかったので無理やり下記のコードで検証した。
このコードで三角形は緑に染まったのでpos.xの値は-1~1に収まっていないようだった。

float4 BasicPS(float4 pos : SV_Position) : SV_TARGET
{
    if (pos.x >= -1.0 && pos.x <= 1.0)
    {
        return float4(1, 0, 0, 1);
    }
    else
    {
        return float4(0, 1, 0, 1);
    }
}

おそらく1より大きい値が入るせいで白になっていたと思われる。
(環境によって変わる?)

サンプルコードを見てみると4章時点ではこのコードになってなさそう? https://github.com/boxerprogrammer/directx12_samples/blob/master/Chapter4/BasicPixelShader.hlsl

とりあえずposの値の範囲がわからないので雑に割っておくことにした。
(グラデーションが見れたのでいったん良しとする。)

float4 BasicPS(float4 pos : SV_Position) : SV_TARGET
{
    // 255で割ったらグラデーションになった。-1~1の値がきていないようだ
    return float4((float2(0, 1) + pos.xy) / 512, 1, 1);
}

5.3 シェーダーにuv情報を追加する

ピクセルシェーダ記載時の引数周りの命名が気になった。

float4 BasicPS(Output input)

サンプルコードを見てみるとそもそも頂点シェーダとピクセルシェーダのやり取りを行う構造体を書くヘッダーファイル周りの命名が全然違う。
誤記表には特に記載なし。
この本でこんな感じでサンプルコードは変わってることはよくある(気がする。)
名前だけで動きは変わらないので今のうちにサンプルコードに合わせておくことにする。

5.9.1 ルートシグネチャの指定

誤記があり、下記が正しいとのこと。

_cmdList->SetGraphicsRootSignature(rootSignature);

とはいえrootSignatureはまだ定義していないもの。(rootsignatureは作成済み)
サンプルコードを見るとrootsignatureが正しそう。 誤記表に記載されているものが誤記?

     _cmdList->SetGraphicsRootSignature(rootsignature);
        _cmdList->SetDescriptorHeaps(1, &texDescHeap);
        _cmdList->SetGraphicsRootDescriptorTable(0, texDescHeap->GetGPUDescriptorHandleForHeapStart());

(あとサンプルコードにルートシグネチャの指定が2か所記載されているのはどういう意図なんでしょう..)

5.12 ID3D12GraphicsCommandList::CopyTextureRefion()メソッドによる転送

読み飛ばすことにした。 (写経tX12の魔導書を進めています。
(育休のお供に始めたのですが育休終了までに終わる気しないです。そもそも育児が大変)

2024年にAmazonで購入したのですが、第1版(初版)が届き誤記されている文章に結構苦労しています。
(仕方がない。本屋で印刷日を確認して購入すればよかった。重かったのよ。)
タイポくらいなら気づけるのですが、そもそも記載漏れだと気付きにくいので大変...

ここに書いてある内容も誤記表を見れば書いてあるのでそちらを...。
www.shoeisha.co.jp

まだ写経中なのでまた何かあれば追記予定

躓いたところ

4.10.3 描画命令

ビューポートとシザー矩形の設定が抜けていた。

_cmdList->RSSetViewports(1, &viewport);
_cmdList->RSSetScissorRects(1, &scissorrect);

誤記表に記載があったが、そもそも説明抜けだったので気が付かなかった。
viewportとscissorrectの設定内容の説明はあったが、これらが反映されていないことに疑問を持てれば気づけたと思う。ちょっとくやしい。

いろいろためしてみよう

テキスト記載のコードでうまくいかない→誤記を確認→誤記があったのでので下で試した→白色のまま色が変わらなかった。

return float4((float2(0, 1) + pos.xy) * 0.5f, 1, 1)

hlslでのデバッグの方法がわからなかったので無理やり下記のコードで検証した。
このコードで三角形は緑に染まったのでpos.xの値は-1~1に収まっていないようだった。

float4 BasicPS(float4 pos : SV_Position) : SV_TARGET
{
    if (pos.x >= -1.0 && pos.x <= 1.0)
    {
        return float4(1, 0, 0, 1);
    }
    else
    {
        return float4(0, 1, 0, 1);
    }
}

おそらく1より大きい値が入るせいで白になっていたと思われる。
(環境によって変わる?)

サンプルコードを見てみると4章時点ではこのコードになってなさそう? https://github.com/boxerprogrammer/directx12_samples/blob/master/Chapter4/BasicPixelShader.hlsl

とりあえずposの値の範囲がわからないので雑に割っておくことにした。
(グラデーションが見れたのでいったん良しとする。)

float4 BasicPS(float4 pos : SV_Position) : SV_TARGET
{
    // 255で割ったらグラデーションになった。-1~1の値がきていないようだ
    return float4((float2(0, 1) + pos.xy) / 512, 1, 1);
}

5.3 シェーダーにuv情報を追加する

ピクセルシェーダ記載時の引数周りの命名が気になった。

float4 BasicPS(Output input)

サンプルコードを見てみるとそもそも頂点シェーダとピクセルシェーダのやり取りを行う構造体を書くヘッダーファイル周りの命名が全然違う。
誤記表には特に記載なし。
この本でこんな感じでサンプルコードは変わってることはよくある(気がする。)
名前だけで動きは変わらないので今のうちにサンプルコードに合わせておくことにする。

5.9.1 ルートシグネチャの指定

誤記があり、下記が正しいとのこと。

_cmdList->SetGraphicsRootSignature(rootSignature);

とはいえrootSignatureはまだ定義していないもの。(rootsignatureは作成済み)
サンプルコードを見るとrootsignatureが正しそう。 誤記表に記載されているものが誤記?

     _cmdList->SetGraphicsRootSignature(rootsignature);
        _cmdList->SetDescriptorHeaps(1, &texDescHeap);
        _cmdList->SetGraphicsRootDescriptorTable(0, texDescHeap->GetGPUDescriptorHandleForHeapStart());

(あとサンプルコードにルートシグネチャの指定が2か所記載されているのはどういう意図なんでしょう..)

5.12 ID3D12GraphicsCommandList::CopyTextureRefion()メソッドによる転送

読み飛ばすことにした。 (テキストにもテクスチャが表示に問題がなければ良しとあった。) 写経しようとしたが、しばらく泥沼にはまったので断念。
サンプルコードここみたい?(未確認) https://github.com/boxerprogrammer/directx12_samples/tree/master/Chapter5_CopyTexture

5.13 d3dx12.h(CD3DX~)の導入

#include<d3dx12.h>とするだけでd3dx12.hが使えますねとあったが自分の環境ではうまくいかず.. DirectXTex.hのパス、hoge/microsoft\DirectXTex\DirectXTex\DirectXTex.hとは異なりhoge/microsoft\DirectXTex\Common\d3dx12.hにあった。
(本当はプロジェクト設定の追加インクルードからうまいこと追加したかったが、うまくいかなかったため)妥協して以下のようにした。

#include <DirectXTex/../../Common/d3dx12.h>

ついでにバリア設定をd3dx12に置き換えるやつ、これも誤記がありそう。
(一時オブジェクトのアドレスを渡すことがエラー扱い?)
さらに言うとバリア設定をPresetに変更するやつも併せてd3dx12に置き換えた。

6.2.4 ルートシグネチャの変更

コメントで定数用レジスタは0番とあって、誤記かと思ったが違うようだ。
レジスターの種類が違う場合、レジスタは別の場所にあり、明確に分けられているため、レジスタ番号は重複しても心配ない。

7.8 法線データの表示

頂点シェーダに法線ベクトルを追加したところ、以下のようなエラーが出た。

invalid vs_2_0 output semantic 'NORMAL'

シェーダーモデルは5.0になっていたので、違う原因かと思ったが、
シェーダーの種類のところが空白になっていたのが原因のようだった。
下記のように頂点シェーダと設定して解決。 (今まで記載せずに動いていたのは何だったのか...未記入だと適当に動いてくれていたのか...正しく動いていなかったのか...)

8.3.4 マテリアル用ルートパラメータへの設定追加

レンジの設定でdescTBLRange[1]に対して設定しているが、
すでに0,1にはテクスチャと定数で設定されている。

→いろいろやった hakonebox.hatenablog.com

8.9.6 トゥーンテクスチャ用のビューの作成

トゥーン対応を行った後、"さらにレンジの数を増やして'とテキストにある。 テキスト中では

descTblRange[2].NumDescriptors = 4;

auto cbvsrvIncSize = _dev->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV) * 5

のみ書かれているが、このままだとエラーになる。

マテリアルディスクリプタヒープでの設定の値も修正する必要があった。

materialDescHeapDesc.NumDescriptors = materialNum * 5

その他細かいところ

誤記表の間違い

vector textureResources(materialNum);
for (int i = 0; i < pmdMaterials.size(); ++i)

とあるが、

vector<ID3D12Resource*> textureResources(materialNum);

と書く必要がある。誤記表は更新してほしい。
自分が気づかないだけでたくさんあると思う。

自分がやった誤字(戒め)

数値の入力ミス

5章のノイズテクスチャの段階で下記のように表示されていた。
画面サイズやRGBAの定義が間違えているのかと思い、長いこと探したが、ただの誤入力だった... ↓のインデックス3のuv座標が{1.0f,0.0f}にできていなかっただけ。

    Vertex vertices[] =
    {
        {{-0.4f,-0.7f,0.0f},{0.0f,1.0f} },//左下  インデックス:0
        {{-0.4f,0.7f,0.0f},{0.0f,0.0f}} ,//左上   インデックス:1
        {{0.4f,-0.7f,0.0f},{1.0f,1.0f}} ,//右下   インデックス:2
        {{0.4f,0.7f,0.0f},{1.0f,1.0f}} ,//右上    インデックス:3
    };

テクスチャデータの作成前のuv値を色として表示するときの時点で間違ってた。 (テキスト白黒だから、間違っていたことに気づきにくかったと思う。)

ログ

7章終わり

24/11/12 やっとpmdモデルを表示するところまで終えた。

要望

UniRxのSubjectのインスタンス生成時にタイポして通知が飛ばなかった話

はじめに

もうこんなことはないと思うが念のため。
エラー文が出てないなかったのでタイポをしているとは思わなかった。 特定まで時間がかかったのは単純にここを見ていなかったから。

反省

下記のように記述していた。

public class HogeManager : IHoge
{
    public IObservable<Hoge> HogeObservable => _hogeSubject;
    private Subject<Hoge> _hogeSubject => new Subject<Hoge>();
}

public interface IHoge
{
    IObservable<Hoge> HogeObservable { get; }
}

ここだけ見れば気づけると思うが
private Subject _hogeSubject => new Subject();

正しくは↓

public class HogeManager : IHoge
{
    public IObservable<Hoge> HogeObservable => _hogeSubject;
    private Subject<Hoge> _hogeSubject = new Subject<Hoge>();
}

The type or namespace name `PostProcessing' does not exist in the namespaceが出た時の話

初めに

新PCを購入し、Unityプロジェクトを移行していたとき、このエラーが出て困ったので備忘録としてメモします。

The type or namespace name `PostProcessing' does not exist in the namespace 'UnityEngine.Rendering' (are you missing an assembly reference?)

f:id:hakonebox:20220116203514p:plain

解決法

PostProcessing v 2.3.0を使用する f:id:hakonebox:20220116203716p:plain

私の場合は移行前の環境ではPostProcessing v2を使用していて、
移行先の新PC環境ではPostProcessing v3を使用しようとしていただからと思われます。

背景

  • Unity 2020.3.16f1

Package ManagerからPost Processing v 3.1.1を使用していたのですが、上記のエラーが出て困っていました。

原因を探していると、CinemachinePostProcessing.csの中に下記の記述がありました。

// NOTE: If you are getting errors of the sort that say something like:
//     "The type or namespace name `PostProcessing' does not exist in the namespace"
// it is because the PostProcessing v2 module has been removed from your project.
//
// To make the errors go away, you can either:
//   1 - Download PostProcessing V2 and install it into your project
// or
//   2 - Go into PlayerSettings/OtherSettings and remove the Scripting Define for UNITY_POST_PROCESSING_STACK_V2

私の環境では1のv2のインストールで無事解決しました。

移行前の環境のバージョンを確認せず、PostProcessingの最新を入れていたので
表題のエラーが出て焦りました。