Exemple #1
0
 public PhysicsObject(Rigidbody rigidbody, Collider[] colliders, PhysicsLayer layer)
 {
     Rigidbody    = rigidbody;
     Colliders    = colliders;
     PhysicsLayer = layer;
     GameObject   = rigidbody.gameObject;
 }
 void OnValidate()
 {
     if (PhysicsLayer == null)
     {
         PhysicsLayer = PhysicsLayer.GetLayer(Layer.Object);
     }
 }
Exemple #3
0
        /// <summary>
        ///     Process the collision between objects and check if it should be ignored
        /// </summary>
        /// <param name="objectCollider"></param>
        /// <param name="collision"></param>
        public bool ProcessCollision(Collider objectCollider, Collision collision)
        {
            PhysicsLayer otherLayer;

            if (!_physicsObjects.ContainsKey(collision.transform))
            {
                otherLayer = PhysicsLayer.GetLayer(Layer.UnityDefault);
            }
            else
            {
                otherLayer = _physicsObjects[collision.transform].PhysicsLayer;
            }

            PhysicsObject physicsObject = null;

            if (GetPhysicsObject(objectCollider.gameObject, out physicsObject))
            {
                if (physicsObject.PhysicsLayer == null)
                {
                    physicsObject.PhysicsLayer = PhysicsLayer.GetLayer(Layer.UnityDefault);
                    Debug.LogWarning("PhysicsLayer not assigned. UnityDefault layer automatically inserted instead.");
                }
                if (!physicsObject.PhysicsLayer.CanCollideWith(otherLayer))
                {
                    Physics.IgnoreCollision(objectCollider, collision.collider, true);
                    return(false);
                }
            }
            return(true);
        }
Exemple #4
0
        //public void ResetPreferenceSuggestions()
        //{
        //    PhysicsPreferences.ShouldPromptGravitySettings = true;
        //    PhysicsPreferences.ShouldPromptDefaultSolverIterations = true;
        //    PhysicsPreferences.ShouldPromptDefaultSolverVelocityIterations = true;
        //    PhysicsPreferences.ShouldPromptFixedTimestep = true;
        //}

        IEnumerator RegisterNonPhysicsObjects()
        {
            var sceneColliders = GameObject.FindObjectsOfType <Collider>();

            yield return(null);

            List <Collider> physicsobjectColliders = new List <Collider>();

            foreach (var pObject in _physicsObjects.Values)
            {
                physicsobjectColliders.AddRange(pObject.Colliders);
            }
            sceneColliders = sceneColliders.Except(physicsobjectColliders).Where(coll => coll != null && !coll.isTrigger).ToArray();
            var defaultLayer = PhysicsLayer.GetLayer(Layer.UnityDefault);

            IgnoreCollidersCollisionOnLayers(sceneColliders, defaultLayer.DisallowedCollisions);
        }
        // Use this for initialization
        void Awake()
        {
            Rigidbody = gameObject.GetComponent <Rigidbody>();
            if (Rigidbody == null)
            {
                Rigidbody = gameObject.AddComponent <Rigidbody>();
            }

            Rigidbody.collisionDetectionMode = CollisionDetectionMode.Discrete;
            Rigidbody.useGravity             = false;
            Detector = gameObject.AddComponent <CollisionDetector>();

            var layer = PhysicsLayer.GetLayer(Layer.Phalange);

            Detector.PhysicsLayers = layer.AllowedCollisions;
            PhysicsManager.Instance.Register(GetComponents <Collider>(), GetComponent <Rigidbody>(), layer);
        }
Exemple #6
0
        /// <summary>
        ///     Register a physics object to the physics manager.
        /// </summary>
        /// <param name="colliders">All of the colliders on the given object</param>
        /// <param name="rigidbody"></param>
        public void Register(Collider[] colliders, Rigidbody rigidbody, PhysicsLayer type)
        {
            if (rigidbody == null)
            {
                Debug.LogError("Rigidbody can not be null");
            }

            if (!_physicsObjects.ContainsKey(rigidbody.transform))
            {
                PhysicsObject pObject = new PhysicsObject(rigidbody, colliders, type);
                _physicsObjects.Add(rigidbody.transform, pObject);

                List <Collider> colliderList;
                if (_layerColliders.TryGetValue(type, out colliderList))
                {
                    colliderList.AddRange(colliders);
                }
            }
            else
            {
                HashSet <Collider> newCollection = new HashSet <Collider>(_physicsObjects[rigidbody.transform].Colliders);
                foreach (var collider1 in colliders)
                {
                    newCollection.Add(collider1);
                }
                _physicsObjects[rigidbody.transform].Colliders = newCollection.ToArray();
            }

            foreach (var collider in colliders)
            {
                RegisterChild(collider.gameObject, rigidbody.gameObject);
            }

            foreach (var coll in colliders.Where(c => !c.isTrigger))
            {
                IgnoreColliderCollisionOnLayers(coll, PhysicsLayer.Layers.Where(layer => !type.AllowedCollisions.Contains(layer)));
            }
        }
Exemple #7
0
 public PhysicsObject[] GetPhysicsObjectsWithLayer(PhysicsLayer physicsLayer)
 {
     return(_physicsObjects.Values.Where(physicsObject => physicsObject.PhysicsLayer == physicsLayer).ToArray());
 }
Exemple #8
0
 public IEnumerable <PhysicsObject> GetTriggerObjectsInLayer(PhysicsLayer layer)
 {
     return(_triggerObjects.Values.Where(pObject => pObject.PhysicsLayer == layer));
 }
Exemple #9
0
 public IEnumerable <PhysicsObject> GetTriggerObjectsInLayer(Layer layer)
 {
     return(GetTriggerObjectsInLayer(PhysicsLayer.GetLayer(layer)));
 }
Exemple #10
0
 public IEnumerable <PhysicsObject> GetCollidingObjectsInLayer(PhysicsLayer layer)
 {
     return(_collidingObjects.Values.Where(pObject => pObject.PhysicsLayer == layer));
 }
Exemple #11
0
 public IEnumerable <PhysicsObject> GetCollidingObjectsInLayer(Layer layer)
 {
     return(GetCollidingObjectsInLayer(PhysicsLayer.GetLayer(layer)));
 }
 public bool CanCollideWith(PhysicsLayer otherLayer)
 {
     return(AllowedCollisions.Contains(otherLayer));
 }
        /// <summary>
        /// Happens when the manus hand exits a trigger
        /// </summary>
        /// <param name="collider"></param>
        void OnTriggerExit(Collider collider)
        {
            PhysicsObject physicsObject = null;

            if (!PhysicsManager.Instance.GetPhysicsObject(collider.gameObject, out physicsObject) || physicsObject.PhysicsLayer == PhysicsLayer.GetLayer(Layer.Phalange))
            {
                return;
            }

            var interactable = collider.GetComponent <Interactable>();

            if (interactable == null)
            {
                interactable = physicsObject.GameObject.GetComponent <Interactable>();
            }
            _collidingInteractables.Remove(interactable);
        }