void OnTriggerEnter(Collider other) { if (!enabled || !_canGenerateCollisions || _checkedColliders.Contains(other)) { return; } _checkedColliders.Add(other); var hitEntity = EntityController.GetEntity(UnityToEntityBridge.GetEntityId(other)); var entity = EntityController.GetEntity(EntityID); if (hitEntity == null || hitEntity.Id == EntityID) { return; } if (!CollisionCheckSystem.IsValidCollision(entity, _limitToEnemy, hitEntity, other, out var sourceNode, out var targetNode)) { return; } var position = transform.position; var hitPnt = other.ClosestPointOnBounds(position); var hitNormal = (hitPnt - position).normalized; #if DEBUG DebugExtension.DrawPoint(hitPnt, Color.yellow, 1.5f, 4f); #endif hitEntity.Post(new CollisionEvent(entity, sourceNode, targetNode, hitPnt, hitNormal)); entity.Post(new PerformedCollisionEvent(sourceNode, targetNode, hitPnt, hitNormal)); }
void OnCollisionEnter(Collision collision) { if (!enabled || !_canGenerateCollisions || _checkedColliders.Contains(collision.collider)) { return; } var other = collision.collider; _checkedColliders.Add(other); var hitEntity = EntityController.GetEntity(UnityToEntityBridge.GetEntityId(other)); var entity = EntityController.GetEntity(EntityID); if (hitEntity == null || hitEntity.Id == EntityID) { return; } if (!CollisionCheckSystem.IsValidCollision(entity, _limitToEnemy, hitEntity, other, out var sourceNode, out var targetNode)) { return; } var collisionPnt = collision.contacts[0]; var hitPnt = collisionPnt.point; var hitNormal = collisionPnt.normal; #if DEBUG DebugExtension.DrawPoint(hitPnt, Color.magenta, 1.5f, 4f); #endif hitEntity.Post(new CollisionEvent(entity, sourceNode, targetNode, hitPnt, hitNormal)); entity.Post(new PerformedCollisionEvent(sourceNode, targetNode, hitPnt, hitNormal)); }
private static CollisionEvent?CheckRayList(Entity originEntity, int limit, bool limitEnemy) { for (int i = 0; i < limit; i++) { if (originEntity.IsDestroyed()) { return(null); } var hit = _rayHits[i]; Entity hitEntity = EntityController.GetEntity(UnityToEntityBridge.GetEntityId(hit.collider)); bool isEnvironment = hitEntity == null && hit.transform.IsEnvironment(); #if DEBUG_RAYCAST Color pointColor = Color.white; if (isEnvironment) { pointColor = Color.green; } else if (hit.transform.CompareTag(StringConst.TagInvalidCollider)) { pointColor = Color.magenta; } else if (hitEntity != null) { pointColor = Color.red; } DebugExtension.DebugPoint(_rayHits[i].point + (Vector3.up * (i * 0.1f)), pointColor, 0.25f, 2.5f); #endif if (isEnvironment) { #if DEBUG DebugLog.Add(originEntity.DebugId + " hit environment " + _rayHits[i].transform.name); #endif originEntity.Post(new EnvironmentCollisionEvent(originEntity, _rayHits[i].point, _rayHits[i].normal)); return(null); } if (hitEntity == null) { continue; } if (IsValidCollision(originEntity, limitEnemy, hitEntity, _rayHits[i].collider, out var sourceNode, out var targetNode)) { var ce = new CollisionEvent(originEntity, sourceNode, targetNode, _rayHits[i].point, _rayHits[i].normal); hitEntity.Post(ce); originEntity.Post(new PerformedCollisionEvent(sourceNode, targetNode, _rayHits[i].point, _rayHits[i].normal)); return(ce); } } return(null); }
private static void CheckColliderList(Entity originEntity, Entity ignoreEntity, Vector3 position, int limit, bool limitEnemy) { for (int i = 0; i < limit; i++) { if (originEntity.IsDestroyed()) { return; } var collider = _colliders[i]; var hitEntity = EntityController.GetEntity(UnityToEntityBridge.GetEntityId(collider)); if (hitEntity == ignoreEntity || hitEntity == null) { continue; } if (IsValidCollision(originEntity, limitEnemy, hitEntity, collider, out var sourceNode, out var targetNode)) { CollisionExtensions.GenerateHitLocDir(position, hitEntity, collider, out var hitPnt, out var hitNormal); var ce = new CollisionEvent(originEntity, sourceNode, targetNode, hitPnt, hitNormal); hitEntity.Post(ce); originEntity.Post(new PerformedCollisionEvent(sourceNode, targetNode, hitPnt, hitNormal)); } } }
private static CollisionEvent?CheckRayList(Entity originEntity, Ray ray, int limit, bool limitEnemy) { for (int i = 0; i < limit; i++) { if (originEntity.IsDestroyed()) { return(null); } var hit = _rayHits[i]; Entity hitEntity = EntityController.GetEntity(UnityToEntityBridge.GetEntityId(hit.collider)); bool isEnvironment = hitEntity == null && hit.transform.IsEnvironment(); #if DEBUG_RAYCAST Color pointColor = Color.white; if (isEnvironment) { pointColor = Color.green; } else if (hit.transform.CompareTag(StringConst.TagInvalidCollider)) { pointColor = Color.magenta; } else if (hitEntity != null) { pointColor = Color.red; } DebugExtension.DrawPoint(_rayHits[i].point + (Vector3.up * (i * 0.1f)), pointColor, 0.25f, 2.5f); #endif if (isEnvironment) { #if DEBUG DebugLog.Add(originEntity.DebugId + " hit environment " + _rayHits[i].transform.name); #endif originEntity.Post(new EnvironmentCollisionEvent(originEntity, _rayHits[i].point, _rayHits[i].normal)); return(null); } if (hitEntity == null) { continue; } if (IsValidCollision(originEntity, limitEnemy, hitEntity, _rayHits[i].collider, out var sourceNode, out var targetNode)) { if (targetNode.DetailCollider != null) { var detailTr = targetNode.DetailCollider.Collider.transform; var localPoint = hit.transform.InverseTransformPoint(ray.origin); var localDir = hit.transform.InverseTransformDirection(ray.direction); var rayCast = new Ray(detailTr.TransformPoint(localPoint), detailTr.TransformDirection(localDir)); if (!targetNode.DetailCollider.Collider.Raycast(rayCast, out var childHit, 500)) { DebugExtension.DrawPoint(childHit.point, Color.yellow, 0.25f, 2.5f); continue; } } var ce = new CollisionEvent(originEntity, sourceNode, targetNode, _rayHits[i].point, _rayHits[i].normal); hitEntity.Post(ce); originEntity.Post(new PerformedCollisionEvent(sourceNode, targetNode, _rayHits[i].point, _rayHits[i].normal)); return(ce); } } return(null); }