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

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

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

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

Unity

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

Q&A

0回答

314閲覧

複数のobjectが持つ値から条件式を満たすものを探し、それによって違うobjectを表示させる

maskenzy

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2021/02/05 19:29

編集2021/02/06 13:00

前提・実現したいこと

Unityの空間で車椅子のモデルを動かし、自分の進んでいる走行経路に、あらかじめスクリプトで動きを設定した歩行者のモデルを歩かせ、一度に複数の歩行者とすれ違う状況を作っています。
一回のすれ違いにおいて各歩行者側が、車椅子との距離を計算しています。車椅子との距離に閾値を設定し、閾値を下回った歩行者の数だけ、警告灯を表示させたいと考えています。警告灯を表示する位置は該当する歩行者の方向に設定したいです。
具体的な例は以下のようなものです。

①歩行者1が右前方45°から、歩行者2が左前方60°から歩いてくる。
②距離の閾値を2と設定する。
③歩行者1、歩行者2ともに車椅子から距離2以内のところに来る。
④自分の前に警告灯が2つ表示される。
⑤また、表示される位置を右前方45°と左前方60°にしたい。

最終的に実現したいこと:
複数表示された場合に、進入角度が一番大きいもののみを選択して表示させる機能も想定しています。

スクリプトに関する説明は以下の通りです。
1.pedestrianは歩行者のオブジェクト(複数ある)で、各オブジェクトで距離と進入角度を計算させています。

2.swichは 距離や進入角度を計算するスクリプトで、各pedestrianについています。距離が閾値以下になると警告灯を起動させることを意図しています。

3.Sphereは光らせたい素子のオブジェクトで、車椅子の子オブジェクトです。まずは 距離が閾値以下の歩行者をすべて提示する設定を考えているので、複数あります。

4.ControlScriptは人にいただいたスクリプトで、複数のpedestrianと複数のShpereを統合して管理して、SphereRotateを呼び出して起動させるためのスクリプトであると認知しています。各Sphereについています。

  1. SphereRotateも人にいただいたスクリプトで、 Sphereの色や回転を させるためのスクリプトであると認知しています。各Sphereについています。

swichではpedestrianの区別をできるようにInspectorからIindexを変えられるようにしたつもりです。実行はできますがどんな閾値に設定してもSphereが光りません。

6.swichiでほかのオブジェクトの関数の呼び出し方を修正したところうまくいきました。

発生している問題・エラーメッセージ

まずは一人の歩行者とすれ違うように歩行者の動きを設定しましたが、一人の時ですら警告灯が表示されません。実行はできています。

エラーメッセージ

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class swich : MonoBehaviour 6{ 7 8 GameObject pm; 9 Vector3 lastPos_w; 10 Vector3 lastPos_p; 11 Vector3 vel_w; 12 Vector3 vel_p; 13 [Header("値を入力")] 14 [Space(5), Tooltip("何人目の歩行者の値であるか")] public int pedIndex; 15 [Space(5), Tooltip("警告灯を起動する閾値")] public float thresholdOfDistance; 16 [Header("値を観測")] 17 [Space(5), Tooltip("電動車椅子との距離")] public float d_r; 18 [Space(5), Tooltip("電動車椅子との角度")] public float RelativeAngle; 19 [Space(5), Tooltip("すれ違い発生点")] public Vector3 CrossingPoint; 20 21 22 public ControlSphere cs; //ControlSphereを呼び出す 23 24 25 // Start is called before the first frame update 26 void Start() 27 { 28 pm = GameObject.Find("Wheelchair_High");//車椅子 29 } 30 31 void Update() 32 { 33 float x_w = pm.transform.position.x; 34 float z_w = pm.transform.position.z; 35 float x_p = this.transform.position.x; 36 float z_p = this.transform.position.z; 37 38 vel_w = ((pm.transform.position - lastPos_w) / Time.deltaTime); 39 lastPos_w = pm.transform.position; 40 //(フレーム間の移動距離)÷(フレーム間の時間)で車椅子の速度求めた 41 42 vel_p = ((this.transform.position - lastPos_p) / Time.deltaTime); 43 lastPos_p = this.transform.position; 44 //(フレーム間の移動距離)÷(フレーム間の時間)で歩行者の速度求めた 45 46 float s_w = vel_w.x; 47 float u_w = vel_w.z; 48 float s_p = vel_p.x; 49 float u_p = vel_p.z; 50 51 float a = x_w - x_p; 52 float b = z_w - z_p; 53 float c = s_w - s_p; 54 float d = u_w - u_p; 55 float e = s_p * u_w - s_w * u_p; 56 float f = x_w * u_w - z_w * s_w; 57 float g = x_p * u_p - z_p * s_p; 58 59 60 Vector3 pos_rel = lastPos_w - lastPos_p; 61 RelativeAngle = Vector3.Angle(vel_w, vel_p); 62 d_r = pos_rel.magnitude; 63 64 65 if (t_w > 0 && t_p > 0) //すれ違い前 66 { 67 CrossingPoint.x = (f * s_p - g * s_w) / e; 68 CrossingPoint.z = (f * u_p - g * u_w) / e; 69 //ベクトルの計算で求まる衝突想定点の座標 70 71 72 if (d_r < thresholdOfDistance) //距離がこのスクリプトで決めた閾値以下となれば 73 { 74 cs.pedestrianLightState[pedIndex].isVisible = true; 75 cs.pedestrianLightState[pedIndex].color = Color.red; 76 77 } 78 } 79 80 } 81 82 83}

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class swichNew : MonoBehaviour 6{ 7 8 GameObject pm; 9 Vector3 lastPos_w; 10 Vector3 lastPos_p; 11 Vector3 vel_w; 12 Vector3 vel_p; 13 [Header("値を入力")] 14 [Space(5), Tooltip("何人目の歩行者の値であるか")] public int pedIndex; 15 [Space(5), Tooltip("警告灯を起動する閾値")] public float thresholdOfDistance; 16 [Header("値を観測")] 17 [Space(5), Tooltip("電動車椅子との距離")] public float d_r; 18 [Space(5), Tooltip("電動車椅子との角度")] public float RelativeAngle; 19 [Space(5), Tooltip("すれ違い発生点")] public Vector3 CrossingPoint; 20 21 GameObject refObj;//修正箇所 22 SphereRotate startScript; 23 24 // Start is called before the first frame update 25 void Start() 26 { 27 pm = GameObject.Find("Wheelchair_High");//車椅子 28 refObj = GameObject.Find("Sphere");//修正箇所 29 startScript = refObj.GetComponent<SphereRotate>();//修正箇所 30 } 31 32 void Update() 33 { 34 float x_w = pm.transform.position.x; 35 float z_w = pm.transform.position.z; 36 float x_p = this.transform.position.x; 37 float z_p = this.transform.position.z; 38 39 vel_w = ((pm.transform.position - lastPos_w) / Time.deltaTime); 40 lastPos_w = pm.transform.position; 41 //(フレーム間の移動距離)÷(フレーム間の時間)で車椅子の速度求めた 42 43 vel_p = ((this.transform.position - lastPos_p) / Time.deltaTime); 44 lastPos_p = this.transform.position; 45 //(フレーム間の移動距離)÷(フレーム間の時間)で歩行者の速度求めた 46 47 float s_w = vel_w.x; 48 float u_w = vel_w.z; 49 float s_p = vel_p.x; 50 float u_p = vel_p.z; 51 52 float a = x_w - x_p; 53 float b = z_w - z_p; 54 float c = s_w - s_p; 55 float d = u_w - u_p; 56 float e = s_p * u_w - s_w * u_p; 57 float f = x_w * u_w - z_w * s_w; 58 float g = x_p * u_p - z_p * s_p; 59 60 61 Vector3 pos_rel = lastPos_w - lastPos_p; 62 RelativeAngle = Vector3.Angle(vel_w, vel_p); 63 d_r = pos_rel.magnitude; 64 65 66 if (t_w > 0 && t_p > 0) //すれ違い前 67 { 68 CrossingPoint.x = (f * s_p - g * s_w) / e; 69 CrossingPoint.z = (f * u_p - g * u_w) / e; 70 //ベクトルの計算で求まる衝突想定点の座標 71 } 72 73//ここから先で警告灯起動 74 75 if (d_r < thresholdOfDistance) //距離がこのスクリプトで決めた閾値以下となれば 76 { 77          //修正箇所 78 startScript.pedestrianLightState[pedIndex].isVisible = true; 79 startScript.pedestrianLightState[pedIndex].color = Color.red; 80 81 } 82 } 83 84 85}

試したこと

閾値の条件を緩くしても表示されませんでした。
配列を使うことに慣れていないので、配列の周辺が怪しいです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

Zuishin

2021/02/06 01:55

条件を満たすかどうかと、光るかどうかを別に試しましょう。一度にダーッと作って動かそうとしても、一カ所の間違いで全体が動きません。部品を作って組み合わせるようにします。 条件それぞれについて、それを満たせば debug.log で何を満たしたのかを表示してください。そうすればどの条件が満たされていないのかがわかります。 また、条件関係なくユーザーの入力で光らせてください。そうすれば本当に光るのかがわかります。
maskenzy

2021/02/06 12:50

ご指摘ありがとうございます。ご指摘を参考に確認したところうまくいきました。
Zuishin

2021/02/06 12:55

解決できたなら解決した方法を回答して、それをベストアンサーに選んでください。
Zuishin

2021/02/06 13:01

質問を編集するのではなく、自分で回答してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問