結構、信号機ってややこしい。
コライダーを信号機のある場所に設置して、○秒で赤と青(車にとって)を切り替える。
コライダーに接触し、かつ赤信号機の方を向いているなら、車は停車
コライダーに接触し、かつ赤信号機の方を向いているなら、人は進む(車用の信号なので逆)
信号機の方を向いているを追加しないと、渡ってる途中で信号が赤になったら止まってしまう(*´ω`*) 何度もひかれましたw
ゾンビみたいに足が遅いと、渡ってる途中に信号が変わって車によくひかれやすいです。
車は信号だけじゃなく、歩行者も見るようにするのは次の課題で。
実際、GTAなんかだと道路に飛び出したらちゃんと車が避けようとしますしね。NPCは行儀が良いので道路に飛び出しませんが。
車が信号しか見てないのでひかれるときはひかれます。ひかれたらRagdollに変わります。
信号機はEnterとStayで接触を見ています。Stayだけだと反応が悪いので。内積で信号機の方を向いているか判断(これから渡るかどうか)
信号が赤なのか青なのかをpublic変数signalで受け取ります。
void OnTriggerStay(Collider other) { if (other.name == "Traffic Light") { float weight = Vector3.Dot(transform.forward,other.transform.position - transform.position); if (weight > 0) SignalStop = other.GetComponent<Traffic>().signal; else SignalStop = true; } }
信号機は単純で時間ごとにコルーチンで自動切り替え。ついでキューブの色を変えてます。
キューブは小さいですが、コライダーは大きくしてます(小さいと車や人が赤信号に突っ込む)
void Start () { Coroutine retC = StartCoroutine(Change(interval )); } private IEnumerator Change(float interval) { for (;;) { if (signal == true) { this.renderer.material.color = Color.blue; signal = false; Debug.Log("blue signal"); } else { this.renderer.material.color = Color.red; signal = true; Debug.Log("red signal"); } yield return new WaitForSeconds(interval); } }