예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
        }
예제 #4
0
        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;
        }