/** * 自身を目的地とされた場合、移動者に対して指示を出します。 * 外にいる場合、自身まで移動させます。到着した場合、入場列に並ばせます。 * プラットフォームから出たい移動者は _step() で処理します (改札数のキャパシティ制約を受けるため) */ public override void Handle(Human subject) { // コンコースに入ったが、目的地が変わり出場することになった if (parent.Concourse.Contains(subject)) { parent.Concourse.Remove(subject); parent.OutQueue.AddLast(subject); subject.State = Human.StateType.WAIT_EXIT_GATE; return; } // 待機列にいるならば人を待たせる if (parent.OutQueue.Contains(subject) || parent.InQueue.Contains(subject)) { return; } // 地面を歩いているならば、自身に向かって移動させる if (subject.Seek(parent.transform.position)) { // 到着したならば、入場待機列に移動させる parent.InQueue.AddLast(subject); listener.Fire(EventType.MODIFIED, parent.BelongsTo); subject.State = Human.StateType.WAIT_ENTER_GATE; } else { subject.State = Human.StateType.MOVE; } }
protected bool TryRide() { // 満員 if (train.Passengers.Count >= train.Capacity) { return(false); } while (InQueue.Count > 0) { var h = InQueue.First.Value; InQueue.RemoveFirst(); if (h.Next == org) { // ホームの利用客を電車に乗せる h.Complete(); h.State = Human.StateType.ON_TRAIN; org.Queue.Remove(h); h.OnDeptTask = null; h.Ride(org); train.Passengers.Add(h); // 電車が満員になったら通知 if (train.Passengers.Count == train.Capacity) { listener.Fire(EventType.MODIFIED, train); } wait += 1 / train.Mobility; listener.Fire(EventType.RIDDEN, train); return(true); } // 上記が else になるのは、発車待ち時に経路が変わったとき。 // このとき Platform が Human#deptTask を参照しキューの入れ替えを行っている // そのためここでは 何もしない } return(false); }
public Station NewInstance(Vector3 initPos) { var obj = Instantiate(template); obj.isTemplate = false; obj.GetComponent <SpriteRenderer>().enabled = true; obj.transform.position = initPos; obj.Under = factory.NewGate(obj); listener.Fire(EventType.CREATED, obj); return(obj); }
public RailNode NewInstance(Vector3 pos) { var obj = Instantiate(template); obj.isTemplate = false; obj.transform.position = pos; if (IsView) { obj.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f); obj.GetComponent <MeshRenderer>().enabled = true; obj.GetComponent <MeshRenderer>().material.color = Color.green; } listener.Fire(EventType.CREATED, obj); return(obj); }
public RailLine(ModelStorage db, ModelListener lis) { storage = db; listener = lis; storage.Add(this); listener.Fire(EventType.CREATED, this); }
private void Start() { if (isTemplate) { listener.Add <RailEdge>(EventType.CREATED, re => storage.Add(re)); listener.Add <RailEdge>(EventType.DELETED, re => storage.Remove(re)); } else { listener.Add <RailEdge>(EventType.MODIFIED, this, (_) => { listener.Fire(EventType.MODIFIED, ForwardPart); listener.Fire(EventType.MODIFIED, BackPart); }); } }
public virtual void Remove() { storage.Remove(this); listener.Fire(EventType.DELETED, this); }
public void fire() { listener.Fire(EventType.CREATED, this); }
public void Remove() { storage.Remove(this); listener.Fire <RailLine>(EventType.DELETED, this); }
public void Remove() { listener.Fire(EventType.DELETED, this); Destroy(gameObject); }