前提・実現したいこと
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についています。
- 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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー