Trigger
A trigger is an invisible and non-colliding CoreObject which fires events when it interacts with another object (for example a Player walks into it):
Properties
Property Name | Return Type | Description | Tags |
---|---|---|---|
isInteractable | boolean | Interactable Triggers expect Players to walk up and press the F key to activate them. | Read-Write |
interactionLabel | string | The text players will see in their HUD when they come into range of interacting with this trigger. | Read-Write |
team | integer | Assigns the trigger to a team. Value range from 0 to 4. 0 is neutral team. | Read-Write |
isTeamCollisionEnabled | boolean | If false , and the Trigger has been assigned to a valid team, players on that team will not overlap or interact with the Trigger. | Read-Write |
isEnemyCollisionEnabled | boolean | If false , and the Trigger has been assigned to a valid team, players on enemy teams will not overlap or interact with the Trigger. | Read-Write |
Functions
Function Name | Return Type | Description | Tags |
---|---|---|---|
IsOverlapping(CoreObject) | boolean | Returns true if given CoreObject overlaps with the Trigger. | None |
IsOverlapping(Player) | boolean | Returns true if given player overlaps with the Trigger. | None |
GetOverlappingObjects() | Array <Object > | Returns a list of all objects that are currently overlapping with the Trigger. | None |
Events
Event Name | Return Type | Description | Tags |
---|---|---|---|
beginOverlapEvent | Event <Trigger trigger, Object other> | Fired when an object enters the Trigger volume. The first parameter is the Trigger itself. The second is the object overlapping the Trigger, which may be a CoreObject, a Player, or some other type. Call other:IsA() to check the type. | None |
endOverlapEvent | Event <Trigger trigger, Object other> | Fired when an object exits the Trigger volume. Parameters the same as beginOverlapEvent. | None |
interactedEvent | Event <Trigger trigger, Player > | Fired when a player uses the interaction on a trigger volume (F key). The first parameter is the Trigger itself and the second parameter is a Player. | None |
interactableFocusedEvent | Event <Trigger trigger, Player > | Fired when a player has focused on an interactable Trigger and may interact with it. | Client-Only |
interactableUnfocusedEvent | Event <Trigger trigger, Player > | Fired when a player is no longer focused on a previously focused interactable Trigger. | Client-Only |
Examples
Example using:
beginOverlapEvent
In this example, players die when they walk over the trigger. The script assumes to be a child of the trigger.
local trigger = script.parent
function OnBeginOverlap(theTrigger, player)
-- The object's type must be checked because CoreObjects also overlap triggers, but we
-- only call :Die() on players.
if player and player:IsA("Player") then
player:Die()
end
end
trigger.beginOverlapEvent:Connect(OnBeginOverlap)
See also: CoreObject.parent | other.IsA | Player.Die | Event.Connect
Example using:
endOverlapEvent
As players enter/exit the trigger the script keeps a table with all currently overlapping players. The script assumes to be a child of the trigger.
local trigger = script.parent
local activePlayers = {}
function OnBeginOverlap(theTrigger, player)
if player and player:IsA("Player") then
table.insert(activePlayers, player)
print("The trigger contains " .. #activePlayers .. " players")
end
end
function OnEndOverlap(theTrigger, player)
if (not player or not player:IsA("Player")) then return end
for i, p in ipairs(activePlayers) do
if p == player then
table.remove(activePlayers, i)
break
end
end
print("The trigger contains " .. #activePlayers .. " players")
end
trigger.beginOverlapEvent:Connect(OnBeginOverlap)
trigger.endOverlapEvent:Connect(OnEndOverlap)
See also: CoreObject.parent | other.IsA | Trigger.beginOverlapEvent | Event.Connect
Example using:
interactableFocusedEvent
interactableUnfocusedEvent
In this example, an interactable trigger can detect when players are focusing on them using interactableFocusedEvent
and interactableUnfocusedEvent
. When this happens, the player's name is printed to the Event Log.
local TRIGGER = script:GetCustomProperty("Trigger"):WaitForObject()
function OnInteractableFocused(trigger, player)
print("Focused by " .. player.name)
end
function OnInteractableUnfocused(trigger, player)
print("Unfocused by " .. player.name)
end
TRIGGER.interactableFocusedEvent:Connect(OnInteractableFocused)
TRIGGER.interactableUnfocusedEvent:Connect(OnInteractableUnfocused)
See also: Player.GetInteractableTarget
Example using:
interactedEvent
In this example, the trigger has the "Interactable" checkbox turned on. When the player walks up to the trigger and interacts with the F key they are propelled into the air. The script assumes to be a child of the trigger.
local trigger = script.parent
trigger.isInteractable = true
function OnInteracted(theTrigger, player)
-- In this case there is no need to check the type with IsA("Player") because only
-- players can trigger the interaction.
player:SetVelocity(Vector3.New(0, 0, 10000))
end
trigger.interactedEvent:Connect(OnInteracted)
See also: CoreObject.parent | Trigger.isInteractable | Player.SetVelocity | Event.Connect
Example using:
GetOverlappingObjects
In this example, any objects that overlap with the trigger are pushed upwards until they no longer overlap. If the trigger overlaps with non-networked objects this will throw an error. The script assumes to be a child of the trigger.
local trigger = script.parent
function Tick()
local objects = trigger:GetOverlappingObjects()
for _, obj in pairs(objects) do
local pos = obj:GetWorldPosition()
pos = pos + Vector3.New(0, 0, 10)
obj:SetWorldPosition(pos)
end
end
See also: CoreObject.parent | Vector3.New
Example using:
IsOverlapping
In this example, a physics sphere is placed in the scene. Every second the sphere is in the trigger, team 1 scores a point. The script assumes to be a child of the trigger.
local trigger = script.parent
local sphere = World.FindObjectByName("PhysicsSphere")
local teamToReward = 1
while true do
Task.Wait(1)
if sphere and trigger:IsOverlapping(sphere) then
Game.IncreaseTeamScore(teamToReward, 1)
print("Team " .. teamToReward .. " score = " .. Game.GetTeamScore(teamToReward))
end
end
See also: CoreObject.parent | World.FindObjectByName | Task.Wait | Game.IncreaseTeamScore
Example using:
IsOverlapping
In this example, players score points for their teams for each second they are inside the trigger. The script assumes to be a child of the trigger.
local trigger = script.parent
while true do
Task.Wait(1)
local allPlayers = Game.GetPlayers()
for _, player in ipairs(allPlayers) do
if trigger:IsOverlapping(player) then
local teamToReward = player.team
Game.IncreaseTeamScore(teamToReward, 1)
print("Team " .. teamToReward .. " score = " .. Game.GetTeamScore(teamToReward))
end
end
end
See also: CoreObject.parent | Task.Wait | Game.GetPlayers | Player.team
Example using:
interactionLabel
In this example, the trigger moves left and right and changes its label dynamically. To use this as a sliding door place a door asset as a child of the trigger. The script assumes to be a child of the trigger.
local trigger = script.parent
local slideDuration = 2
local startPos = trigger:GetWorldPosition()
local isOpen = false
trigger.isInteractable = true
function SetState(newState)
isOpen = newState
if isOpen then
trigger.interactionLabel = "Close"
trigger:MoveTo(startPos, slideDuration)
else
trigger.interactionLabel = "Open"
trigger:MoveTo(startPos + Vector3.New(0, 150, 0), slideDuration)
end
end
SetState(true)
function OnInteracted(theTrigger, player)
SetState(not isOpen)
end
trigger.interactedEvent:Connect(OnInteracted)
See also: CoreObject.parent | Trigger.isInteractable | Vector3.New | Event.Connect
Example using:
isEnemyCollisionEnabled
In this example, when a player interacts with a trigger it joins their team and enemies can no longer interact with it. Each time they interact their team gains a point. When the last player to interact with the trigger is killed the trigger returns to its original neutral form. The script assumes to be a child of the trigger.
local trigger = script.parent
trigger.isInteractable = true
trigger.team = 0
local onDiedListener = nil
function OnPlayerDied(player, dmg)
onDiedListener:Disconnect()
trigger.team = 0
trigger.isEnemyCollisionEnabled = true
print("The objective is neutral again.")
end
function OnInteracted(theTrigger, player)
local teamToReward = player.team
if teamToReward == trigger.team then
Game.IncreaseTeamScore(teamToReward, 1)
print("Team " .. teamToReward .. " score = " .. Game.GetTeamScore(teamToReward))
else
trigger.team = teamToReward
trigger.isEnemyCollisionEnabled = false
print("The objective now belongs to team " .. player.team)
end
if onDiedListener then
onDiedListener:Disconnect()
end
onDiedListener = player.diedEvent:Connect(OnPlayerDied)
end
trigger.interactedEvent:Connect(OnInteracted)
See also: CoreObject.parent | Trigger.isInteractable | EventListener.Disconnect | Player.team | Game.IncreaseTeamScore | Event.Connect
Example using:
isInteractable
In this example, the trigger has a 4 second "cooldown" after it is interacted. The script assumes to be a child of the trigger.
local trigger = script.parent
trigger.isInteractable = true
function OnInteracted(theTrigger, player)
print("INTERACTED!")
trigger.isInteractable = false
Task.Wait(4)
trigger.isInteractable = true
end
trigger.interactedEvent:Connect(OnInteracted)
See also: CoreObject.parent | Task.Wait | Trigger.interactedEvent | Event.Connect
Example using:
isTeamCollisionEnabled
In this example, when a player interacts with a trigger it joins their team and they can no longer interact with it, but enemies can. The script assumes to be a child of the trigger.
local trigger = script.parent
trigger.isInteractable = true
function OnInteracted(theTrigger, player)
trigger.team = player.team
trigger.isTeamCollisionEnabled = false
print("The objective now belongs to team " .. player.team)
end
trigger.interactedEvent:Connect(OnInteracted)
See also: CoreObject.parent | Trigger.isInteractable | Player.team | Event.Connect
Example using:
team
In this example, players score points when they enter a trigger that belongs to the enemy team. The script assumes to be a child of the trigger.
local trigger = script.parent
function OnBeginOverlap(theTrigger, player)
local teamToReward = player.team
if (player and player:IsA("Player") and teamToReward ~= trigger.team) then
Game.IncreaseTeamScore(teamToReward, 1)
print("Team " .. teamToReward .. " score = " .. Game.GetTeamScore(teamToReward))
end
end
trigger.beginOverlapEvent:Connect(OnBeginOverlap)
See also: CoreObject.parent | Player.team | other.IsA | Game.IncreaseTeamScore | Trigger.beginOverlapEvent | Event.Connect