unity could not produce class with id 210 --- TerrainInstance 其实是 UnityEngine.CoreModule.Sorting

'Strip Engine Code' の幾重にも張り巡らせられる罠

https://qiita.com/warapuri/items/e2562e9535bfae5013d0

More than 1 year has passed since last update.

前置き

Unity には 'Strip Engine Code' という機能があって、必要のないEngine側のコードを削ってくれるという便利な機能がある。
ただ、AssetBundle を作るときには注意が必要だ。なぜかというと、AssetBundleはビルドした元のファイルはアプリ本編の方には入れないのが普通で、そうなるとStripされてしまうというわけだ。くわしくはテラシュールブログの「【Unity】Unity 5.3からAssetBundleはどう変わるのか…まとめ」を読んでもらうといいかもしれない。

これを回避するためには「link.xml」というファイルを作ってその中に

link.xml

<linker>
       <assembly fullname="UnityEngine">
               <type fullname="UnityEngine.GameObject" preserve="all"/>
               <type fullname="UnityEngine.Texture2D" preserve="all"/>
       </assembly>
</linker>

こんな感じに書かなくちゃいけない。で、↑の

link.xml

              <type fullname="UnityEngine.Texture2D" preserve="all"/>

という部分を必要なコンポーネントを追加しなくちゃいけないということになる。
で、その必要なコンポーネントっていうのがミソで、何が必要かというのが事前にわかるわけではない。イヤ、わからなくはないのだが、一個一個確かめなくてはいけなくて、そもそもAssetBundleを一個一個確認して行く、というのは非現実的だ。

そこで、とりあえず全部AssetBundle をロードしていって、落ちたところを見て、落ちたときのエラーメッセージを確認しつつ、どんなコンポーネントが含まれていなかったということを確認するという地道なことをしていくしかない。

落ちたとき

Could not produce class with ID XXX

というメッセージが出るので、そのIDが本来必要だったコンポーネントのIDというわけだ。

罠1

前置きが長くなった。
で、だ。

今回のエラーメッセージが

Could not produce class with ID 210

という「210」という番号。それを公式のマニュアル「YAML Class ID Reference」を調べると、

とババーンと書いてある。ほうほう、「TerrainInstance」が足りないんだな、と。

だがそれは罠だ。

いやいやいや、おかしいでしょ。
今時Terrainを使う方がありえないし、そもそもAssetBundleですよ?TerrainをAssetBundleに入れることなんてそうそうない。実際に使っていない。

罠2

さっぱりわからなかったが、ググってみたら同じような質問に回答している人がいて、そこに

The class-ID docs are misprinted.
The actual type is UnityEngine.CoreModule.SortingGroup, not TerrainInstance.
Took me a lot of brute-force testing to get to the solution :) I hope > this saves you some trouble.
Good luck!

ま、要は

それはミスプリントで、本当は「UnityEngine.CoreModule.SortingGroup」であって、「TerrainInstance」じゃないよ。
はっはっは、まいったよね。俺も大変だったよ。じゃあ頑張ってな!

と言ってる。

なるほど、そういうことか。それでは「UnityEngine.CoreModule.SortingGroup」を入れればいいということだな、と。

だがそれは罠だ(2回目)

実際に「UnityEngine.CoreModule.SortingGroup」を入れてもダメで、実際は

「UnityEngine.Rendering.SortingGroup」を入れなくてはいけない。(考えて見たらその通りで、なんで「CoreModule」でのnamespace にしてるんだろう?という。おそらく昔はそうだった的な?)

というわけで、

link.xml

<linker>
       <assembly fullname="UnityEngine">
              <type fullname="UnityEngine.Rendering.SortingGroup" preserve="all"/>
       </assembly>
</linker>

というのが本当に必要なことだったということ。
現場からは以上です。

 

======================

这是一个错误打印,事实上,它是UnityEngine.CoreModule.SortingGroup,而不是TerrainInstance。
    嗯,是的,是的,是的。 我也很难。 那就祝你好运!

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值