Mesh Visual Scripting Programmer's Guide
Ga naar het overzichtsartikel visualscripting
Beperkingen
- Alleen een subset van Unity-functionaliteit wordt weergegeven voor visuele scripts.
- Variabelen en eigenschappen met niet-eenvoudige typen (inclusief objectverwijzingen) worden niet automatisch gedeeld. Zie Delen en netwerken hieronder voor meer informatie.
Hello World
Het eenvoudigste visuele script dat u kunt maken, is een script waarmee u een berichtvak opent:
Dit is hoe het eruitziet in Mesh:
Uw scripts testen
Voordat u uw scène uploadt naar Mesh, kunt u visuele scripts ontwikkelen en testen, zelfs met meerdere clients in de split screen-modus, met behulp van de Play-modus met Mesh Emulation.
Diagnostische gegevens van visualscripts in de editor
Wanneer een GameObject met een scriptmachine is geselecteerd in de transformatiehiërarchie, geeft Mesh het deelvenster Mesh Visual Scripting Diagnostics onder aan het Inspector-deelvenster weer:
Het diagnostische deelvenster geeft onmiddellijk feedback over waarschuwingen of fouten die kunnen voorkomen dat uw scripts goed werken in Mesh.
Huidige beperking: toekomstige versies van het diagnostische deelvenster kunnen ook inzicht geven in het gebruik van gedeelde variabelen en eigenschappen van het visuele script en aanvullende diagnostische gegevens en waarschuwingen weergeven.
Uploaden naar Mesh
Gebruik de Mesh Uploader om scènes te uploaden die visuele scripts bevatten. Als u uploader wilt openen, selecteert u omgevingen in het menu Mesh Toolkit.
Opmerking: Mesh Uploader valideert visuele scripts voordat deze worden geüpload en weigert te uploaden wanneer er validatiefouten zijn in visuele scripts. Gedetailleerde diagnostische gegevens worden uitgevoerd naar de console.
Delen en netwerken
Gedeelde en lokale scriptstatus
Mesh maakt gebruik van Unity Visual Scripting, dat is ontworpen om te werken zonder netwerken. Visuele scripts worden onafhankelijk van elke client uitgevoerd. De Mesh-ervaring van de gebruikers wordt echter gedeeld; alle gebruikers ervaren één gedeelde scène die er hetzelfde uitziet op alle clients.
Het effect van de uitvoering van een visualscript is de wijze waarop de status van de scène wordt gewijzigd.
Mesh repliceert standaard automatisch scènewijzigingen die worden uitgevoerd door visuele scripts op de ene client naar alle andere clients. Afgezien van alles wat in een scène wordt gedeeld, blijft een bepaalde status onafhankelijk van elke client (met andere woorden, lokaal).
Lokale wijzigingen hebben tijdelijk voorrang op wijzigingen die afkomstig zijn van clients. Voorbeeld: Als u een object lokaal blijft animeren, wordt uw lokale animatie niet aangetast door wijzigingen die afkomstig zijn van andere clients.
Er is een aantal automatische updatesnelheidslimieten. Een client verzendt geen extra updates terwijl er nog een in vlucht is; er is één update verzonden per retour via de server. In praktische situaties bedraagt dit ongeveer vijf tot zes updates per seconde. Dit betekent dat een vloeiende animatie die door de ene client wordt aangestuurd, er niet soepel uitziet op andere clients. De best practice is om vloeiende animaties lokaal uit te voeren, idealiter niet via visuele scripts, maar via het normale Unity-animatiesysteem.
Uiteindelijke consistentie van de gedeelde status wordt gegarandeerd (zelfs als de statussen van clients tijdelijk kunnen verschillen).
Lokale status:
- Natuurlijke lokale staat: geluiden, ui, rendering.
- Door de gebruiker beheerde lokale status: subscènes die zijn gemarkeerd met het onderdeel Lokaal scriptbereik .
- Technische lokale status: objecten die geen deel uitmaken van de scènehiërarchie (bijvoorbeeld renderermaterialen, assets).
Gedeelde status:
- Beperkt tot visuele scriptvariabelen en de eigenschappen van GameObjects en scèneonderdelen die deel uitmaken van de scènehiërarchie.
- Alleen variabelen en eigenschappen van eenvoudige typen kunnen worden gerepliceerd: gehele getallen, drijvendekommagellen, booleaanse waarden, tekenreeksen,
Color
,3
4
/Vector2
/ ,Quaternion
, en .Matrix4x4
Rect
Elke wijziging in de gedeelde status wordt via het netwerk verzonden. Dit verhoogt het netwerkverkeer en kan, indien onzorgvuldig gebruikt, aanzienlijke bandbreedte verbruiken.
Gedeelde en lokale scripttriggers
Alle visuele scriptstromen beginnen als reactie op een gebeurtenis.
- Als de gebeurtenis afkomstig is van één client (bijvoorbeeld wanneer de gebruiker op een knop klikt), wordt het visuele script alleen op die client uitgevoerd.
- Als de gebeurtenis op alle clients plaatsvindt, wordt het visuele script uitgevoerd op alle clients (bijvoorbeeld timer gebeurtenis, wijziging van gedeelde eigenschap, gedeelde variabele update, avatar entert trigger, fysica body touches collider).
Wanneer u een knooppunt toevoegt om te detecteren of een object is geselecteerd, is het belangrijk om de juiste te kiezen. U hebt twee opties: Mesh Interactable Body: Is lokaal geselecteerd en Mesh Interactable Body: Is geselecteerd. Stel dat u een knop wilt hebben waarop u kunt klikken om teleportatie te activeren. Als u de deelnemer alleen op de knop wilt laten klikken en alleen zelf wilt transporteren, gebruikt u de Mesh Interactable Body: Is Selected Locally Node.
Als u de deelnemer op de knop wilt laten klikken en iedereen in de ervaring wilt teleporteren, gebruikt u het knooppunt Mesh Interactable Body: Is selected node. In elk geval vertelt de tekst boven het knooppunt u het gedrag dat u kunt verwachten:
Als een lokaal script een gedeelde variabele instelt en een tweede script luistert naar wijzigingen in deze variabele (met behulp van de trigger On State Changed ; zie hieronder), wordt het tweede script uitgevoerd op alle clients.
Mesh biedt enkele speciale scriptknooppunten:
- Bij intervaltriggers met regelmatige intervallen synchroon op alle clients.
- Bij statuswijziging worden triggers geactiveerd wanneer de invoer wordt gewijzigd (bijvoorbeeld gedeelde eigenschappen, gedeelde variabelen, lokaal).
- Dialoogvenster weergeven geeft een berichtdialoogvenster weer met aangepaste tekst die optioneel knoppen kan bieden als antwoordopties.
Mesh maakt bepaalde compromissen ten gunste van eenvoud:
- Als meer dan één client probeert dezelfde gegevens te wijzigen, wint de laatste client (in plaats van een op transacties gebaseerd gegevensupdatemodel te gebruiken).
- Om gegevensconsistentie te garanderen, mogen visuele scripts die worden uitgevoerd op alle clients niet lezen en vervolgens gedeelde eigenschappen of variabelen schrijven. Als dit gebeurt, wordt er een runtimefout geactiveerd en wordt de uitvoering van de scriptstroom afgebroken.
Aanbevolen procedures
Visuele scripts zijn aanzienlijk trager dan systeemeigen C#-code. Bovendien vergroot Mesh visuele scripts met netwerk- en andere integratiefuncties, en schijnbaar weinig overhead visuele scriptacties kunnen leiden tot netwerkverkeer. Voor meer informatie over het verkrijgen van de beste prestaties van uw visuele scripts, raden we u aan de volgende artikelen te bekijken:
Overzicht van best practices voor visualscripting
Aanbevolen procedures voor visualscripts voor prestaties
Aanbevolen procedures voor visuele scripts voor netwerken
Aanbevolen procedures voor visualscripts voor foutopsporing
Beveiliging
Mesh beschermt gebruikers tegen bedreigingsscenario's zoals deze:
- Gecompromitteerde scène-inhoud, bijvoorbeeld kwaadwillende pogingen om toegang te krijgen tot gevoelige lokale gegevens.
- Aangetast client- of transportkanaal, bijvoorbeeld kwaadwillende pogingen om ontoegankelijke externe gegevens op andere clients te lezen of te schrijven.
Hiervoor voert Mesh visuele scripts uit in een sandbox (zoals JavaScript in een webbrowser).
Bij het opstarten van de scène gebruikt Mesh een gecureerde allowlist om visuele scripts te valideren om de toegang tot bepaalde typen Unity-onderdelen en een veilige subset van hun eigenschappen te beperken.
Tijdens de runtime van de scène beperkt Mesh de toegang tot bepaalde delen van de scène:
- Lokaal: door toegang tot Mesh-interne gegevens en andere gevoelige gegevens te voorkomen.
- Extern: door te controleren of de auteur van de scène dit deel van de scène wil wijzigen. Dit wordt gedaan door visualscripts aan de kant van de ontvanger statisch te analyseren voor hun potentiële scène-schrijfbewerkingen.
Voorbeelden:
- Een schadelijk lokaal visualscript wil alle avatars bobble heads geven. Daartoe probeert het de hele scène te scannen op GameObjects die avatarkoppen vertegenwoordigen. Mesh filtert automatisch de scanresultaten om het avatarsysteem uit te sluiten.
- Een kwaadwillende externe client wil de scène afbreken door alle GameObjects ondersteboven te spiegelen. Hiervoor wordt een eigenschapsupdate verzonden waarmee de verticale schaal van elk GameObject in de scène wordt ingesteld. Omdat er echter geen visueel script op de ontvangende client zo is ontworpen, negeert de lokale client de externe invoer.
Mesh-integratie
Huidige beperking: in deze sectie wordt een preview beschreven van functies die nog steeds worden uitgevoerd.
Over het algemeen wordt integratie met andere onderdelen vaak uitgevoerd door wijzigingen in de eigenschappen van onderdelen te wijzigen en te luisteren. Voorbeeld:
Interacties: bekijk de eigenschappen 'Is aanwijst' en 'Is geselecteerd'.
Interacties in de fysica: bekijk lichamen in triggervolume of in contact met collider.
Avatars: avatarpositie lezen, draaiing bekijken en naamplaatje lezen. (Nog niet beschikbaar.)
Sessiestatus: deelnemers vermelden en deelnemergegevens lezen. (Nog niet beschikbaar.)
Cloudscripting: werken samen met cloudscripts die variabelen en onderdeeleigenschappen kunnen lezen en schrijven. (Nog niet beschikbaar.)
Sommige onderdelen bieden lokale acties:
- Audiobeheer
- Tijdlijn
- Animators
- Rendering: lees- en schrijfmateriaal- en shader-eigenschappen
Fysica wordt speciaal afgehandeld omdat simulatie voor een gegeven fysicaobject altijd gezaghebbend wordt uitgevoerd door slechts één client: de eigenaar. Om dit werk te maken, activeert het instellen van fysica-eigenschappen een automatische eigendomsoverdracht naar de client die de wijziging toepast.