private void OnCollisionEnded(EventData_Collision eventData) { CleanCurrentCollisions(); bool areaOneIsThis = eventData.ColliderOne.MyArea.InstanceID == this.InstanceID; bool colOneIsInArea = _areaColliders.Contains(eventData.ColliderOne); bool colTwoIsInArea = _areaColliders.Contains(eventData.ColliderTwo); if (!IsValidCollision(colOneIsInArea, colTwoIsInArea)) { return; } CollisionArea thisArea = this; CollisionArea hittingArea = areaOneIsThis ? eventData.ColliderTwo.MyArea : eventData.ColliderOne.MyArea; Collider hitCollider = colOneIsInArea ? eventData.ColliderOne : eventData.ColliderTwo; Collider hittingCollider = colOneIsInArea ? eventData.ColliderTwo : eventData.ColliderOne; _currentCollisions.Remove(hittingCollider); bool isLastCollider = !_currentCollisions.Contains(hittingCollider); if (isLastCollider || !collidersOnlyExitOnLast) { SendCollisionAreaEnded(thisArea, hittingArea, hitCollider, hittingCollider); } }
public void UnregisterCollider() { EventData_Collision theData = new EventData_Collision(); theData.ColliderOne = this; GameManager.Events.Broadcast <EventType_Collision> ((int)EventType_Collision.UnregisterCollider, theData); }
private void OnRegisterCollider(EventData_Collision theData) { if (processor == null) { #if UNITY_EDITOR Debug.LogError("GameSystem_CollisionProcessor attempted collider registration but the CollisionProcessor is null."); #endif return; } processor.RegisterCollider(theData.ColliderOne); }
private void SendCollisionAreaEnded(CollisionArea thisArea, CollisionArea hittingArea, Collider hitCollider, Collider hittingCollider) { #if DebugExit DebugLog.Simple("<color=red>Collision Ended</color>\r\nCol One: ", ourCollider, "Col Two: ", hittingCollider); #endif EventData_Collision eventData = new EventData_Collision(); eventData.HitArea = thisArea; eventData.HittingArea = hittingArea; eventData.HitCollider = hitCollider; eventData.HittingCollider = hittingCollider; GameManager.Events.Broadcast <EventType_Collision> ((int)EventType_Collision.AreaCollisionEnded, eventData); }
public override void SystemUpdate() { List <CollisionDetails> details = processor.FindCollisionDetails(); for (int i = 0; i < details.Count; i++) { EventData_Collision theData = new EventData_Collision(); theData.ColliderOne = details[i].colOne; theData.ColliderTwo = details[i].colTwo; if (_lastDetails.Contains(details[i])) { #if DebugContinued DebugLog.Simple("Collision Continued\r\nCol One: ", details[i].colOne.name, "Col Two: ", details[i].colTwo.name); #endif GameManager.Events.Broadcast <EventType_Collision> ((int)EventType_Collision.CollisionContinued, theData); // Remove from _lastDetails so next area can go over the remaining ones and declare them ended _lastDetails.Remove(details[i]); } else { #if DebugBegan DebugLog.Simple("<color=green>Collision Began</color>\r\nCol One: ", details[i].colOne.name, "Col Two: ", details[i].colTwo.name); #endif GameManager.Events.Broadcast <EventType_Collision> ((int)EventType_Collision.CollisionBegan, theData); } } // In previous area any matching collisions were removed from _lastDetails. // So the remaining members were in collisions last frame but not this one, and have ended. for (int i = 0; i < _lastDetails.Count; i++) { EventData_Collision theData = new EventData_Collision(); theData.ColliderOne = _lastDetails[i].colOne; theData.ColliderTwo = _lastDetails[i].colTwo; #if DebugEnded DebugLog.Simple("<color=red>Collision Ended</color>\r\nCol One: ", _lastDetails[i].colOne.name, "Col Two: ", _lastDetails[i].colTwo.name); #endif GameManager.Events.Broadcast <EventType_Collision> ((int)EventType_Collision.CollisionEnded, theData); } _lastDetails = details; }