2013/10/13(日) [n年前の日記]
#1 [unity] RaycastAllでハマった
Unityのスクリプト上には
_Physics.RaycastAll
というメソッドがあって。伸ばしたレイ(=光線)と交差する全てのポリゴンを ―― ポリゴンとの交点情報(
_RaycastHit
)を全て返してくれるので、コレを使って地形モデルとのアタリ判定ができないかなと実験してたのだけど。思ったように行かなくてハマったり。
以下のような地形モデルを作って実験。
空中に足場がある地形モデルなわけだけど、その空中の足場から、下に向かってレイを出せば、足場+地面で、交点情報が2つ以上返ってくるはず。
ところが、何度試しても、交点情報が1つしか返ってこない…。
調べてみたら、どうやらこの RaycastAll ってのは、レイと交差した「オブジェクト」の個数分、情報を返すようで。地形モデルは1つのオブジェクトだから、交点情報を1つしか返してこないのは仕様通りで。試しに足場オブジェクトを2つ3つ置いて試したら、ちゃんと2つ3つ返ってきた。
しかしこのままでは、空中の足場の交点しか得られない。
空中の足場は別オブジェクトとして ―― 地面のFBXモデルとは別のFBXモデルとしてエクスポート/インポートする、というやり方も試してみたのだけど。たしかにそれなら思った通りの結果が得られる。が、エクスポート/インポート作業が面倒臭くて。やはり地形モデルは1つにしておきたい。
仕方ないので、 _Physics.Raycast を使って、何度もレイを出し直すやり方を試したり。何かと交差していたら、その交点から少し先に進んだ場所から、またレイを出し直す。それを、何一つぶつからない状態になるまで繰り返す。
後は足場から降りる処理を書くだけ。と思ったけれど、これを書いてる途中で気がついた。これでは、敵キャラや敵弾やプレイヤーの弾が足場の下に居た時も、そいつらを足場として判定しちゃいそうだな…。どうしよう…。
以下のような地形モデルを作って実験。
空中に足場がある地形モデルなわけだけど、その空中の足場から、下に向かってレイを出せば、足場+地面で、交点情報が2つ以上返ってくるはず。
- 交点情報が1つなら、地面の上に立っているから降りられない。
- 交点情報が2つ以上なら、地面ではない足場に立っているから降りられる。
ところが、何度試しても、交点情報が1つしか返ってこない…。
調べてみたら、どうやらこの RaycastAll ってのは、レイと交差した「オブジェクト」の個数分、情報を返すようで。地形モデルは1つのオブジェクトだから、交点情報を1つしか返してこないのは仕様通りで。試しに足場オブジェクトを2つ3つ置いて試したら、ちゃんと2つ3つ返ってきた。
しかしこのままでは、空中の足場の交点しか得られない。
空中の足場は別オブジェクトとして ―― 地面のFBXモデルとは別のFBXモデルとしてエクスポート/インポートする、というやり方も試してみたのだけど。たしかにそれなら思った通りの結果が得られる。が、エクスポート/インポート作業が面倒臭くて。やはり地形モデルは1つにしておきたい。
仕方ないので、 _Physics.Raycast を使って、何度もレイを出し直すやり方を試したり。何かと交差していたら、その交点から少し先に進んだ場所から、またレイを出し直す。それを、何一つぶつからない状態になるまで繰り返す。
RaycastHit[] GetRayCastHits(Vector3 pos, Vector3 vec, float dist) { Vector3 ofs = vec.normalized; ArrayList a = new ArrayList(); RaycastHit hit; while (Physics.Raycast(pos, vec, out hit, dist)) { a.Add(hit); pos = hit.point + ofs; } return (RaycastHit[])a.ToArray(typeof(RaycastHit)); }これなら、1つの地形モデルオブジェクトに対しても、望む結果が得られた。処理は重くなってそうだけど。
後は足場から降りる処理を書くだけ。と思ったけれど、これを書いてる途中で気がついた。これでは、敵キャラや敵弾やプレイヤーの弾が足場の下に居た時も、そいつらを足場として判定しちゃいそうだな…。どうしよう…。
[ ツッコむ ]
以上です。