コード例 #1
0
    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();
            }
        }
    }
コード例 #2
0
    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);
    }
コード例 #3
0
    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);
    }