質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

0回答

1370閲覧

日向にいるか日陰にいるかを常に判定したい

SekinoYama

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/09/30 08:55

編集2021/10/01 12:40

前提・実現したいこと

Unityを使って2Dゲームを制作しています。
Light2Dを用いて光と影を描画し、
オブジェクトが「日向にいるか」「日陰にいるか」「両方(一部分だけ日向にいるような状態)」によって
オブジェクトの当たり判定を変更したいです。

状態によって当たり判定を変える部分はできてるのですが
オブジェクトがどの状態なのかを判定することが難しく、質問させていただきました。

試したこと

今実装しているやり方は、
光源の場所から光の出てる範囲内に常にRayを飛ばして、
当たったオブジェクトのスクリプトの変数を変えてオブジェクトの状態を変更する方法です。
しかしこの方法だと、
オブジェクト側で変数のリセットをしてあげないと一回当たるとずっと当たった判定になってしまいます。
更新スピードが速すぎても遅すぎても想定とは違った挙動になってしまうので更新するタイミングが分からないのと、大量に飛ばすため高負荷であるとご指摘もあったのであまり適していないのかもしれません。

何か他にいい方法があれば教えて欲しいです。
よろしくお願いします。

書いたコード

Ray側のコードです。
以下の処理を角度を変えながらずっとRayを飛ばしてしてます
オブジェクト側には
日向にいる判定をする変数onLightRayと日陰にいる判定をする変数onShadowRayがあります

bool hasTouchedBlock = false;//オブジェクトに当たったかどうかを記録する変数

//Rayに当たったオブジェクを全部見ていく
foreach(RaycastHit2D hit in Physics2D.RaycastAll(transform.position, vec, rayLength, layerMask))
{
//オブジェクトに当たった時
if(hit.collider.gameObject.transform.parent.gameObject.GetComponent<BlockObject>())
{
//当たったオブジェクトのコンポーネントを取得
BlockObject blockObject = hit.collider.gameObject.transform.parent.gameObject.GetComponent<BlockObject>();

//既に何かしらのオブジェクトに当たった後(既に当たってるってことは影の部分) if(hasTouchedBlock) { blockObject.onLightRay = true; } //初めてオブジェクトに当たった。(初めてってことは日向の部分) else { blockObject.onLightRay = true; this.hasTouchedBlock = true; } }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bboydaisuke

2021/09/30 13:36

とりあえずなんか書いてそれを提示した方がいいと思います。書いているやり方はまず普通は取らない方法です。特に「Rayを広範囲に常時大量に飛ばして」というのはやりません。そんなことをしたら負荷が高いし、コライダーや Physics2D の Overwrap 系のメソッドを使って軽い負荷で手間をかけずに作ります。
SekinoYama

2021/10/01 12:41

ご回答ありがとうございます。 確かに説明不足な部分もありましたので質問を編集しました。
bboydaisuke

2021/10/02 03:40

編集された質問を見て単純に説明が大変と思いました。何を「日向にいるか日陰にいるか」判定したいのかわかりません(つまり、「主語」がない)が、「それ」の当たり判定が仮にサークルなら、「日陰を PolygonCollider2D で生成して、"それ" と各頂点の距離を計算することで "一部" が判定できるかもね」と思いましたが、PolygonCollider2D って何?とか、どうやって日陰を生成するの?とかいう質問をされてしまうと、はるか遠い道のりをずっと一緒に案内してあげたくはないな、と思っちゃうので、コメントもしづらいですね。 仕様としては「それってゲームエンジンでさっと作れるものじゃないんだけど、それをやったらどれだけゲームが面白くなるの?」と聞いて議論するような話ですね。 初心者だったら、以下の「自分に出来ることを使う」を読んで欲しいと思います。 https://tsubakit1.hateblo.jp/entry/2018/07/30/223410#%E8%87%AA%E5%88%86%E3%81%AB%E5%87%BA%E6%9D%A5%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E4%BD%BF%E3%81%86
SekinoYama

2021/10/02 06:26

ご回答ありがとうございます 確かに主語がありませんでしたね笑 すみません。 ここで言うオブジェクトは四角いブロックになります。 正方形もあれば長方形もある感じです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問