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