[C# Avalonia] 3D Model Explorer #03 — Mac版を公開。Linux版を1行変え移植完了。
はじめに
VRM / PMX / FBX / GLB ファイルをサムネイル一覧で管理するデスクトップアプリ「3D Model Explorer」の Mac版を公開しました。
3D Model Explorer — VRM/PMXサムネイル一覧管理ツール(Windows / Linux /Mac ) - lain-lab - BOOTH
VRM / PMX / FBX / GLB ファイルをサムネイル一覧で閲覧・管理するデスクトップアプリです。 Windows版・Linux版・Mac版を同梱しています。 3Dモデルが増えてくると、ファイル名だけでは中身がわからない—— そんな不満を解決するために作りました。 【主な機能】 ・VRM(0.x / 1.0)のサムネイルをGLBバイナリから直接抽出 ・PMX / FBX のZIP配布ファイルから同梱サムネイルを自動探索 ・GLBファイルのサムネイル抽出・メタデータ表示 ・モデルのメタデータ表示(タイトル・作者・ライセンス等) ・フォルダ登録・お気に入り・タグ・検索
lain-lab.booth.pmWindows版、Linux版に続いて3つ目のプラットフォーム対応。
ただ、今回の「移植」は、正直に言って衝撃的な体験でした。
実質的なコード変更は、ウィンドウタイトルの1行だけ。
Title="3D Model Explorer (Linux)"
↓
Title="3D Model Explorer (Mac)"
嘘みたいですが、本当にこれだけで Mac 上で完全に動作するアプリが完成。
やったこと
今回の作業を時系列で並べると、こうなります。
- MacBook Air(2020 / Intel i7)にSSHでリモート接続できるようにした
- VS Code の Remote-SSH で Windows から Mac に接続
- GitHub から Linux版のリポジトリをクローン
- Homebrew で .NET 8 SDK をインストール
dotnet runを実行した- 何も変更していないのに、そのまま動いた
- タイトルを「(Mac)」に変更
dotnet publishでリリースビルド- BOOTH にアップロード
環境構築を含めて、所要時間は約1時間。そのうちコードを触った時間は、タイトルを書き換えた数秒間だけです。
なぜこんなことが可能なのか —— Avalonia UI
これを可能にしたのは、Avalonia UI というフレームワークです。
Avalonia UI とは
Avalonia は、.NET のオープンソース UI フレームワークです。ひとことで言えば「WPF(Windows Presentation Foundation)のクロスプラットフォーム版」です。
WPF は Windows 専用の GUI フレームワークで、XAML と C# を使ってデスクトップアプリを作る仕組みです。非常に強力ですが、Windows でしか動きません。
Avalonia は、この WPF の設計思想と XAML 記法をほぼそのまま引き継ぎつつ、Windows / Linux / macOS / iOS / Android / WebAssembly で動作するように作られています。WPF を作った元 Microsoft のエンジニアが関わっているため、XAML の書き方がとても似ており、WPF の知識がほぼそのまま使えます。
有名な採用事例としては、JetBrains の Rider(.NET 向け IDE)が Avalonia で構築されています。
WPF → Avalonia → 3プラットフォーム対応の流れ
3D Model Explorer のこれまでの開発経緯は、こうなっています。
- v1.0(Windows版): C# + WPF で開発。約5時間で完成
- v1.1(Windows版): GLB対応、ダークテーマ、設定エクスポート等を追加
- Linux版: WPF → Avalonia UI に移植。約2時間で全機能移植完了
- Mac版: Linux版のコードをそのまま使用。タイトル変更のみ。約1時間(環境構築含む)
ポイントは、Linux 移植のタイミングで WPF 依存をすべて Avalonia に置き換えたことです。このとき行った主な変更は以下の通りです。
- XAML 名前空間の変更
BitmapImage→Avalonia.Media.Imaging.BitmapMouseLeftButtonUp→PointerPressedStatusBar→Border+DockPanel- ファイルダイアログ →
StorageProviderAPI - 設定パス:
%APPDATA%→~/.config/
一方で、このアプリの核心であるバイナリパース処理(GLBからのサムネイル抽出、VRMメタデータ解析、PMXヘッダー解析など)は 1行も書き直していません。C# の BinaryReader や byte[] 操作はプラットフォームに依存しないため、Windows で書いたコードがそのまま Linux でも Mac でも動きます。
つまり、Linux 移植のときに「Avalonia 化」という作業を1回やれば、それ以降は ビルドターゲットを変えるだけ で新しいプラットフォームに対応できるということです。
.NET の実力
.NET(というより C# + .NET ランタイム)は、Web 開発やスタートアップの文脈では「人気がない」と言われることがあります。実際、人気ランキングで上位に来るのは JavaScript / Python / Go あたりでしょう。
ですが、「人気がない」と「使えない」はまったく別の話です。
今回の体験で実感したのは以下の点です。
- クロスプラットフォームが本当に動く: Java の「Write Once, Run Anywhere」と同じ思想が、.NET でもちゃんと実現されている
- ネイティブに近いパフォーマンス:
self-containedビルドで .NET ランタイムごと1つの実行ファイルにまとめられる。ユーザーは SDK のインストール不要 - バイナリ操作が強い:
BinaryReader、Span<byte>、MemoryStreamなど、バイト列を扱うための道具が充実している。GLB や PMX のようなバイナリフォーマットの解析には最適 - 既存資産が活きる: 1年以上の Web 開発(Three.js / WebXR)で蓄積した GLB / VRM / PMX のバイナリ知識を、C# にそのまま移植できた
ネットの評判と実体験
ネットで技術の評判を調べると、「.NET は人気がない」「Avalonia はマイナー」といった声が目に入ります。私自身、開発を始める前は半信半疑でした。
でも、実際に手を動かしてみると、世界が違いました。
WPF のアプリを2時間で Linux に移植し、さらに1時間で Mac 版を出せた。バイナリパースのロジックは3プラットフォームで1行も変わっていない。この体験は、どんなブログ記事やランキングよりも説得力があります。
噂話で知るのと、自分で手を動かして開発して体験するのは、全く別次元の話です。技術選定は人気ランキングではなく、自分のやりたいことに合っているかどうかで決めるべきだと、改めて思いました。
まとめ
- 3D Model Explorer の Mac 版を公開しました
- Linux版のコードからタイトル1行変えただけで動きました
- Avalonia UI + .NET 8 のクロスプラットフォーム対応は本物でした
- ダウンロードはこちら:
3D Model Explorer — VRM/PMXサムネイル一覧管理ツール(Windows / Linux /Mac ) - lain-lab - BOOTH
VRM / PMX / FBX / GLB ファイルをサムネイル一覧で閲覧・管理するデスクトップアプリです。 Windows版・Linux版・Mac版を同梱しています。 3Dモデルが増えてくると、ファイル名だけでは中身がわからない—— そんな不満を解決するために作りました。 【主な機能】 ・VRM(0.x / 1.0)のサムネイルをGLBバイナリから直接抽出 ・PMX / FBX のZIP配布ファイルから同梱サムネイルを自動探索 ・GLBファイルのサムネイル抽出・メタデータ表示 ・モデルのメタデータ表示(タイトル・作者・ライセンス等) ・フォルダ登録・お気に入り・タグ・検索
lain-lab.booth.pmNOTE記事:
[3D Model Explorer] Mac版を公開— Linux版がそのままMACで動作|lain
はじめに VRM / PMX / FBX / GLB ファイルをサムネイル一覧で管理するデスクトップアプリ「3D Model Explorer」の Mac版を公開しました。3D Model Explorer — VRM/PMXサムネイル一覧管理ツール(Windows / Linux /Mac ) - lain-lab - BOOTH VRM / PMX / FBX / GLB ファイルをサムネイル一覧で閲覧・管理するデスクトップアプリです。 Window lain-lab.booth.pm Windows版、Linux版に続いて3つ目のプラットフォーム対
note.com