Éditeur de map

Construire une map directement dans le jeu, seul ou à plusieurs en temps réel, la tester en un clic et la publier sur le Workshop. Aucun logiciel externe n'est nécessaire.

Ouvrir l'éditeur

Chaque nouvelle map est rangée dans un addon local : addons/<nom>/maps/<nom>.pcmap, avec son addon.json. Elle apparaît ensuite dans Jouer → Créer une partie et Explorer → Cartes.

Modes d'édition

ModeEffet
SoloTu édites seul.
AmisCrée un lobby Steam (amis uniquement, 8 éditeurs). Invite avec le bouton à côté de Enregistrer, ou tes amis rejoignent depuis Multijoueur (la partie s'affiche avec « (édition) »).
IPComme Amis mais sans Steam : les autres rejoignent par Multijoueur → Par IP.

Contrôles

Inspirés d'Unreal et d'Unity. Les touches de déplacement suivent leur position sur le clavier : sur AZERTY, voler se fait avec ZQSD.

ActionContrôle
VolerClic droit maintenu + ZQSD (QWERTY : WASD), A / E pour descendre / monter, Maj pour accélérer, molette pour régler la vitesse
Avancer / reculer, glisser la vueMolette ; clic molette maintenu
SélectionnerClic ; Ctrl ou Maj + clic pour ajouter ; glisser pour un rectangle de sélection ; Ctrl+A pour tout
Déplacer / tourner / redimensionnerZ / E / R (QWERTY : W / E / R), puis tirer une poignée
Cadrer la sélectionF (ou double-clic dans la liste)
Supprimer, dupliquerSuppr ; Ctrl+D
Copier / coller sous la sourisCtrl+C / Ctrl+V
Annuler / rétablirCtrl+Z / Ctrl+Y (chaque éditeur a son propre historique)
EnregistrerCtrl+S
Arrêter de poser / désélectionnerÉchap

Poignées et aimant

Contenu

Blocs

Formes redimensionnables pour monter sols, murs, rampes et escaliers sans Blender, comme les brushes de Hammer. Leur collision est exacte et ils sont statiques en jeu.

FormeDétails
CubePavé de la taille indiquée.
RampePlan incliné qui monte vers −X (tourne-la pour l'orienter).
CylindreDiamètre = taille X et Z, hauteur = taille Y (X ≠ Z donne un cylindre ovale).
EscalierMarches pleines qui montent vers −Z ; le nombre de marches se règle dans l'inspecteur.

Matériaux : Dev gris, Dev orange, Dev sombre, Dev bleu (grilles façon Source), Béton, Briques, Planches, Métal, Carrelage, Herbe, Terre, Sable. Les textures sont procédurales et suivent le monde : un bloc agrandi ne déforme pas sa texture. Teinte colore le matériau, Échelle texture agrandit le motif.

Props et décor

Tous les props du menu de spawn (intégrés et packs de modèles), à poser de deux façons (boutons en haut de l'onglet) :

Dossiers : la liste est rangée par pack. À la racine : PhysiCore (les props intégrés au jeu), Véhicules (intégrés et d'addons), puis un dossier par addon de modèles (son titre, celui de addon.json). Dans un pack, un sous-dossier par catégorie de son props.json (le début commun avec le nom du pack est retiré : « Modern City — Enseignes » devient Enseignes) ; les modèles sans catégorie sont posés directement dans le pack, et ceux cachés du menu de spawn ("hidden": true : variantes de carte, copies mises à l'échelle…) sont regroupés à la fin dans Cachés (décor). ‹ Retour remonte d'un dossier ; l'info-bulle d'un dossier donne son nom complet et son nombre de modèles. La recherche, elle, cherche dans tous les dossiers (nom, mots-clés, catégorie) et l'info-bulle de chaque résultat indique son pack et sa catégorie.

Le bouton Workshop ouvre les packs de modèles du Workshop : abonne-toi, et les modèles apparaissent dans la liste une fois téléchargés. Pour créer tes propres modèles, voir l'éditeur de modèles.

Édition à plusieursLes packs auxquels tu t'abonnes pendant une session ne sont pas envoyés aux co-éditeurs déjà connectés : ils voient un cube ERROR tant qu'ils ne s'y abonnent pas aussi (ou jusqu'à la prochaine session).

Entités

EntitéEn jeuRéglages
Point d'apparitionLes joueurs apparaissent sur l'un d'eux au hasard. Sans point, au centre de la map.—
LumièreLumière ponctuelle.couleur, intensité, portée, ombres, statique
SpotCône de lumière (posé vers le bas par défaut).couleur, intensité, portée, angle, ombres, statique
Volume d'eauEau où l'on nage ; la surface est le haut du volume.taille
Zone interdite aux PNJInvisible en jeu : retirée du navmesh, les PNJ n'y marchent pas. Onglet Monde → Voir le navmesh des PNJ montre en vert où ils peuvent aller.taille
Point nomméInvisible : un repère (spawn d'équipe, objectif…) que le Lua lit avec map.GetPoints.nom, catégorie
Zone déclencheurInvisible : appelle les hooks TriggerStartTouch / TriggerEndTouch quand on y entre ou sort.nom, taille, catégorie
Entité scriptéeUne entité Lua créée au lancement de la map.nom, classe, propriétés clé = valeur

Les trois dernières servent aux gamemodes : la liste Classes d'entités sous les boutons montre les classes des gamemodes installés et des addons activés, et la case Afficher les zones déclencheurs les cache pour cliquer à travers. Tout est expliqué, avec l'API Lua, dans Points, zones et entités de map.

Terrain

L'onglet Terrain (panneau de gauche) ajoute un sol naturel à sculpter, peindre et planter, dessiné par le plugin Terrain3D (TokisanGames). Créer un terrain pose un terrain plat de 512 × 512 m au centre de la map, avec ses textures et sa végétation prêtes à l'emploi.

Une map peut avoir jusqu'à 8 terrains, listés en haut de l'onglet : les outils agissent sur celui qui est sélectionné. Chacun a son nom, ses textures, sa végétation et ses zones. Ils peuvent être à des endroits différents ou superposés (une île flottante au-dessus d'une vallée : perce le terrain du dessus avec Trous pour lui donner sa forme).

OutilEffetAvec Ctrl
Monter / CreuserMonte ou creuse le sol sous le pinceau.L'inverse.
AplatirAmène le sol à la Hauteur choisie.Ctrl+clic : prend la hauteur du sol cliqué.
LisserAdoucit les bosses et les falaises.
Peindre / MélangerPeint la texture choisie ; Mélanger la fond peu à peu avec celle du sol.
TrousPerce le terrain (grottes, tunnels, sous-sols) : un trou n'a ni image ni collision.Rebouche.
VégétationDisperse le modèle choisi (taille, variation de taille).Arrache toutes les plantes dans le cercle, quel que soit le modèle.
ZonesAgrandit le terrain d'une zone de 256 × 256 m là où on clique, même hors du terrain (256 zones au maximum : 4 × 4 km).Retire la zone.

Routes

L'onglet Routes (panneau de gauche) dessine des routes point par point, générées par le plugin Road Generator (TheDuckCow) : voies avec marquages, bas-côtés, carrefours, collisions. Tracer une route, puis :

Réglages des nouvelles routes : nombre de voies dans chaque sens (0 dans un sens : sens unique), largeur d'une voie, bas-côtés, revêtement (asphalte, béton, pavés, gravier, terre ; textures CC0 Poly Haven), marquages au sol (asphalte), courbure et aplatir le terrain dessous. Appliquer aux routes sélectionnées les donne à toute la route (d'un carrefour ou d'un bout à l'autre) des points sélectionnés.

Monde

L'onglet Monde (panneau de droite) règle l'heure du soleil (0 à 24 h, nuit avant 6 h et après 18 h), sa direction, son intensité et sa couleur, les couleurs du ciel, la quantité de nuages (0 : ciel dégagé, 1 : couvert ; ils dérivent avec le vent et leur détail suit l'option graphique « Nuages » du joueur), la lumière ambiante, le brouillard et le brouillard volumétrique (qui respecte l'option graphique du joueur).

Ciel panoramique

Dans l'onglet Monde, Ciel panoramique remplace le ciel calculé et ses nuages par une image. La liste propose Aucun (ciel calculé) et les images des dossiers materials/skybox/ de tes addons activés (fichier — addon) : images équirectangulaires (proportions 2:1), en .png, .jpg, .webp ou .hdr. Rotation du panorama (°) (0 à 360) le tourne autour de l'axe vertical. Le panorama suit la luminosité du jour et de la nuit (heure du soleil).

La map enregistre "sky_texture": "addon:<clé de l'addon>/materials/skybox/<fichier>" et "sky_rotation" dans environment. Les joueurs doivent avoir l'addon de l'image : ajoute-le aux dépendances Workshop de la map. Une image absente sur la machine apparaît comme (introuvable) dans la liste, et le ciel calculé est affiché. En Lua : env.SetSkyTexture.

Éclairage précalculé

Une lumière cochée Statique (décochée par défaut) ne sera plus une vraie lumière en jeu : sa lumière est calculée une fois sur les blocs de la map, avec des ombres douces et un rebond (un mur rouge éclaire en rouge à côté de lui). Une map peut ainsi avoir des milliers de lumières sans les faire calculer à chaque image. Les lumières qui doivent clignoter, bouger ou être éteintes par un script restent dynamiques.

  1. Coche Statique sur les lumières qui ne bougent pas.
  2. Onglet Monde → Éclairage précalculé : choisis la qualité (Brouillon : pixels de lumière de 50 cm, très rapide ; Normale : 25 cm ; Haute : 12 cm, ombres plus douces, plus long) et si le soleil et le ciel sont aussi précalculés (ombres douces du soleil, intérieurs vraiment sombres). Décoché, le soleil et la lumière du ciel restent en temps réel.
  3. Calculer l'éclairage : la map est enregistrée, puis le calcul tourne en arrière-plan (barre de progression, bouton Annuler) pendant que tu continues à éditer. Lance Tester pour voir le résultat.
Pourquoi pas le lightmapper de Godot ?Celui de Godot n'existe que dans l'éditeur Godot, pas dans un jeu exporté : PhysiCore a son propre calcul, par lancers de rayons sur plusieurs cœurs du processeur. Ordre d'idée : une petite map en quelques secondes, une map de 400 m × 400 m avec 5000 lumières en environ 15 s en Brouillon.

Le navmesh dit aux PNJ où ils peuvent marcher. Onglet Monde → Navmesh des PNJ :

Fusionner en un modèle

Comme le Merge Actors d'Unreal Engine : sélectionne plusieurs objets Décor et blocs (les props, lumières et entités sont ignorés), puis clique sur Fusionner en un modèle… sous l'inspecteur. Ça crée un vrai modèle 3D (.glb) rangé dans un pack de modèles : moins d'objets dans la map et moins de surfaces à dessiner, donc une map plus légère. La fenêtre affiche ce qu'il y a avant (objets, triangles, matériaux, surfaces) et ce qu'il y aura après.

RéglageEffet
Nom du modèleNom dans l'onglet Props. Le fichier prend ce nom (models/<nom>.glb, avec _2, _3… s'il existe déjà).
Addon de modèlesUn de tes addons locaux (celui de la map en premier) ou Nouvel addon… (créé avec le nom donné). L'addon est activé s'il ne l'était pas.
CatégorieDossier dans l'onglet Props (Fusions par défaut).
MatériauxGarder les matériaux d'origine : une surface par matériau, textures d'origine copiées dans le .glb, aucune perte de qualité. Tout précalculer dans une seule texture (atlas) : toutes les surfaces sont dépliées et peintes dans une nouvelle texture ; il ne reste qu'une surface (plus une pour le feuillage découpé et une pour le verre s'il y en a).
Taille de la texture256 à 4096 pixels de côté. Le message de fin donne la densité obtenue (pixels par mètre) : si elle est trop faible, prends une texture plus grande ou fusionne moins d'objets à la fois.
Normal map, Rugosité et métal, ÉmissionTextures précalculées en plus de la couleur (l'émission seulement si un matériau émet de la lumière). Le relief des blocs (joints des briques…) devient une normal map.
Marge autour des morceauxPixels remplis autour de chaque morceau de l'atlas (1 à 16, 4 par défaut) : évite les liserés au loin.
Format des imagesPNG (sans perte) ou JPEG (bien plus léger). Une texture avec transparence reste en PNG.
Point d'origineCentre au ras du bas (par défaut), centre de la sélection, position du premier objet sélectionné ou origine de la map.
CollisionExacte (chaque triangle, on peut entrer dans les bâtiments), une boîte par objet d'origine (légère, 32 objets au plus, sinon exacte), une enveloppe convexe (très légère, pour un tas de rochers) ou aucune.
Retirer les faces cachéesRetire les faces collées l'une contre l'autre entre deux objets (deux blocs posés côte à côte, une caisse posée au sol) et celles qui sont à l'intérieur d'un bloc cube d'un autre objet.
Remplacer les objets dans la mapCoché (par défaut) : les objets d'origine sont retirés et le nouveau modèle posé à leur place, en décor, et sélectionné. Ctrl+Z remet les objets d'origine. Décoché : la map ne change pas, le modèle est juste ajouté à l'onglet Props.
Visible dans le menu de spawnDécoché par défaut : le modèle est caché du menu de spawn en jeu ("hidden": true dans props.json) mais reste dans l'onglet Props de l'éditeur (Cachés (décor)).

Grandes maps

En jeu, une map .pcmap est optimisée toute seule, sans rien changer à la façon de la construire :

Ouverture dans l'éditeur : l'écran de chargement de l'éditeur suit les mêmes étapes, sans jamais figer le jeu : Chargement des modèles (lus en parallèle), Construction de la carte (quelques centaines d'objets par image, « 3 200 / 14 751 objets »), Construction du terrain s'il y en a un, puis Miniatures des props : toutes les images de l'onglet Props sont préparées pendant le chargement (lues depuis le cache disque cache/icons, ou dessinées puis gardées pour les fois suivantes), si bien que l'onglet s'ouvre sans à-coup. La première ouverture après l'installation d'un gros pack de modèles est plus longue (chaque nouvelle miniature est dessinée une fois, par lots dont les modèles sont lus en parallèle puis relâchés s'ils ne servent pas à la map). Un modèle de plus de 256 Mo sur le disque (fichiers .bin compris) n'a pas de miniature mais un carré gris : le charger pour une image de 128 pixels prenait des gigaoctets de mémoire. Un co-éditeur qui rejoint la session passe par les mêmes étapes ; les modifications faites par les autres pendant son chargement sont appliquées à la fin.

Dans l'éditeur, tout reste chargé et modifiable ; Voir les objets lointains (onglet Monde) affiche aussi ce que la distance d'affichage cache en jeu. Le cadre Poids de la map compte les objets, les triangles, les lumières en temps réel (avec ombres) et les lumières statiques, les modèles différents et les props physiques, en orange puis en rouge quand ça devient lourd, avec un conseil.

Édition à plusieurs

Tester

TESTER (hôte uniquement) lance la map telle qu'elle est, sans l'enregistrer, pour tous les éditeurs : joueurs, physgun, toolgun, props physiques et scripts Lua des addons activés. Dans le menu pause (Échap), Retour à l'éditeur ramène tout le monde dans l'éditeur ; la map revient exactement à son état d'avant le test.

Le début du test affiche l'écran de chargement pendant que la map de jeu se construit (« Construction de la carte : 60 % ») ; un éditeur dont la map n'est pas encore prête reste immobile jusqu'à la fin, pour ne pas tomber à travers le sol. Au retour, l'écran de chargement s'affiche aussi le temps de reconstruire les terrains.

Enregistrer et publier

  1. Ctrl+S ou Enregistrer (le point « • » signale des modifications non enregistrées).
  2. Fichier → Publier sur le Workshop… enregistre puis ouvre l'outil de publication : choisis l'addon de la map. Voir Publier un addon.
  3. Miniature : Fichier → Prendre la photo (ou cadrage automatique, ou une image du PC). Sans photo, une photo automatique de la map est prise à la publication. Voir Miniature.

Pour jouer une map, pas besoin qu'elle soit installée chez les autres : le serveur leur envoie la map. Seuls les props venant d'addons doivent être installés (sinon cube ERROR), d'où l'intérêt de publier les addons utilisés.

Le format .pcmap

À côté du .pcmap, une map peut avoir : <map>.terrain (les terrains, binaire : en-tête PCTERRAIN2, taille, puis les données compressées en zstd : pour chaque terrain son nom, ses textures, sa végétation et ses zones de 256 m avec leurs cartes de hauteur, de peinture et de couleur ; les fichiers PCTERRAIN1 d'avant, à un seul terrain, se lisent toujours), <map>.navmesh (le navmesh calculé, en-tête PCNAV1) et le dossier <map>_lighting/ (l'éclairage précalculé). Ce sont aussi de simples données, vérifiées à la lecture, jamais des ressources Godot. Le serveur envoie le terrain aux joueurs avec la map.

Les routes sont dans le .pcmap, en objets road_point (champs lanes_fwd, lanes_rev, lane_width, shoulder, surface, markings, curve, auto_dir, flatten, et les liens next / prior : l'id du point suivant ou précédent, ou d'un carrefour) et road_intersection. Deux points sont reliés quand les deux liens concordent (A.next = B et B.prior = A) ; un point dont un lien vise un carrefour en est une branche.

Le .pcmap est un fichier JSON lisible. Il ne contient que des données, jamais de scènes ni de scripts : une map du Workshop ne peut pas exécuter de code. Tout ce qui est lu (fichier ou réseau) est vérifié : types inconnus ignorés, valeurs bornées, 20 000 objets au maximum.

{
	"format": "physicore-map",
	"version": 1,
	"name": "Ma map",
	"environment": {
		"sun_time": 14.0, "sun_heading": 210.0, "sun_energy": 1.2, "sun_color": "fff7ebff",
		"sky_top": "5285d1ff", "sky_horizon": "b8cce0ff", "ground_color": "404540ff",
		"clouds": 0.4, "sky_texture": "", "sky_rotation": 0.0,
		"ambient_energy": 1.0, "fog": false, "fog_density": 0.01, "fog_color": "b3bfd1ff",
		"volumetric_fog": false
	},
	"objects": [
		{ "id": "3612e24a5b87e096", "type": "block", "name": "Sol",
		  "pos": [0, -0.5, 0], "rot": [0, 0, 0],
		  "shape": "box", "size": [200, 1, 200], "material": "grass",
		  "color": "ffffffff", "tile": 4.0, "steps": 8 },
		{ "id": "837554eafdf21bf7", "type": "spawn", "name": "Point d'apparition",
		  "pos": [0, 0, 0], "rot": [0, 0, 0] },
		{ "id": "a1b2c3d4e5f60718", "type": "prop", "name": "Caisse en bois",
		  "pos": [3, 0.45, 2], "rot": [0, 45, 0],
		  "model": "builtin:crate", "frozen": true, "color": "ffffffff" }
	]
}
ChampDescription
idIdentifiant unique (texte)
typeblock, prop, static (décor), spawn, light_point, light_spot, water, point, trigger, entity
pos / rotPosition en mètres ; rotation en degrés (ordre Y, X, Z)
shape, size, material, tile, stepsBlocs : forme (box, ramp, cylinder, stairs), taille en mètres (0,05 à 2000), matériau (dev_grey, dev_orange, dev_dark, dev_blue, concrete, bricks, planks, metal, tiles, grass, dirt, sand), échelle de texture, nombre de marches
model, frozenProps et décor (model seulement) : identifiant du prop (voir Identifiants de props), figé au départ
colorTeinte (blocs, props) ou couleur de lumière, en hexadécimal RRGGBBAA
energy, range, angle, shadows, staticLumières : intensité, portée (m), angle du spot (°), ombres, précalculée (voir Éclairage précalculé)
sizeEau : taille du volume ; zone déclencheur : taille de la boîte (0,1 à 2000)
tag, class, keyvaluesPoints et zones : catégorie ; entités scriptées : classe et propriétés. Voir Dans le fichier .pcmap
Fichier écrit à la mainTu peux générer un .pcmap avec un script (par exemple pour créer un labyrinthe), tant qu'il respecte ce format. Les champs absents prennent leur valeur par défaut.