Passer au contenu principal
Version: bleeding-edge 🩸

Portes

How to create a simple and automatic door when Characters move in.

Résultat final

Extrait de code

Server/Index.lua
-- Faisons apparaître un SM_Plane que nous utiliserons comme porte, et également un StaticMesh vide (SM_None) correspondant à notre charnière.
-- Le point de pivot du SM_Plane se trouvant au milieu du mesh, nous avons besoin d'une charnière pour permettre la bonne rotation.
-- Ceci n'est pas nécessaire si le Mesh de votre porte à déjà son point de pivot à l'emplacement de la charnière.

-- Créer la charnière (qui sera tournée de 90º pour être debout)
local door = StaticMesh(Vector(0, 0, 100), Rotator(0, 0, 90), "nanos-world::SM_None")

-- Créer le Mesh de la porte, le redimensionner pour qu'il corresponde à la taille d'une porte, et l'attacher a la charnière
local door_mesh = StaticMesh(Vector(), Rotator(), "nanos-world::SM_Plane")
door_mesh:SetScale(Vector(1, 2, 1))

-- Attacher la charnière à une position relative de 50 unité sur l'axe X (pour être à l'emplacement de la charnière)
door_mesh:AttachTo(door)
door_mesh:SetRelativeLocation(Vector(50, 0, 0))

-- Créer notre Trigger au centre de la porte
local trigger = Trigger(Vector(0, 0, 100), Rotator(), 150)

-- Enregistre la fonction à executer lorsque le joueur s'approche de la porte
trigger:Subscribe("BeginOverlap", function(trigger, actor)
if (actor:GetType() ~= "Character") then return end

-- Joue une animation d'ouverture de porte sur le Character
actor:PlayAnimation("nanos-world::AM_Mannequin_DoorOpen_01", AnimationSlotType.UpperBody)

-- Tourne la porte de 90° de manière fluide
door:RotateTo(Rotator(0, -90, 90), 1)
end)

-- Enregistre la fonction à executer lorsque le joueur s'éloigne de la porte
trigger:Subscribe("EndOverlap", function(trigger, actor)
if (actor:GetType() ~= "Character") then return end

-- Referme la porte à sa position d'origine de manière fluide
door:RotateTo(Rotator(0, 0, 90), 1)
end)