原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】Linecastを利用して遮蔽物を判定する

f:id:Karvan:20220201213224p:plain

冬季オリンピック

いつの間にか冬季オリンピックが始まっていてビックリしている皆さんこんにちは。ここ最近の報道がコロナ禍一色でそれほどオリンピックの話題が無かったし、個人的にはブレスオブザワイルドの剣の試練にドハマりしていたこともあって全く意識にありませんでした。週末の新聞の一面がオリンピックの話題で埋まっていてビックリ。

 

表か裏か

現在開発を進めている3D脱出ゲームにて、プレイヤーの視点の先にあるアイテムについて説明文を表示するという機能を作成しました。

f:id:Karvan:20220208194516p:plain

 

仕組みとしては簡単で、まずアイテム側にプレイヤーの視点を検知する為のColliderを取り付けて、

f:id:Karvan:20220208194615p:plain

このCollider内にプレイヤー側の視点(camera)の視界を表すCollider(下の図の青いBoxの部分)が接触(OnTriggerEnter)したら説明文を表示するという仕組みですが、

f:id:Karvan:20220208194657p:plain

例えば上図のPCモニターのようにアイテムに表と裏がある場合、プレイヤーがPCモニターの裏面側に回ったとしてもColliderの接触判定は有効なので説明文が表示されてしまいます

f:id:Karvan:20220208194749p:plain

 

なので、この問題を回避するためにLinecastを利用してプレイヤーが裏側に回った際の遮蔽物を判定するように対応しました。

 

裏側を判定する

まずPCモニターの裏側に、裏側だと判定するためのColliderを設置します。下の図の紫の箇所がそのColliderです。
このColliderには「PlayerRayIsBlocked」のタグが設定してあります。

f:id:Karvan:20220208195445p:plain

 

そして、PCモニター側のOnTriggerEnter内でプレイヤー側の視点Colliderを検知した際、プレイヤーとPCモニターの間に「PlayerRayIsBlocked」のタグが付いたColliderが存在すればプレイヤーは裏側にいると判定することができます。
この「PlayerRayIsBlocked」Colliderの存在有無を判定するためにLinecastを使用します。

 

Linecast

Linecastは始点と終点を設定してそこに線を張り、その範囲内でヒットしたCollider情報を取得する事ができます。
Colliderが複数接触してる時、始点に近いCollider情報を取得できるようです。
こういった手法を取る場合、主にRaycastを使用する事が多いと思いますが、今回のケースでは明確に始点と終点が分かるのでLinecastを使用することにしました。

public void OnTriggerEnter(Collider other)
{
    Vector3 startPos = this.transform.position;
    Vector3 endPos = other.gameObject.transform.position;
    RaycastHit hit;

    if (Physics.Linecast(startPos, endPos, out hit, myLayerMask))
    {
        if (hit.transform.gameObject.CompareTag("PlayerRayIsBlocked"))
        {
            return;
        }
    }
}

上記のソースでは始点(PCモニター)と終点(Player視点)の間にLinecastで線を張り、ヒットしたColldierのタグ名が「PlayerRayIsBlocked」であるかどうか判定しています。

この対応によって

f:id:Karvan:20220206154351g:plain

プレイヤーがPCモニターの裏側にいる場合、説明文は表示されなくなり、表に回ると表示されるようになりました。

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。