Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Supportare la locomozione di diversi attori
Per supportare diverse tipologie di locomozione degli attori, come accovacciarsi e strisciare, è necessaria una configurazione della mappa simile a supportare Supportare diversi tipi di attori.
Preparare diverse mesh di navigazione con un'altezza appropriata per gli attori accovacciati o striscianti, in modo che possano trovare percorsi attraverso le sezioni strette del mondo di gioco.
Quando un attore cambia stato di locomozione, ad esempio si alza in piedi, comincia ad accovacciarsi o a gattonare, richiedere la mappa appropriata per un percorso.
Se anche il comportamento di evitamento dovesse cambiare con la locomozione, ad esempio evitando solo stando in piedi o evitando solo altri agenti nello stesso stato di locomozione, cambiare l'agente di evitamento dell'attore in un'altra mappa di evitamento a ogni cambio di locomozione.
func update_path():
if actor_standing:
path = NavigationServer3D.map_get_path(standing_navigation_map_rid, start_position, target_position, true)
elif actor_crouching:
path = NavigationServer3D.map_get_path(crouched_navigation_map_rid, start_position, target_position, true)
elif actor_crawling:
path = NavigationServer3D.map_get_path(crawling_navigation_map_rid, start_position, target_position, true)
func change_agent_avoidance_state():
if actor_standing:
NavigationServer3D.agent_set_map(avoidance_agent_rid, standing_navigation_map_rid)
elif actor_crouching:
NavigationServer3D.agent_set_map(avoidance_agent_rid, crouched_navigation_map_rid)
elif actor_crawling:
NavigationServer3D.agent_set_map(avoidance_agent_rid, crawling_navigation_map_rid)
private void UpdatePath()
{
if (_actorStanding)
{
_path = NavigationServer3D.MapGetPath(_standingNavigationMapRid, _startPosition, _targetPosition, true);
}
else if (_actorCrouching)
{
_path = NavigationServer3D.MapGetPath(_crouchedNavigationMapRid, _startPosition, _targetPosition, true);
}
else if (_actorCrawling)
{
_path = NavigationServer3D.MapGetPath(_crawlingNavigationMapRid, _startPosition, _targetPosition, true);
}
}
private void ChangeAgentAvoidanceState()
{
if (_actorStanding)
{
NavigationServer3D.AgentSetMap(_avoidanceAgentRid, _standingNavigationMapRid);
}
else if (_actorCrouching)
{
NavigationServer3D.AgentSetMap(_avoidanceAgentRid, _crouchedNavigationMapRid);
}
else if (_actorCrawling)
{
NavigationServer3D.AgentSetMap(_avoidanceAgentRid, _crawlingNavigationMapRid);
}
}
Nota
Sebbene sia possibile eseguire una ricerca di percorso immediatamente per più mappe, il cambio di mappa dell'agente di evitamento avrà effetto solo dopo la prossima sincronizzazione del server.