AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

交通信号を追加してみる

 結構、信号機ってややこしい。
 コライダーを信号機のある場所に設置して、○秒で赤と青(車にとって)を切り替える。
 コライダーに接触し、かつ赤信号機の方を向いているなら、車は停車
 コライダーに接触し、かつ赤信号機の方を向いているなら、人は進む(車用の信号なので逆)
 信号機の方を向いているを追加しないと、渡ってる途中で信号が赤になったら止まってしまう(*´ω`*) 何度もひかれましたw

 ゾンビみたいに足が遅いと、渡ってる途中に信号が変わって車によくひかれやすいです。
 車は信号だけじゃなく、歩行者も見るようにするのは次の課題で。
 実際、GTAなんかだと道路に飛び出したらちゃんと車が避けようとしますしね。NPCは行儀が良いので道路に飛び出しませんが。

 車が信号しか見てないのでひかれるときはひかれます。ひかれたらRagdollに変わります。
f:id:yasu9780:20160927184502g:plain

 信号機は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;
        }
    }

 信号機は単純で時間ごとにコルーチンで自動切り替え。ついでキューブの色を変えてます。
 キューブは小さいですが、コライダーは大きくしてます(小さいと車や人が赤信号に突っ込む)
f:id:yasu9780:20160927185522p:plain

    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);
        }
    }