void emitPeople()
    {
        int        gender = rand.Next(2);
        int        age    = rand.Next(3, 30);
        int        idx    = gender * 2 + (age < 15 ? 1 : 0);
        GameObject go     = GameObject.Instantiate(models[idx], pos, Quaternion.identity) as GameObject;

        go.SetActive(true);

        go.name = "People" + RandomWalkPeople.NextID;

        RandomWalkPeople walker = go.GetComponent <RandomWalkPeople>();

        walker.init(pos, r0 * 100f, r1 * 100f, r2 * 100f, input);
        walker.attr(gender, age, (age < 15 ? 1 : 0), Time.realtimeSinceStartup + peopleStayTimeBase + rand.NextDouble() * peopleStayTimeRange);

        go.transform.position = walker.getTarget(1);
        walker.setTarget(walker.getTarget(1));
        people.Add(walker);
    }
    public void UpdateInfo()
    {
        updateInfoTime   += Time.deltaTime;
        updatePeopleTime += Time.deltaTime;

        if (updatePeopleTime > updatePeopleInterval)
        {
            updatePeopleTime = 0;
            float now = Time.realtimeSinceStartup;

            people.RemoveAll(p => {
                if (p.lifeEndTime < now)
                {
                    p.leave();
                }
                return(p.lifeEndTime < now);
            });

            for (int i = 0; i < peopleEmitCount; i++)
            {
                emitPeople();
            }

            while (people.Count > peopleCountMax)
            {
                RandomWalkPeople p = people.ElementAt(0);
                people.RemoveAt(0);
                p.leave();
            }

            while (people.Count < peopleCountMin)
            {
                emitPeople();
            }
        }

        if (updateInfoTime > updateInfoInterval)
        {
            updateInfoTime = 0;

            int total    = 0;
            int male     = 0;
            int age      = 0;
            int children = 0;

            Vector3 dir = new Vector3();
            foreach (RandomWalkPeople p in people)
            {
                if (!p.visible())
                {
                    continue;
                }
                total++;
                dir      += Vector3.Normalize(p.transform.position - pos);
                male     += p.gender;
                age      += p.age;
                children += p.children;
            }

            dir = Vector3.Normalize(dir);

            input.OnCrowdInfo(null);
            input.OnCrowdInfoSummry(new CrowdInfoSummry()
            {
                total          = total,
                ageAverage     = (float)age / total,
                genderRatio    = (float)male / total,
                childrenRatio  = (float)children / total,
                crowdDirection = dir,
            });

            arrow.position = pos + dir * r0 * 100f;
        }
    }