## VContainer 1.17.0 [VContainer](https://github.com/hadashiA/VContainer) は 相変らず、僕が公開しているUnity向けライブラリのなかでもっとも広く使われているようです。Github の☆は微増し続けており、現在 ☆2.4k になってます (ありがとうございます) 昨今のメンテナンスは細かめの修正のみに留まっていましたが、バージョン [1.17.0](https://github.com/hadashiA/VContainer/releases/tag/1.17.0) で久しぶりに大型機能追加がされることになりました。 [Injection by ID by migus88 · Pull Request #764 · hadashiA/VContainer](https://github.com/hadashiA/VContainer/pull/764) 詳細は説明しませんが、DIコンテナと呼ばれるライブラリに大抵は実装されがちなアレが入ります。 実はこれは以前から、度々要望が寄せられていたやつです。 [Request: Register Named Dependency · Issue #218 · hadashiA/VContainer](https://github.com/hadashiA/VContainer/issues/218#issuecomment-841645605) コメントを見返すと、多くのユーザーが導入に賛同していて、反対意見は見当たりません。唯一、作者である僕だけが反対して却下しています。VContainerは歴史的にこうした機能要望の多くを却下しまくってきました。 オープンソースライブラリ、とくにゲーム開発のための道具は、おそらく一般的には機能が多ければ多いほど「良い」とされ、人気が出やすい傾向があるような気がしています。 ゲーム開発というものにはおよそ「正しいやりかた」というものがほとんどないし、自由であればあるほど、行けない場所がなければないほどいい、という価値基準が尊重されます。およそゲームをつくっている全ての人は、「法というものは俺がつくるもの」「俺の通った足跡が道となる」「俺は神だ」と考えているので、たとえそれがごちゃまぜの混沌、孫子の兵法とクラウゼヴィッツ戦争論と「このライトノベルがすごい!」を同時に読みながら戦争を戦うような行為だったとしても、「ない」より「ある」、「少ない」より「多い」が善。なのです。とにかくなんでもかんでもインストールしまくるのが ゲーム開発用ライブラリの姿であり、生きるか死ぬかの無法地帯をサバイブしているときに誰もファッションを気にしないのと同じで、美しさは二の次の厳しい世界なのです。 VContainer をつくったとき、既に先行する Zenject という有名なライブラリが存在しました。Zenject は非常に機能が多く、光るアイデアもあり、先行する技術力があり、採用事例があり、人気がありました。 ある日、僕はとあるZenjectが導入済みのゲーム開発プロジェクトに配属されました。僕の考えでは、Zenject は設計にある種の制約を与え、コントロール可能にすることにこそ価値があると思っていたのですが、あまりにも様々なアイデアが試せてしまうせいで、そこでは使う人によって異なる使われ方がされていました。結果として、ひとつのプロジェクトのなかでさまざまな意図が絡まり合い、ちょっと飛び出ている糸屑を一本ひっぱると二十本くらいの紐が絡まる、みたいなことになっていたと記憶しています。 時には、混沌を正そうとする努力は逆効果に終わります。ある種のむずかしいライブラリには、「このむつかしさは俺にしかわからない」「俺だけが使いこなしている」「俺の通った足跡よ道となれ」といった全能感(?)を使い手に与える不思議な魔力があり、ごちゃごちゃしていて難しくてもむしろ愛される、いや、難しければ難しいほど愛される、みたいな力場が発生します。 あるとき僕は Zenject とは別の道を行くことにして、VContainer をつくりました。ほとんど主要なアイデアはZenjectからのパクりと言えるかもしれませんが、使い心地と設計思想に改良を加えました。もっとも重要な違いは、僕の考える良い使い方しかできないように機能を取捨選択したことです。機能を省くことは、高速化やバイナリサイズの削減、そして少ないコードで多くのことを実現する設計につながった、と思います。 公開当初から、Zenject に習熟したユーザーから様々な機能要望が届きましたが、開発した動機は上記のような理由がすべてだったため、却下しまくりました。「ああごめん。これはZenjectじゃないんだ」なぜその機能を入れないのか、というのは毎回説明しつつ。 今、時は流れ。Zenjectは残念ながら開発が止まってしまい、 VContainer は一応、代替品としてはもっとも人気があるライブラリになりました。現在では、僕よりもむしろユーザーのほうがいろいろと強い意見を持っているようです。今回入った機能についても、すべて migus88 氏が実装してくれました。テストもあり、ベンチマークもあり、別ユーザーからのレビューもあり、おまけに猫の画像もついてます。完璧ですね。 いままで神経質に機能要望を却下し続けたことが良かったのか悪かったかまったくわかりませんが、1.17.0 はなんらかの節目を迎えたリリースであると言えるかもしれません。 ## MRubyCS.Serializer開発中 Web プログラミングファンボーイのみなさんは [deno](https://deno.com) を知っているでしょうか。現在、Webサイトのフロントエンドをつくる際は多くの場合に node.js というものが大抵使われてるはずなんですけど、 数年前、 node.js の作者が「すべてゼロからやり直す! 」と宣言してゼロからnodeをつくりなおしたのがdenoです。「node」の no と deを入れ換えて 「deno」。 マスコットキャラの恐竜がハンモックで寝ていたりなど、かなり魅力的なアートワークをひっさげている割には普及度合いがやや苦戦していますが、技術的にいろいろ考えさせられる存在です。 個人的に目に留まった実装のひとつは [serde_v8](https://github.com/denoland/deno_core/tree/main/serde_v8) です。 node.js や deno というのはようするに、単体ではほとんど言語仕様以外になにもできない 「javascript」というスクリプト言語を拡張して、万能ツールに変えたものですが、 どちらも javascript言語コア部分は 「v8」というかっこいい名前のものをそのまま使っており、 deno の場合はそこ以外の大半が Rust というシステムプログラミング言語で書かれてます。 言ってみれば、「スクリプト言語」を「Rustで書いたシステム」に組み込んでいる、という構成です。 これを聞いて何か思い出しますね…。僕がやっている、C# に Ruby を組み込める MRubyCS はやってることは似てます。 こういうことをする場合、それぞれの言語世界の境界を越えるのがけっこう面倒いことになりがちなんですが、 serde_v8 は 「Rustオブジェクトのメモリ表現」を「Javascriptのメモリ表現」にダイレクトに変換できるのですね。これによって deno 内部では手書きするバインディングの量がおそらくかなり減っているはずです。 [[Unityでmrubyスクリプティング|VitalRouter.MRuby]] でこのアイデアをはじめて実装したんですが、MRubyCS にも「C#オブジェクトのメモリ表現」と「Rubyのメモリ表現」を相互変換できる 、 MRubyCS.Serializer という機能を入れる予定です。 いまはこれをちょっとずつやってます。それをベースに、最終的に VitalRouter.MRuby2 みたいなやつにまとめる予定。 ## ぶたのゲーム 相変わらず「ぶたのゲーム」というタイトルのゲーをつくっています。 ![[screenshot_buta_mori.webp|400]] >ぶた、それ以上森の奥へいくな なんら能力もスキルもない、ぶたのキャラばかり、という縛りを課すことによって、開発期間を限りなくおさえる、という企画だったはずのぶたのゲーム。現在、ただの「ぶた」のほかに三種類のキャラクターが登場することになる見込みになっています。 - UFO (ぶた世界の外側を適当に象徴した存在) - くそまじめなぶた - 瞑想し続けるぶた - あえて夏に冬眠するクマ - 旅人 () 書き出してみたら五種類いました。 登場キャラクターが増えることはまあいいとして、問題は「あえて夏に冬眠するクマ」。夏が始まる前にゲームを公開する予定だったので、夏が旬のキャラクターを入れてしまったのですが、いまや季節は八月を迎えてます。外では蝉が鳴いています。 本当に ただの「ぶた」だけで構成することで開発期間は縮まっているのだろうか。不安になってきています。 ベタな考えから出発するなら、一般に、主人公というのはなにか特別な能力なり出自などを持っており、そこに対して目的を妨害する強力な敵対勢力、目的達成を助ける存在、などなど、ハラハラドキドキ展開を動かしやすい配置をし、そして焦点を定めるため、役割が薄いキャラクターは徐々に類型的でわかりやすいものにしていく、みたいな構成が考えられます。 ところが、すべてが「ぶた」だらけであるとすると、人物の類型もくそもなく、人物間の対比というものが存在しないため、際立った人物というものもまた存在しません。 最近は、ゲームというものを、競技やパズル、遊戯、現実のシミュレーションの類のようなものとして捉えらている人が多い印象です。僕にとってゲームというのは絵本や紙芝居のようなものです。ゲームは、物語(?)みたいなものをもっとも簡単に表現できる、難易度の低いメディアのひとつだと思います。 たとえ画面にぶたしか出ていなかったとしても、プレイヤーがなんらかの操作をしたときに、ある一匹の「ぶた」だけが反応したとしたら、そのぶたが自分の分身であるとプレイヤーは感じるはずです。 ぶたがどれだけ主人公らしからぬ、現代の売れセン文法から外れていたキャラクターだったとしても関係ない。ゲームは、どんなにわけのわからないものを登場させても「そういうもん」として理解させることができる不思議なメディアだと思います。 昔から思っていましたが、現代は、物語を語るタイプのメディアがいろんな意味で成熟しており、その市場が背景に持っている文法から外れることがほとんどなくなっています。売れている物語のうち、語り方がそのジャンルのある種の暗黙のレギュレーションを外しているものはほとんど皆無だと思います。 たとえば小説なら、たとえ三人称だったとしても、視点人物が体験していない内容が文章としてあらわれることがほとんどなくなりました。手法としてはほとんど映画に近くなっていると思います。 > 言うまでもなく、ヴォゴン人の詩は宇宙で三番めに恐ろしい詩である みたいな、視点のない文章を入れることは昔よりかなり少なくなっているんじゃないでしょうか。 また、小説では必ず対象読者と多くの共通点をもつ人間を主軸にすることが必要で、もしも現代のエンタメ小説で「ぶた」のキャラを喋らせる場合、それがなぜ発生するかのエキスキューズが100ページくらい必要になるはずです。昔はそういった制約から小説はもっと自由だったような気がしてなりません。 もちろんゲームも、ジャンルの成熟は著しいですが、僕の感覚では文法から自由になっている、ほとんど唯一のなにかだと感じます。 ### ぶたのノイズ v2 ![[buta_noise_demo.gif]] ぶたの絵にノイズを加える方法を少し改良しました。 ![[screenshot_buta_noise.webp|300]] > メッシュ分割されたぶた (しっぽが枝毛ver) 以前は、フラグメントシェーダーで適当にサンプリング位置にノイズを入れる、という方法を取っていたんですが、この方法だと線がなめらかにならない場合があったり、テクスチャの範囲外をサンプリングした場合の挙動が微妙だったので改良しました。 新しい方法では、ぶたのスプライトをあえて贅沢にメッシュ分割しておき、適当な法線マップ素材で頂点を動かしてます。この方法だと テクスチャの内容は過不足なく表示されるので線の破綻がなくなっていいかんじになりました。 ## Affinity Designer ![[pattern_buta1.webp]] さいきん Affinity 製品をつかってます。 Affinity Designer は 、Adobe Illustlatorのようなツールだとみせかけて割と普通に 同じ画面あら Photoshop的なエディットができたりするので、手描きした絵をアレコレするのに重宝してます。契約形態もシンプルだし 、よくわからない常駐アプリがいつのまにか入っていることもないぞ ### シーンをすぐ編集できるボタン ![[screenshot_buta_startup.png|300]] ぶたプロジェクトでは、シーンを再生しなくてもワンボタンでいきたいシーンを開始したり、開いたりできます。自分のプロジェクトではよくこういうのをつくります。 ぜんぜんつくりこめてないしレイアウトもがたがたですが、ないよりいくらかマシです。ファイルツリーを何度もクリックして目的のものへアクセスするという行為が本当に嫌いなので、とりあえずそこを省略できるようにしがちです。 だいたい、ある作業をしているときに開くアプリやファイルは、ものすごく一部に集中していると思うんですよね。 ついでに言えば、画面を見ているとき、視線の焦点をあちこちに合わせるというのもあんまり好きじゃないです。ディスプレイを何枚もつかうより、見ている位置に 欲しいウインドウが一瞬で来てくれるほうが好きです。 ## 来月… さいきんはなんやかんやでけっこう仕事している時間が多いです。来月はどうなる。 来月8/15は、[perf.tokyo](https://perftokyo.connpass.com/event/363143/) というイベントにお誘いいただき、MRubyCS について発表する予定になってます。今見たら満員になっていた。