protected virtual void ChangeRegion(Region from, Region to) { m_CurrentRegion = to; if (m_RegionSubscription != null) { m_RegionSubscription.Dispose(); } var msg = new EntityRegionChangedMessage(from, to, m_AttachedEntity); if (from != null) { from.EntityRegionChangedChannel.Publish(msg); } if (to != null) { to.EntityRegionChangedChannel.Publish(msg); m_RegionSubscription = new UnsubscriberCollection( //this.EventChannel.Subscribe(this.Fiber, (m) => newRegion.ItemEventChannel.Publish(m)), // route events through region to interest area // region entered interest area fires message to let item notify interest area about enter to.RequestInfoInRegionChannel.Subscribe(m_EntityFiber, (m) => { m.OnEntityEnter(m_AttachedEntity); }), // region exited interest area fires message to let item notify interest area about exit to.RequestRegionExitInfoChannel.Subscribe(m_EntityFiber, (m) => { m.OnEntityExit(m_AttachedEntity); }) ); } }
protected void OnEntityRegionChange(EntityRegionChangedMessage message) { if (message.Entity == m_AttachedEntity) { return; } var r0 = m_Regions.Contains(message.From); var r1 = m_Regions.Contains(message.To); if (r0 && r1) { // do nothing } else if (r0) // item exits area { OnEntityExit(message.Entity); } else if (r1) // item enters area { OnEntityEnter(message.Entity); } }