しゅみぷろ

プログラミングとか

RaycastHitのTexcoordが常に0ベクトルを返すのですよ

はじめに

RaycastHitのTexcoordが常に0ベクトルを返す問題に遭遇したのでメモとして残しておきます。

ちなみにUnity - スクリプトリファレンス: RaycastHit.textureCoordでも表記があるように、 コライダーがMeshColliderではなかった場合、 RaycastHitのTexcoordは常にVector2.zero を返しますが、これとは別案件です

今回のケースではWebGLでビルドした時は正常にTexcoordが返ってくるのに、Standaloneでビルドすると常にVector2.zeroが返ってくるというちょっと不思議な問題です。


f:id:es_program:20160506155607g:plain:w400

正常にTexcoordを取得し、描画できている場合


f:id:es_program:20160506155548g:plain:w400

正常にTexcoordが取得されず、常に0ベクトルが返ってくる場合


Texcoordを取得してその位置にインクを塗る、といった処理をしているのですが、見ての通り正常に描画されない場合、Texcoordが常に0ベクトルを返しています。

解決法

解決するのはものすごく簡単です。メッシュのインポート設定でRead/Write Enabledにチェックを入れるだけです。

docs.unity3d.com

上記事より引用(一部変更しています)すると

Read/Write Enabledを有効にするとランタイム時にメッシュを書込可能とし、メモリ内でコピーが作成されます。このオプションをオフにすると Unity がゲームのメッシュデータをアンロードできるためメモリが節約できます。しかし実行時に不均等なスケールでメッシュをスケールまたはインスタンス化するとインポート設定で “Read/Write Enabled” を有効化しないといけない場合があります。それは不均等なスケールはメッシュデータをメモリ保持する必要があるためです。通常、ビルド時にこれは検知されますがメッシュが実行時にスケールまたはインスタンス化すると手動で設定する必要があります。そうしない場合ゲームのビルド時に正しくレンダリングされないかもしれません。実行時にMeshColliderを作成する必要がある場合もこのことが適用されます

ということらしいです。

何故WebGLでは正常に動いたのか詳細はわかりませんが、利用するモデルデータのコンバートの差異によるものかなと勝手に思っておくことにします。