パスワードを忘れた? アカウント作成
14307184 journal
日記

yumeの日記: Unity学習 #7 2D Visibility

日記 by yume

2D Visibility

●難題
ncaseの続きをやるが、数式が出てきたところでお手上げになってしまった。
Ray X = r_px+r_dx*T1
Ray Y = r_py+r_dy*T1
Segment X = s_px+s_dx*T2
Segment Y = s_py+s_dy*T2
とあるが、r_pxとは何か、r_dxとは何か、角度をとるのはdegreeでいいのか、さっぱりわからない。
しかもこの数式の次のステップでは、もう交差点をとれてる。えー。

うーむ。なにはともあれ、二つの線分が交差したら、その交差点を座標として取得しなければ。
線分Aはプレイヤーからマウスまで伸びるRay。
線分Bはあるポリゴンの一辺とするSegment。ここまではいい。もっと調べてみよう。

setchi's blogに、
4つのVector2(p1~p4)を入力し、その線が交差したか、および交差点を返す関数がそのまま載っている。
ちょっと試してみよう
・見慣れないパラメータ outがあるけど、これはC#の関数に参照引数として渡すもので、第二・第三の返り値として使えるやつのようだ。
C++では同じ用途にrefを使っていたけど、そのようなものだろう。
実装動作とコードがそのまま書いてあるので、変数が何を表すか完全にわかる。
p1はRayの始点、p2はRayの終点だ。
問題はSegmentのどれを使うのか、ということだが……。これはRayに実際にColliderとしてぶつかるものをチェックすればいい?
いや、それなら衝突位置がとれたらそれでいいような……そういうのありそう。

かさたな日記曰く、
・オブジェクトの衝突を検出するには OnCollisionEnter
・衝突位置はContactPoint

ある。これを使えないかな。
ん、でも現状の線分は単なる描画された線であって、別に衝突判定を持ってるわけじゃないよな……。
公式調べたらPhysics2D.Linecastってある。

Physics2D.Linecast()はRaycastHit2Dを返す。RaycastHit2DはGameObjectが持ちうる様々な情報を持っているが、ここでは
RaycastHit2D.point
を使う。RaycastHit2D.pointはそのまんま、Rayが衝突したVector2 ワールド座標である。
これでいいじゃん。でもパフォーマンス的にちょっとまずかったりするかな?
とにかく、描画する線の終端をぶつかったポイントにしてみよう。

軽く試したがうまくいかない。なぜかというとRaycastHit2Dが常にPlayerに衝突した結果が返ってきてるからだ。
衝突対象はレイヤーか、またはZ深度の以上・以下で限定できるようだ。レイヤーを使ってみよう。
ここでいうレイヤーとは、多分すべてのGameObjectが持つレイヤーのことだ。ビルトインのレイヤーと、ユーザーが設定できるレイヤーがある。
ユーザーレイヤーPolygonWallを追加し、WallのプレハブにはPolygonWallを設定する。
問題はこのレイヤーをどう引数に渡すかだが……引数としてはintが要求されるが、ここにPolygonWallレイヤーの番号(8?)を入れてもダメだ。
cschool blog曰く、
public LayerMask layerMask;でUnity上で選べばよいとのこと。

それで試したら、動く、動くぞ!!

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

アレゲはアレゲ以上のなにものでもなさげ -- アレゲ研究家

読み込み中...