タグ

ブックマーク / zenn.dev/ruccho (13)

  • 【C#】event を IDisposable で購読する

    C#のeventをIDisposableスタイルで購読できるようにするライブラリを作りました。.NET/Unity対応です。 using System; using Disposify; var c = new C(); using (c.Disposify().SomeEvent(v => ++v)) // 購読してIDisposableを返す { c.Invoke(100); } // Dispose()で購読解除 public class C { public event Func<int, int>? SomeEvent; public int Invoke(int a) => SomeEvent.Invoke(a); }

    【C#】event を IDisposable で購読する
  • Unity/.NETでWebAssembly式スクリプトエンジンを作る

    Unityで動くWebAssemblyランタイムを作ると、スクリプトエンジン(会話とか用)として使いやすいんじゃないかというアイデア。今回のスコープではないけど、UGC用途もわりとアリかも。 先行実装 dotnet-webassemblyという、C#で書かれたWebAssemblyランタイムがあったので見てみたけど、wasm -> IL -> JITという感じだった。速度出そうだしなかなか楽しそうなアプローチだ 今回は後述の通り、AOTセーフで行くのでこれはパス インタプリタつき。よさそうだけど更新されてない wasmにコンパイルできるいろんな言語が使える https://github.com/appcypher/awesome-wasm-langs わりとみんなRustwasm書いてるけど、インスタントなスクリプト向きではないかも emscriptenとかbinaryenとかもあるので

    Unity/.NETでWebAssembly式スクリプトエンジンを作る
  • PBDの曲げ拘束を実装する (2D)

    PBD (Position Based Dynamics) は、物理演算を行う際のアルゴリズムのひとつです。布やヒモ、髪などの変形のある物体の挙動のシミュレーションを行うのによく使われています。 PBDの基と距離拘束 PBDでヒモをつくる際、ヒモを一連の質点のあつまりとして表現し、質点間の距離が一定になるような拘束条件(距離拘束, distance constraint)を与えます。 処理の流れとしては、以下のような感じです。 各質点に外力と速度に基づく位置更新を行う 各質点間の距離が一定になるよう、各質点の位置を更新する 更新された位置から新しい速度を逆算する 以上を1ステップとして繰り返す PBDの基的な実装や距離拘束については詳しい記事がすでにたくさんあるので、この記事では省略します。 元の論文はこちらです。2006年の論文なんですね……! 曲げ拘束 今日の題はこっち。 特定の

    PBDの曲げ拘束を実装する (2D)
  • ローカルUPMパッケージをunitypackage化する

    unitypackageはフォーマットとしては Packages フォルダへのインストールに対応していますが、標準のExport Package...メニューではPackages下に作成したローカルなパッケージのファイルをエクスポートすることができません。 実は、Asset Store Publishing Toolsが実験的にこの機能を提供しています。 今回紹介する手順の中ではUnity Publisher Portalにパッケージの登録(おそらくダミーでもOK)が必要です。自分はまさにAsset Storeに登録するunitypackageでPackagesを使いたかったので好都合でした。 Asset Store Publishing Toolsをインストールしたら、Project Settings > Other Settings > Scripting Define Symbols

    ローカルUPMパッケージをunitypackage化する
  • 【Unity】Source Generator の使いみち

    これはUnity Advent Calendar 2023の10日目の記事です。 Unity 2021.2からC# Source Generatorが使えるようになってしばらく経ちました。 いくつかのプロジェクトでSource Generatorをちゃんと導入してみて、どういう場面でSource Generatorが有用なのかということがわかってきたので、実例を交えて紹介してみたいと思います。 紹介するのは、大きく分けて3つの場面です。 型のついてないものに型をつける 高速で使いやすいメタプログラミング ボイラープレートの排除 ① 型のついてないものに型をつける Unityでは基的に静的だけども、文字列を使ってアクセスしないといけないものがよくあります。 エディタ拡張で指定するSerializedPropertyの名前 シェーダープロパティ名 アニメーションパラメータ名 タグ・レイヤー名

    【Unity】Source Generator の使いみち
  • 【Unity】FontEngineで軽量テキスト描画

    これはUnity Advent Calendar 2023 (2) の8日目の記事です。 UnityEngine.TextCore.LowLevel.FontEngineは、TextMesh ProやUI Toolkitがバックエンドとして使用している文字描画エンジンです。 その機能の多くはinternalでユーザーに公開されておらず、使える機能もかなり低レベルですが、そのかわり高速に動作します。基的な文字描画機能のみを必要としていて、TextMesh Proだとオーバースペックである場合は、直接FontEngineを使用してみるのもありなんじゃないかと思います。 ……とは言いつつ、そんな場面はかなり限定的なので、基的にはネタ記事です。 基的な使い方 ① フォントをロードする FontEngine.LoadFontFace()を使ってFontを読み込みます。 一度にロード状態にできる

    【Unity】FontEngineで軽量テキスト描画
  • 【C#】固定長配列をリフレクションで操作する

    固定長配列自体がかなりマイナーな言語機能ですが、今回はさらにそれをリフレクション経由で操作するという記事です。 固定長配列の内部 まず、普通の固定長配列の使い方は次のような感じです。 var s = new S(); unsafe { s._buffer[0] = 255; } public struct S { public unsafe fixed byte _buffer[12]; } public struct S { [StructLayout(LayoutKind.Sequential, Size = 12)] [CompilerGenerated] [UnsafeValueType] public struct <_buffer>e__FixedBuffer { public byte FixedElementField; } [FixedBuffer(typeof(byte

    【C#】固定長配列をリフレクションで操作する
    s_ryuuki
    s_ryuuki 2023/11/13
  • 【Unity】実践!Compute Shaderを最適化してみよう

    Compute Shader GPUで汎用的な並列計算をさせたい際に使えるのがCompute Shaderです。通常の頂点シェーダーやフラグメントシェーダーとは異なり、Compute ShaderはGPUにおけるレンダリングパイプラインから独立しているため、より柔軟でオーバーヘッドの少ない処理を行うことができます。 Compute Shaderを使うからにはやはり大規模な並列計算を高速に行いたい、という場合が多いと思います。しかし、ハードウェアの性能をフルに活用するためには、ハードウェアの特性を理解してプログラミングを行う必要があります。 今回はUnity上で画面をぼかすポストエフェクトを例にとって、ステップバイステップで様々な最適化テクニックを試しながらGPUへの理解を深めていこうと思います。 最初の実装 こちらの記事にあるガウシアンブラーの実装(フラグメントシェーダー)をお借りし、Co

    【Unity】実践!Compute Shaderを最適化してみよう
  • 【Unity】Source Generatorでスクリプト以外のファイルにアクセスする

    public void Execute(GeneratorExecutionContext roslynContext) { foreach (var file in roslynContext.AdditionalFiles) { Console.WriteLine(file.Path); } } ただこの方法では、AdditionalFilesに指定したファイルが更新された際にコンパイルが実行されない問題があります。そこはAssetModificationProcessorなどを用いてファイルの更新にフックしてコンパイルを実行する枠組みを整える必要があります。 またこの方法では、パスに空白を含むファイルを指定することができません。これはUnity特有の不具合で、来C#コンパイラ的にはファイルパスを二重引用符で囲むとちゃんとパースしてくれるはずなんですが…… バグレポートも出したのです

    【Unity】Source Generatorでスクリプト以外のファイルにアクセスする
  • C#:構造体におけるthisのこと

    using System; var hoge = new Hoge(); Console.WriteLine(hoge.value); // 0 hoge.IncreaseValue(); Console.WriteLine(hoge.value); // 1 struct Hoge { public int value; public void IncreaseValue() { this.value++; } } これはクラスと同様の挙動なので一見違和感がありませんが、構造体が値型であることを考えるとちょっと混乱する挙動です。例えば構造体を引数として渡す場合、データはコピーされるため、呼び出し側のデータは変更されません。 using System; var hoge = new Hoge(); Console.WriteLine(hoge.value); // 0 Hoge.Incre

    C#:構造体におけるthisのこと
    s_ryuuki
    s_ryuuki 2023/04/02
  • 【Unity】Input Systemでガイド用のボタンアイコンを出す

    Unityの (New) Input Systemでは、入力を抽象化して、マウスやキーボード、ゲームパッドなど様々なデバイスからの入力を統一的に扱うことができます。 今回は、Input Systemを使用しているプロジェクトでこういうガイド表示を出すやつをやります。Input Systemの基的な使い方は省略して進めます。 方針 指定したInputActionに対応する適切なアイコンを選択し表示する アイコン表示にはTextMesh ProのSprite機能を使う Scheme (マウス/キーボード操作、ゲームパッド操作)で表示を切り替える 使用しているゲームパッドの種類(DUALSHOCK4, XInput, Switchプロコンなど)で表示を切り替える 登場人物 Input Systemで使用される概念等のおさらいです。 InputActionAsset Input Systemで使

    【Unity】Input Systemでガイド用のボタンアイコンを出す
  • UnityにおけるShift_JISのややこしすぎる事情たち

    UnityでShift_JISを扱おうとして直面した様々な問題について書いていきます。 基 C#でShift_JISを扱うためには、基的にSystem.Text.Encoding.GetEncoding("Shift_JIS")を使用します。 ①ビルド後にエラーを吐く問題 エディタでは問題なく動作しますが、ビルドするとGetEncoding("Shift_JIS")で実行時エラーを吐きます。 NotSupportedException: Encoding 932 data could not be found. Make sure you have correct international codeset assembly installed and enabled. どうやらUnityではビルド後にShift_JISエンコードに必要なアセンブリが含まれないらしく、これらを手動で追加

    UnityにおけるShift_JISのややこしすぎる事情たち
  • Unity URPでGrabPassっぽいことをやる (2D対応版)

    URPにはGrabPassがない Builtin RPではシェーダー内でGrabPass {}というパスを記述することで、直前の画面の内容をテクスチャとして取得できる機能がありました。これは歪みや複雑なブレンドを表現することができるため非常に便利で、私もエフェクトづくりの際に多用していました。 このGrabPassですが、URPやHDRPでは使用することができません。今回はURPでGrabPassっぽいことをやる方法をいろいろとまとめました。わかったこととしては以下の通りです。 そもそもSRP上でのGrabPassの完全な再現は難しい 3D (Opaque) ではURPの標準機能である程度代替可能 2D (Transparent) では: 2D RendererではCamera Sorting Layer Textureで代替できるケースもある それ以外のケースやUniversal Ren

    Unity URPでGrabPassっぽいことをやる (2D対応版)
  • 1