protected void SendAllCollAndTriggerCallbacks(CollisionAndTriggerInfoBundle collAndTriggerData) { // send all trigger callbacks foreach (TriggerEnterData triggerEnterData in collAndTriggerData.eventBasedInteractions.triggerEnterData) { if (triggerEnterData.myEventData.callback != null) { triggerEnterData.myEventData.callback(triggerEnterData, collAndTriggerData); triggerEnterData.SetAsProcessed(); } } foreach (TriggerStayExitData triggerStayData in collAndTriggerData.eventBasedInteractions.triggerStayData) { if (triggerStayData.myEventData.callback != null) { triggerStayData.myEventData.callback(triggerStayData, collAndTriggerData); triggerStayData.SetAsProcessed(); } } foreach (TriggerStayExitData triggerExitData in collAndTriggerData.eventBasedInteractions.triggerExitData) { if (triggerExitData.myEventData.callback != null) { triggerExitData.myEventData.callback(triggerExitData, collAndTriggerData); triggerExitData.SetAsProcessed(); } } // send all collision callbacks foreach (CollisionEnterData collEnterData in collAndTriggerData.eventBasedInteractions.collisionEnterData) { if (collEnterData.myEventData.callback != null) { collEnterData.myEventData.callback(collEnterData, collAndTriggerData); collEnterData.SetAsProcessed(); } } foreach (CollisionData collStayData in collAndTriggerData.eventBasedInteractions.collisionStayData) { if (collStayData.myEventData.callback != null) { collStayData.myEventData.callback(collStayData, collAndTriggerData); collStayData.SetAsProcessed(); } } foreach (CollisionData collExitData in collAndTriggerData.eventBasedInteractions.collisionExitData) { if (collExitData.myEventData.callback != null) { collExitData.myEventData.callback(collExitData, collAndTriggerData); collExitData.SetAsProcessed(); } } }
private void SaveDataHelper <I, D, E>(InteractionController interactionCont1, InteractionController interactionCont2, I internalData, D myBundle, D theirBundle, AddEventTypeToInfoBundleFcn <I, D, E> addInfoFcn) where E : EventData <I, D>, new() { if (interactionCont1 == null || interactionCont2 == null) { return; } E data = new E(); data.Init(internalData, myBundle, theirBundle); CollisionAndTriggerInfoBundle collisionTriggerInfoBundle = null; if (!allCollisionAndTriggerInfo.TryGetValue(interactionCont1.gameObject.GetInstanceID(), out collisionTriggerInfoBundle)) { // if info for the object doesn't exist, create it collisionTriggerInfoBundle = new CollisionAndTriggerInfoBundle(interactionCont1); allCollisionAndTriggerInfo.Add(interactionCont1.gameObject.GetInstanceID(), collisionTriggerInfoBundle); } // add collision enter info the object paired with the interaction controller it interacted with CollisionAndTriggerInfo collisionTriggerInfo = null; if (!collisionTriggerInfoBundle.objBasedInteractionsDict.TryGetValue(interactionCont2, out collisionTriggerInfo)) { // if collision info doesn't exist yet add it collisionTriggerInfo = new CollisionAndTriggerInfo(); addInfoFcn(collisionTriggerInfo, data); collisionTriggerInfoBundle.objBasedInteractionsDict.Add(interactionCont2, collisionTriggerInfo); } else { addInfoFcn(collisionTriggerInfo, data); } // save interaction just based on type also addInfoFcn(collisionTriggerInfoBundle.eventBasedInteractions, data); }
public virtual void OnCollisionAndTriggerEvents(CollisionAndTriggerInfoBundle collAndTriggerData) { // send ship max info about collisions foreach (KeyValuePair <InteractionController, CollisionAndTriggerInfo> objInteractions in collAndTriggerData.objBasedInteractionsDict) { float myMaxCollMomentum = 0.0f; Vector2 impactPoint = new Vector2(); if (!objInteractions.Key.SupportsInteraction(INTERACTION.COLL_IS_STATIC)) { // iterate over collisions to determine strongest point of impact and collision momentum regarding both objects if (objInteractions.Value.collisionEnterData.Count > 0) { // both colliders have rbody if (!SupportsInteraction(INTERACTION.COLL_IS_STATIC) && rbodyCollListeners.Count > 0) { float theirMaxCollMomentum = 0.0f; float maxTotalMomentum = 0.0f; CollisionEnterData strongestColl = null; foreach (CollisionEnterData collEnterData in objInteractions.Value.collisionEnterData) { if (collEnterData.myEventData.collision.contacts.Length == 0) { continue; } if (collEnterData.myEventData.collMomentum > myMaxCollMomentum) { myMaxCollMomentum = collEnterData.myEventData.collMomentum; } if (collEnterData.theirEventData.collMomentum > theirMaxCollMomentum) { theirMaxCollMomentum = collEnterData.theirEventData.collMomentum; } float totalMomentum = collEnterData.GetTotalMomentum(); if (totalMomentum > maxTotalMomentum) { strongestColl = collEnterData; maxTotalMomentum = totalMomentum; impactPoint = collEnterData.myEventData.collision.contacts[0].point; } } if (strongestColl != null) { //strongestColl = objInteractions.Value.collisionEnterData[0]; //impactPoint = strongestColl.myEventData.collision.contacts[0].point; foreach (IRbodyCollisions rbodyCollListener in rbodyCollListeners) { rbodyCollListener.NonStaticColl(strongestColl, objInteractions.Key, myMaxCollMomentum, theirMaxCollMomentum, impactPoint, collAndTriggerData); } } } else { // im static, they have rbody if (objInteractions.Value.collisionEnterData.Count > 0 && staticCollListeners.Count > 0) { CollisionEnterData strongestColl = null; float theirMaxCollMomentum = 0.0f; foreach (CollisionEnterData collEnterData in objInteractions.Value.collisionEnterData) { if (collEnterData.myEventData.collision.contacts.Length == 0) { continue; } if (collEnterData.theirEventData.collMomentum > theirMaxCollMomentum) { strongestColl = collEnterData; theirMaxCollMomentum = collEnterData.theirEventData.collMomentum; impactPoint = collEnterData.theirEventData.collision.contacts[0].point; } } if (strongestColl != null) { //strongestColl = objInteractions.Value.collisionEnterData[0]; //impactPoint = strongestColl.theirEventData.collision.contacts[0].point; foreach (IStaticCollisions staticCollListener in staticCollListeners) { staticCollListener.Collision(strongestColl, objInteractions.Key, theirMaxCollMomentum, impactPoint, collAndTriggerData); } } } } } } else { // their collision is static, so I have rbody // iterate over collisions to determine strongest point of impact and collision momentum regarding only your object if (objInteractions.Value.collisionEnterData.Count > 0 && rbodyCollListeners.Count > 0) { CollisionEnterData strongestColl = null; foreach (CollisionEnterData collEnterData in objInteractions.Value.collisionEnterData) { if (collEnterData.myEventData.collision.contacts.Length == 0) { continue; } if (collEnterData.myEventData.collMomentum > myMaxCollMomentum) { strongestColl = collEnterData; myMaxCollMomentum = collEnterData.myEventData.collMomentum; impactPoint = collEnterData.myEventData.collision.contacts[0].point; } } if (strongestColl != null) { //strongestColl = objInteractions.Value.collisionEnterData[0]; //impactPoint = strongestColl.myEventData.collision.contacts[0].point; foreach (IRbodyCollisions rbodyCollListener in rbodyCollListeners) { rbodyCollListener.StaticColl(strongestColl, objInteractions.Key, myMaxCollMomentum, impactPoint, collAndTriggerData); } } } } } SendAllCollAndTriggerCallbacks(collAndTriggerData); }