ブログ
これまでに経験してきたプロジェクトで気になる技術の情報を紹介していきます。
チュートリアル等で別カメラのオブジェクトにUnmaskなどの位置を合わせたい
サーバ側のCMSの開発を行いながら、何故かクライアントエンジニアも行っている山中です。 チュートリアル等で特定のボタンだけをタップさせるために、他をグレーアウトしてタップを阻止したい場合があります。 別プロジェクトでも同じ事を行っており、そのソースを探すことになったので、忘れないようにブログにします。
この場合はMaskとUnmaskとUnmaskRaycastFilterを使えば簡単に実装出来ます。 今回の参照URL:https://kan-kikuchi.hatenablog.com/entry/UnmaskRaycastFilter
問題は別のカメラの場合にどうやって位置を合わせるかです。 悩んだ結論は対象のワールド座標をスクリーン座標に変換して、ローカル座標に変換することです。
手順としては最初に対象の親を遡りCanvasを探します。 次に、GetWorldCornersで対象の端のワールド座標を取得し、その座標から中心点のワールド座標を導きます。 その後に、WorldToScreenPointでCanvasで設定されているカメラと対象の中心点のワールド座標からスクリーン座標を導きます。 最後にScreenPointToLocalPointInRectangleでUnmaskのキャンバスとキャンバスに設定しているカメラから対象のスクリーン座標をローカル座標に変換して完了です。
取得した座標をUnmaskのlocalPositionに設定すれば対象だけが逆マスク出来ます。
以下は作成した位置取得の関数です。 canvasはUnmaskのCanvasとなります。
public Vector3 GetPos(RectTransform targetrect)
{
Canvas targetCanvas = null;
Transform targetParent = targetrect.transform;
while (targetCanvas == null && targetrect.parent != null)
{
targetCanvas = targetParent.GetComponent<Canvas>();
targetParent = targetParent.parent;
}
Vector3[] vec = new Vector3[4];
targetrect.GetWorldCorners(vec);
Vector3 targetWorldPos = new Vector3((vec[0].x + vec[2].x) / 2, (vec[0].y + vec[2].y) / 2, (vec[0].z + vec[2].z) / 2);
Vector2 vector = Vector2.zero;
var targetPos = RectTransformUtility.WorldToScreenPoint(targetCanvas.worldCamera, targetWorldPos);
RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.GetComponent<RectTransform>(), targetPos, canvas.worldCamera, out vector);
return vector;
}
以上 山中がお伝えしました。またお会いしましょう!
コメントはありません。