On Collision
Tipo: Branch (Hit / None)
Categoría: EVENT
Detecta colisiones físicas con otros objetos usando el sistema de callbacks de colisión de Range. Bifurca a Hit cuando hay colisión, con opción de filtrar por propiedad BGE.
Propiedades
| Propiedad | Tipo | Por defecto | Descripción |
|---|---|---|---|
| Property Filter | String | "" |
Solo detecta objetos que tengan esta propiedad BGE. Vacío = cualquier objeto |
| Consume Event | Bool | True |
Limpia el flag tras leerlo para evitar re-disparar el mismo frame siguiente |
Sockets
| Socket | Dirección | Tipo |
|---|---|---|
| In | Entrada | Exec |
| Hit | Salida | Exec (hay colisión) |
| None | Salida | Exec (sin colisión) |
| Object | Salida | Data (KX_GameObject) |
Comportamiento
Mecanismo de callback
El nodo usa collisionCallbacks de Range — registra una función de callback en self.own.collisionCallbacks la primera vez que se ejecuta:
def _col_cb(obj):
if obj has property_filter:
self.own['_rnc_col_<nombre>'] = True
self.own['_rnc_col_<nombre>_obj'] = obj.name
El callback se registra solo una vez (guardado por hasattr). Range lo llama automáticamente en cada colisión, aunque el nodo no esté en el frame actual.
Lectura del flag
Cada frame en que el nodo ejecuta, lee la propiedad BGE _rnc_col_<nombre>:
- Si es True → camino Hit.
- Si es False → camino None.
Consume Event = True (por defecto)
Después de detectar Hit, limpia el flag a False. Así el camino Hit solo se activa una vez por colisión, no en todos los frames siguientes.
Consume Event = False
El flag permanece True hasta que algo externo lo borre. Útil si múltiples nodos necesitan leer la misma colisión.
Socket Object
Contiene el objeto que colisionó (_col_incoming). Puede ser None si el objeto ya fue eliminado de escena antes del siguiente frame.
Uso típico
Recoger un pickup
[On Update] → [On Collision: Property Filter="pickup"]
├── Hit ──► [BTCustomTask: collect_item(_col_incoming)]
└── None ──► (nada)
Zona de daño
[On Update] → [On Collision: Property Filter="player"]
├── Hit ──► [BTCustomTask:
│ Range.logic.globalDict['_dmg_' + _col_incoming.name] = 10.0]
└── None ──► (nada)
Activar trampa al pisar
[On Update] → [On Collision]
└── Hit ──► [Do Once]
└── True ──► [BTCustomTask: activate_trap()]
Leer el objeto impactado
El socket Object expone _col_incoming:
# En un BTCustomTask conectado a Hit:
if _col_incoming:
print("Colisionó con:", _col_incoming.name)
Filtro de propiedad
Con Property Filter = "enemy": solo dispara Hit cuando el objeto que colisiona tiene una propiedad BGE llamada enemy (cualquier tipo — Bool, Int, String).
Sin filtro (vacío): cualquier objeto físico que colisione dispara Hit, incluyendo el suelo, paredes, etc.
Notas
- El nodo debe conectarse a On Update para leer el flag cada frame.
- El callback de colisión es independiente del árbol — un objeto puede colisionar aunque el árbol no se haya ejecutado ese frame (ej. lag spike). El flag persiste hasta el siguiente frame de On Update.
- Si el objeto colisionado se destruye antes de que se lea el socket
Object,_col_incomingseráNone. - Para colisiones entre sensores/overlapping (triggers de zona), asegurarse de que el objeto tiene tipo de física correcto (Dynamic, Character o Static con collision enabled).
- Con
Consume = Falsey múltiples colisiones en el mismo frame: solo se registra el último objeto en el callback (sobrescribe_obj).