Slide 1

Slide 1 text

軽率にBabylon.jsを C#で使う技術 にー兄さん(@ninisan_drumth) Babylon.js 勉強会 LT会

Slide 2

Slide 2 text

にー兄さん(@ninisan_drumath) ソフトウェアエンジニア 株式会社ホロラボ / Iwaken Lab. / Babylon.js勉強会 お仕事ではUnityを使ったxR開発がメイン 趣味ではBabylon.jsをよく触る 唐突な うちの猫たち→

Slide 3

Slide 3 text

本日の話 Babylon.js

Slide 4

Slide 4 text

本日の話 BabylonCS

Slide 5

Slide 5 text

本日の話 BabylonCS JavaScriptではなくC#で Babylon.js開発ができる 仕組みを考えてみました (Babylonよりも.NETの話が多いかも......)

Slide 6

Slide 6 text

アジェンダ - こんなものを作りました ~BabylonCSの話~ - BabylonCSを支える技術 - BabylonCSの意義と今後の話 - おわりに

Slide 7

Slide 7 text

こんなものを作りました ~BabylonCSの話~

Slide 8

Slide 8 text

さっそくデモタイム!

Slide 9

Slide 9 text

改めての概要 BabylonCSはBabylon.jsをC#で書く仕組みを考えるプロジェクト デモ・サンプルコードがある 実は1月頭にノリで始めた(作業ログ)

Slide 10

Slide 10 text

シンプルなBabylon.jsコード(TypeScript) import { Engine, MeshBuilder, Scene } from "@babylonjs/core"; const main = () => { const renderCanvas = document.querySelector("#renderCanvas"); if (!renderCanvas) { return; } const engine = new Engine(renderCanvas); const scene = new Scene(engine); scene.createDefaultCameraOrLight(true, true, true); MeshBuilder.CreateBox("box", { size: 0.2 }); window.addEventListener("resize", () => engine.resize()); engine.runRenderLoop(() => scene.render()); }; main(); canvasを取得し、 engineやsceneを初期化して サイズ0.2のCubeを表示する

Slide 11

Slide 11 text

BabylonCSを使った場合(C#) using System; using BabylonCS; if (!Document.TryGetRenderCanvas("renderCanvas", out var renderCanvas)) { Console.Error.WriteLine("canvas not found"); return; } var engine = new Engine(renderCanvas, true); var scene = new Scene(engine); scene.CreateDefaultCameraOrLight(true, true, true); MeshBuilder.CreateBox("box", 0.2f); engine.SetupResize(); engine.RunRenderLoop(() => scene.Render()); canvasを取得し、 engineやsceneを初期化して サイズ0.2のCubeを表示する

Slide 12

Slide 12 text

GitHubで公開しています https://github.com/drumath2237/BabylonCS

Slide 13

Slide 13 text

BabylonCSを支える技術

Slide 14

Slide 14 text

開発環境 - JS Side - Babylon.js 6.32.1 - TypeScript 5 - Vite 5 - C# Side - .NET 8.0.100 (C#12) - JS Interop on WASMが使える.NET 7以上

Slide 15

Slide 15 text

.NET×WebフロントといえばBlazor!ですが...... - BlazorはC#で使えるWebフロントエンドフレームワーク - コンポーネントベースでUIを定義できる - ASP.NET Coreを使ったServer Sider Renderingや WebAssemblyベースのClient Sider Renderingをサポート - .NET 7からBlazorの基盤であるWebAsseblyビルドが独立した - JS Interopにより既存のWebアプリに.NETを組み込むことも可能

Slide 16

Slide 16 text

JS Interop(JavaScript相互運用)について - JSコードから.NETのメソッドを呼び出す - .NETコードからJS関数呼び出す

Slide 17

Slide 17 text

JSExportのイメージ C# JavaScript JSからC#のメソッドを呼び出す

Slide 18

Slide 18 text

JSImportのイメージ C# JavaScript C#からJSの関数を呼び出す

Slide 19

Slide 19 text

JS Interopの動作 WASM化された.NET Runtime上で WASM化されたC#コードが JSと連携して動作するような関係 開発者目線ではC#とJSが 直接対話しているように見える

Slide 20

Slide 20 text

BabylonCSのプロジェクト構成 / ├─ BabylonCS │ ├─ BabylonCS ← InteropをラップしたC# API │ ├─ BabylonCS.Interop ← JS Interop部分 │ └─ Playground ← 検証用プロジェクト │ └─ BabylonCS.JS ├─ lib ← TypeScript API └─ src ← 検証用コード

Slide 21

Slide 21 text

プロジェクト構成図 TypeScript APIは Viteのlib modeで開発 ビルドしたJS Moduleを dotnet.jsのAPIで C#側へ公開 C#でInteropコードを ラップした Babylon.js風APIを提供

Slide 22

Slide 22 text

BabylonCSの意義と今後の話

Slide 23

Slide 23 text

Babylon.jsコミュニティにはUnity経験者が多い - もともとUnityやUEをやっている人が 興味ではじめるケースが結構多い(自分もそう) - Web上でリアルタイム3DCGやXR体験を扱う需要の高まり?

Slide 24

Slide 24 text

イチからWebやNode.jsの勉強するのは大変 - Web出身ではない人にとっての敷居の高さ - Babylon.jsはがっつりJS/TSのコードを書くので 慣れていないと結構大変 - Webも3DCGも知識が必要だから、とっつきにくい - せっかくいいライブラリなのにもったいない!! - 慣れているC#で書けないかと思ったのが発端

Slide 25

Slide 25 text

今後やりたいこと - パッケージ公開 - 機能追加 - アセンブリ構成の見直し - C#実装の自動生成

Slide 26

Slide 26 text

おわりに

Slide 27

Slide 27 text

まとめと感想 - C#でBabylon.js開発ができないか試行してみた - JS Interop on WASMのパワーによって動く気がした - Babylon.js入門の敷居を低くできないかと考えている - あまり触ったことのない技術を触れてたのしい

Slide 28

Slide 28 text

参考 Use .NET from any JavaScript app in .NET 7 https://devblogs.microsoft.com/dotnet/use-net-7-from-any-javascript-app-in-net-7/ .NET 7の.NET JavaScript interop on WebAssemblyを試す https://qiita.com/yamachu/items/f070ef516c6792ac7e67 ASP.NET Core Blazor JavaScript interoperability (JS interop) https://learn.microsoft.com/en-us/aspnet/core/blazor/javascript-interoperability/?view=aspnetcore-8.0 ASP.NET Core Blazor で .NET メソッドから JavaScript 関数を呼び出す https://learn.microsoft.com/ja-jp/aspnet/core/blazor/javascript-interoperability/call-javascript-from-dotnet?view=asp netcore-5.0 JavaScript から .NET を実行する https://learn.microsoft.com/ja-jp/aspnet/core/client-side/dotnet-interop?view=aspnetcore-8.0 Configuring and hosting .NET WebAssembly applications https://github.com/dotnet/runtime/blob/main/src/mono/wasm/features.md