UniRxで一定時間マウスオーバーで情報表示

カードゲームを作ったんですが、一定時間マウスオーバーでカードの情報を表示したかったのでUniRxでやってみました。結構スッキリ書けて満足。

そのゲームはこちら↓
unityroom.com

    void Start()
    {
        const float mouse_over_time = 2.0f;
        var eventTrigger = gameObject.AddComponent<ObservableEventTrigger>();
        eventTrigger
            .OnPointerEnterAsObservable()
            .SelectMany(_ => Observable.Timer(TimeSpan.FromSeconds(mouse_over_time)))
            .TakeUntil(eventTrigger.OnPointerExitAsObservable()) //PointerExitされたらストリームをリセットする
            .RepeatUntilDestroy(this.gameObject) // 死ぬまで以上を繰り返す
            .Subscribe(_ =>
            {
                cardInformation.SetActive(true);
            });

        eventTrigger
            .OnPointerExitAsObservable()
            .Subscribe(_ =>
            {
                cardInformation.SetActive(false);
            }).AddTo(this.gameObject);
    }

WebGL ビルドで謎の OnJointBreak2D 関連のエラーが出る

Unityroomに投稿しようと思ったら、OnJointBreak2Dが云々という謎エラーが出て困ってました。

Unityのバージョンを落としてみたり、.Netを2.0から4.0に切り替えてみたり、色々と試してみたものの対処できずにいたところ、Twitterで以下のつぶやきをみつけました。


link.xmlってなんぞ?って思ったんですが、どうもこれを書いて置いておくと、そこにかかれたモジュールがコードストリップでストリップされないというものらしいです。

コードストリップが問題ということは、そもそもコードストリップを切ればよいのでは?っと思って試してみたところ、Developビルドでは、out of memoryで死んでしまいました。

Release ビルドでは行けました。けどメモリの無駄だしストリップは有効にしたい。

というわけで、先のTweetAndanteさんに、どういうふうにlink.xmlを書けばよいのですか?と聞いたところ親切に教えていただけました。教えていただけたlink.xmlを置いたところ無事にエラーは出なくなりました。

後でブログにまとめていただけるそうなので、詳細はそちらにゆずりここには書きません。

ちなみにlink.xmlはAssetsフォルダ以下に置けば良いようです。公式サイト探しても全然そういう記述が見つけられず苦労しました。

WebGL ビルドで謎の OnJointBreak2D 関連のエラーが出る

Unityroomに投稿しようと思ったら、OnJointBreak2Dが云々という謎エラーが出て困ってました。

Unityのバージョンを落としてみたり、.Netを2.0から4.0に切り替えてみたり、色々と試してみたものの対処できずにいたところ、Twitterで以下のつぶやきをみつけました。


link.xmlってなんぞ?って思ったんですが、どうもこれを書いて置いておくと、そこにかかれたモジュールがコードストリップでストリップされないというものらしいです。

コードストリップが問題ということは、そもそもコードストリップを切ればよいのでは?っと思って試してみたところ、Developビルドでは、out of memoryで死んでしまいました。

Release ビルドでは行けました。けどメモリの無駄だしストリップは有効にしたい。

というわけで、先のTweetAndanteさんに、どういうふうにlink.xmlを書けばよいのですか?と聞いたところ親切に教えていただけました。後でブログにまとめていただけるそうなので、中身はそちらにゆずり、ここには書きません。

ちなみにlink.xmlはAssetsフォルダ以下に置けば良いようです。公式サイト探しても全然そういう記述が見つけられず苦労しました。

ほぼフルカスタムのMacbook Pro 2019 16-inch VS Macbook Pro 2020 M-1 13-inch

開発にMacbook Pro 16-inchを使っているんですが、Unityでのゲーム実行やコンパイル、ビルドに時間がかかって、ファンがガンガン回ってうるさいので、話題のM1 Macを買ってみました。

乗り換えてみたものの、そんなに早くなった気がしない。

むしろ遅くなった気もする。

それぞれのスペックは以下

Macbook Pro 2019 16-inch Macbook Pro 2020 M1 13-inch
Processor 2.4 GHz 8-Core Intel Core i9 Apple M1
Memory 32 GB 16GB

ベンチマークサイトでの比較

Macベンチマークサイトで性能を見て比較すると以下のように、
Mac Benchmarks - Geekbench Browser

MBP 2019 16-inch MBP M-1 2020 13-inch
シングルコア 1092 1701
マルチコア 6849 7358

これによると特にシングルコアでM1圧勝じゃないか。なのに遅くなったように感じるとはなんぞや。

体感だけで言っててもしょうがないので条件を揃えて比較することに。

計測結果

計測に利用したのはUnity2020.1.17f1。自分がいま作っているゲームをビルドしました。

MBP 2019 16inch MBP 2020 M1 13inch
Unity Libraryフォルダ削除して起動 4:29 6:20
SwitchPlatform(PC→Android) 3:37 6:40
Build Apk 10:21 12:23
Build Apk 2回目 4:05 4:35
SwitchPlatform(AndroidiOS) 6:55 11:15
Build iOS 3:55 5:06
ゲーム起動 0:36 0:49

気のせいじゃなかった。全体的にM1マックのほうが2割 ~ 3割程度遅い。

アクティビティモニター使用状況

f:id:wkpn:20210419182552p:plain
MBP2019 16inch
f:id:wkpn:20210419182431p:plain
MBP2020 M1 13inch

これをみるにメモリの差が影響しているのかなぁ。

メインマシンはMBP2019に戻しました。

M1 Mac 何に使おう...

※あとから言われて気がついたんですが、UnityがまだAppleシリコンネイティブ対応していないので、この結果は当たり前っちゃ当たり前な気がしてきました。
Appleシリコンネイティブ対応版が正式に出たら、また試してみようと思います。

古いプロジェクトを最新のUnityにバージョンアップしたらドラッグできなくなった

気がついたら、ドラッグ対象のオブジェクトにCanvasコンポーネントがついてたからだった。

Canvasコンポーネントを外したら解決。

Keystore file '.../Temp/gradleOut/launcher/○○○.keystore' not found for signing config 'release'. See the Console for details. というエラーが出る。

古いプロジェクトを最新のUnityにバージョンアップして、Androidビルドしたところ、

Keystore file '.../Temp/gradleOut/launcher/○○○.keystore' not found for signing config 'release'. See the Console for details.

というエラーが出て困っていたのだけれど、Player Settingsで、keystoreをブラウズから選択し直したらビルド通りました。

OdinにDictionaryのSerializeを任せてたらエラーが出た

実機でうまく動かないアプリがあってログを確認すると以下のようなエラーが出ていた。

Creating a serialization formatter for the type 'System.Collections.Generic.Dictionary' failed due to missing AOT support.

Please use Odin's AOT generation feature to generate an AOT dll before building, and MAKE SURE that all of the following types were automatically added to the supported types list after a scan (if they were not, please REPORT AN ISSUE with the details of which exact types the scan is missing and ADD THEM MANUALLY):

System.Collections.Generic.Dictionary (name string: 'System.Collections.Generic.Dictionary`2[[EUserProperty, Assembly-CSharp],[UnityEngine.Sprite, UnityEngine.CoreModule]], mscorlib')
EUserProperty (name string: 'EUserProperty, Assembly-CSharp')
UnityEngine.Sprite (name string: 'UnityEngine.Sprite, UnityEngine.CoreModule')

IF ALL THE TYPES ARE IN THE SUPPORT LIST AND YOU STILL GET THIS ERROR, PLEASE REPORT AN ISSUE.The exception contained the following message:
Attempting to call method 'Sirenix.Serialization.DictionaryForma
ExecutionEngineException: Attempting to call method 'Sirenix.Serialization.DictionaryFormatter`2[[EUserProperty, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null],[UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]::.cctor' for which no ahead of time (AOT) code was generated.
at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters) [0x00000] in <00000000000000000000000000000000>:0
at System.Activator.CreateInstance (System.Type type, System.Boolean nonPublic) [0x00000] in <00000000000000000000000000000000>:0
at Sirenix.Serialization.FormatterLocator.GetFormatterInstance (System.Type type) [0x00000] in <00000000000000000000000000000000>:0
at Sirenix.Serialization.FormatterLocator.CreateFormatter (System.Type type, Sirenix.Serialization.ISerializationPolicy policy) [0x00000] in <00000000000000000000000000000000>:0
at Sirenix.Serialization.FormatterLocator.GetFormatter (System.Type type, S


丁寧に Please use Odin's AOT generation feature とあるので、それに従う。

Tools > Odin Inspector > Preferences > AOT Generation.

とたどっていくと、以下のような画面に、

f:id:wkpn:20201209130516p:plain

ここにあるAutomate Before Builds にチェックを入れることでエラー対処できました。