3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UnityアプリのC#をホットアップデートする

3
Last updated at Posted at 2025-12-20

UnityアプリのC#をホットアップデートする

STYLY Advent Calendar 2025 の20日目の記事です。

※本記事でご紹介する内容はApp Store及びGooglePlayStoreの規約抵触する恐れがあります。
記事内容を実装してのストアリリースに関しては今一度ご自身でお調べください。
https://developer.apple.com/app-store/review/guidelines/ 2.5.2
https://developer.android.com/privacy-and-security/risks/dynamic-code-loading?hl=ja

最近緩和されたサードパーティーストアとかならワンチャン

目次

  • STYLYでC#が使いたい!
    • HybridCLR
    • セットアップ
    • 読み込まれるDLLを作る
    • AssetBundleに入れてみる
    • アプリ側
    • さいごに

STYLYでC#が使えたらなって思いますよね

一度は思いますよね。
Playmakerとかいう有料アセットを用意してちまちまロジックを組み上げるのではなく、コードかけたらなぁって。
「aiエージェントにやらせたら2分くらいで出来るのに」って思いながらがPlaymakerで2-3時間かけて複雑なロジックを組むのは正直地獄です。やりたくない。

なぜ今C#が使えないのかというと、セキュリティ的な懸念があったり、そもそもAOTコンパイルなので動的ロードされるアセットバンドルには含められなかったり、STYLY上で動くサンドボックス環境的なものを提供するまでのコストは割けなかったり。などなどです。(きっと)

でも探すと方法はありそうなもので、C#のホットリロードを可能にする、HybridCLRというライブラリがありました。(IL2CPPのみ)
ホットリロード部分のコードはインタプリタで実行できるようになるようです。
今回はこれを使ったSTYLYの開発ビルドで、コンテンツ側に実装した様々なコードを実行してみたいと思います。
※実際のSTYLYで使うことはできません。

セットアップ

公式ガイドに従ってセットアップをします。
既存プロジェクトに入れる場合は規模次第でそこそこ時間がかかるかもしれません。

読み込まれるDLLを作る

STYLYでは、ユーザーはUnityにSTYLY Pluginを入れてコンテンツのアップロードを行います。
そのため、DLLは別プロジェクトで作成します。
新しいプロジェクトを作って、先ほどと同じようにセットアップをします。
今回はセットアップ時に作成したasmdefのディレクトリに次のような処理を持つスクリプトを追加しました。

セットアップできたら、動作確認用に下記のようなスクリプトを追加しておきます。

void RunStart()
{
    // cubeを生成
    _cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    _cube.transform.position = new Vector3(0, 0, 0);
}

void RunUpdate()
{
    // 左右に往復運動
    float amplitude = 0.3f;
    float speed = 3f;
    Vector3 pos = _cube.transform.position;
    pos.x = Mathf.Sin(Time.time * speed) * amplitude;
    _cube.transform.position = pos;
}

コードを書き換えたら上のHybridCLR -> CompileDllからターゲット毎にdllをコンパイルしなおします。
image.png

AssetBundleに入れてみる

既存のSTYLY Pluginはアセットバンドルにコードやテキストを含める仕様はないので、上記dllをexample.dll.bytesと改名し、TextAsset としてアセットバンドル内に生成したdllを持たせるようにしました。

アプリ側

アプリ側に任意のタイミングで上記のasmdefから生成されたdllを読み込む処理を追加します。
ここではシーン再生時に用意しておいたdllのエントリーポイント "RunStart()" を呼ぶようにしました。

これで、シーンにCubeを置いていないのに、Cubeが追加され、左右に動いていることが確認できます!

あとは好きなように書けるのでなんでもできますね!

さいごに

実用性はなさそうですが、技術的には面白かったです。
中国で流行っているそうですが、ストア経由以外でアプリ内コードが変わっているところは大丈夫なんでしょうかね?その辺気になってます。

以上!!!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?