土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

Unity

#unity UIから「Save As...」ボタンを外したらUnityエディタがクラッシュするようになった話(TextMeshPro Deep Dive #4)

年の瀬です。皆様いかがお過ごしでしょうか。2024年も大変お世話になりました。来年もよろしくお願いします。 土屋はこの年末の忙しい最中、「Unityエディタ拡張の自作ツールで「Save As...」ボタンを削除したら特定タイミングでUnityエディタがクラッシ…

#unity TextMeshPro内の低レイヤ処理クラスFontEngineの隠しメソッドにリフレクションでアクセスする(TextMeshPro Deep Dive #3)

この記事はUnityアドベントカレンダー2024(シリーズ3)12日目の記事です。空いてたので埋めさせていただきました。 qiita.com 今回の記事はこちらのエントリの内容をベースにした物になります。 zenn.dev TextMeshProの内部処理 TextMeshPro(以下TMP)…

#unity Unity6+VisualStudio2022でNuGetパッケージをインストールする入門

この記事はUnityアドベントカレンダー8日目の記事です。 qiita.com NuGetの使い方を学ぼう Visual Studioで開発している方は誰でもお世話になっているであろうNuGetなんですが、UnityでNuGetパッケージを使用する場合、通常とは異なる導入手順が必要です。 …

#unity ツカサ式スタック型ステートマシンT2sFSM(その3)

以前紹介したステートマシンの少しだけ改良したので、その紹介記事になります。以前の記事はこちら。 someiyoshino.info someiyoshino.info 前口上 ご存知の方も多いでしょうが、土屋はライフワーク的にテキスト描画(というかADV)の汎用エンジンを作っ…

#unity C#シリアライザMemoryPackを使いたい(1)パッケージインストールの手順

MemoryPackは、Neueccさんが開発し、CySharpからリリースされている、シリアライザーと呼ばれる機能を提供するOSSライブラリです。 github.com シリアライザーは、データを永続化(シリアライズ)する為の物で、インスタンスが持つデータをバイナリデータ…

#Unity 何故PlayModeに入った時にOnValidate()が2回呼ばれるのか問題(その2:完結編)

前回の記事の続きです。 someiyoshino.info OnValidate()タイミングにRectTransform.setDelta()を更新するコードを実装した所、Edit ModeからPlay Modeに移行した時(以下これを「Enter Play Mode時」と呼びます)にNull参照例外が発生してしまうという話で…

#Unity 何故PlayModeに入った時にOnValidate()が2回呼ばれるのか問題(その1)

現在Canvas用のコンポーネントを作っていて、その最中、Unity初期化時のMonoBehaviour.OnValidate()の挙動に悩まされまして、折角なのでちゃんと調べて記事にしました。 今回は前半戦で、実は表題にした「何故OnValidate()は2回呼ばれるのか」に到達してい…

#unity gitから初めて取得したUnityプロジェクトを実行する手順

こういうのって調べればどこかに書いてあるんだろうけどもすぐ見つからなかったのでメモとして。 .gitignoreファイルの話 Unityのプロジェクトをgit(GitHub)のリモートリポジトリで管理する時、登録するべきでないファイルが色々あります。例えばLibraryフォ…

#unity Microsoft.Unity.Analyzersを制御する

おかげさまでシェーダー本5が無事リリースできました。BOOTHと技術書典オンラインマーケットで頒布中なので、よろしくご検討下さい。 s-games.booth.pmtechbookfest.org シェーダー本5の紙販は、9月に開催される技術書典13に合わせて頒布する予定です。…

Unityシェーダープログラミングの教科書5 SRP[2]UniversalRP URP拡張カメラ/HDR/ポストプロセス編

告知です。新刊同人誌「Unityシェーダープログラミングの教科書5 SRP[2]UniversalRP URP拡張カメラ/HDR/ポストプロセス編」のPDF版を、2022年7月4日にBOOTHさんに登録しました。どうぞよろしくお願いします。 s-games.booth.pm 物理…

#unity VContainerを使ってDI(Dependency Injection)コンテナについて最低限理解する

「DIコンテナ」という言葉を聞いたことがあっても、それがなにをする物で、どういう風に使うのかがピンと来ない人は多いかと思います(土屋もそうでした)。この記事では、Unity用DIコンテナフレームワーク「VContainer」を最小限のサンプルコードで動作さ…

#Unity SRP(LWRP=UniversalRP)のシングルPassフォワードレンダリングとはなにか

シェーダー本4に向けてSRP(LWRP=UniversalRP)の勉強を始めています(ちなみに来春予定です。直近の技術書典には間に合わないですごめんなさい)。 今回はSRP(LWRP=UniversalRP)で採用されたシングルPassフォワードレンダリングについて SRPとはなにか…

ダミーボタンUI素材ジェネレーターを作りたかった

ゲームに限らないんですが、メニュー画面を実装する際、ひとまず仮で使うボタン画像の素材が欲しいという時がよくあります(……ありますよね?)。プロトタイプ制作時とか、まだレイアウトの仕様が決まっていないので各ボタンのサイズが決まっていないのだけ…

#unity (C#)でFlatBuffersを使い倒す(3) スキーマファイルからコードジェネレートする

FlatBuffersを使う流れ FlatBuffersを使用するには、以下の3つの手順を経る事になります。 スキーマファイルを作り、flatc.exeでコードジェネレートする データをバイナリ配列にシリアライズしてファイルに保存する。 ファイルからバイナリ配列を読み込みデ…

#unity (C#)でFlatBuffersを使い倒す(2) FlatBuffersの導入手順

前回、ゲームで用いる数値データを管理する手段として一般的な、バイナリデータを構造体配列にマッピングする手法について解説しました。今回からは、FlatBuffersというフレームワークを使って、Unity(C#)上でシリアライズ/デシリアライズ処理を実装してい…

#unity (C#)でFlatBuffersを使い倒す(1) ゲーム開発時に数値系データを外部バイナリファイルで管理する方法

前回の記事でJSONデータを構造体配列に読み込むことができたので、次はこれをバイナリデータとしてシリアライズ/デシアライズする方法を検証します。どちらかと言えばここからが本番です。 しばらくはFlatBuffersというライブラリの挙動を検証します。実際…

#Unity JsonUtiltiyでモンスターデータのJSONファイルを構造体配列に読み込む

ゲームでは大量の(本当に大量の)数値データを管理する必要があり、そのデータをどのように管理するかは、ゲーム開発では常に重要なテーマとなります。ここで言う数値データとは、武器のデータやモンスターのデータ(構造体)などのことです。これらが容易…

Unityセーブデータ実装3原則【2019】

Unityでローカルにセーブデータファイルを保存したい時に、毎回やり方を失念してしまい、「あれ? どこに保存すればいいんだっけ? APIは何を使うんだっけ?」となってネットを漁ることになり非効率なので、また忘れても大丈夫なように、ここに「Unityセ…

UnityTips 2019.1にプロジェクトを移行した時に出たエラーと対応処理

Unity2018.2で開発していたプロジェクトを2019.1で開くと「TextMeshProがどうたら(ちゃんと読んでない)」というエラーが大量に出て実行できなくなりました。これ、前にも起きてその時は色々操作してたらなんとかなったんですが、正しい解決方法を確認した…

Unityシェーダープログラミングの教科書3 ライティング&GI(大域照明)解説編

告知です。新刊同人誌「Unityシェーダープログラミングの教科書3 ライティング&GI(大域照明)解説編」のPDF版を、BOOTHさんに登録しました。 s-games.booth.pm また、本書の物理書籍版を、4月14日(日)に池袋で開催される技術書典6で頒布…

"unity シェーダー"で土屋のシェーダー本にリーチしないのが悔しい

悔しいのでエントリ名にしました。本文とは関係ありません。 シェーダー本3の作業が佳境に入っていましてブログを書く余裕がありません。小ネタを幾つかまとめて。 ハマりポイント:VisualStudioのアップデート Unity2018.3でちょっとしたC#コードをビルド…

#unity "Precomputed Realtime GI"の「事前計算」はいつなのかという話

UnityにおけるGI(Global Illumintaion. 大域照明)は、"Baked GI"という、ビルド時(あるいはもっと前)にシーンの間接光を計算し、そのカラー値をライトマップと呼ばれるテクスチャに書き込む(「ベイクする(焼き付ける)」と言います)物を指します。…

Unity 2018.3からMesh Rendererインスペクタのレイアウトが大幅に変更されてた

ふとUnityを眺めていたら、Mesh Rendererインスペクタのレイアウトが2018.3から、レイアウトが大幅に変更されていたことに気づきました。 左が2018.2、右が2018.3です。プロパティの構成要素自体は変化してませんが、いくつかの名称が変更されていたので、以…

Unityライセンスはバージョンごとに紐付けされているという話

※すみません以下のエントリ勘違いかも。追記参照。 Unityは去年からPlusの年間ライセンスを購入しています(もちろん個人で)。とはいえ、去年は結局アプリをリリースすることがなかったので、ダークUIテーマにして楽しむくらいしか意味なかったですけど………

Standard ShaderのEmissionを自作シェーダーに組み込みたかった(過去形)

Standard ShaderにEmissionという項目があります。 docs.unity3d.com これはオブジェクト自体を発光体にする物で、オプション選択で、ライトマップにベイクしたり、ライトプローブにリアルタイム反映させたりできます。とはいえ、その「ライトマップにベイク…

Unityライティングモードリファレンスカードを和訳

Unity Lighting Modes Reference Cardという公式が提供しているスプレッドシートがあります。これは、UnityでのGI(グローバルイルミネーション)において、光を投影するライトと、その光を受けるオブジェクトのそれぞれが動的/静的だった場合に、ライトと…

モバイル環境での遅延シェーディングがアリになったタイミングの話

モバイル環境での遅延シェーディング(ディファードシェーディング)は、元々非サポートだったのが少し前からアリになったというのは小耳にかじっていたのですが、ドキュメントを読んでいたら、2017.4から解説が更新されている事に気づきました。2017.3 http…

円形のエリアライト(Unity2018.3からの新機能)の話

シェーダー本3の執筆中に気づいたこと。2018.3から、エリアライトに円形(Disc)が追加されました。これまでは矩形(RectAngle)しかなかったので、表現の幅が広がったと言えましょう。 https://unity3d.com/jp/unity/whats-new/unity-2018.3.0 これにとも…

LightmapParametersクラスの話

LightingウィンドウにLightmapParametersという指定項目がありまして、通常は下記のリストから選択するんですが、LightmapParametersアセットを作成してカスタマイズもできます。LightmapParameters https://docs.unity3d.com/2018.3/Documentation/ScriptRe…

ShaderでBlendの引数をカスタマイズしたいという話

StandardShaderでは、PassによってBlendやZWriteが以下のように記述されていて、外部から設定可能になっています(ただし、ここに出てくる_SrcBlendなどのプロパティはインスペクタ上は非表示なのでユーザーは直接変更できません。) Name "FORWARD" Tags { …