H.Text = 'Sorry but this server is going into private mode. No Gayfreaks Allowed. Thats you Scare! Certain people are getting banned.'
Many scripts want to run little bits of code at frequent intervals. For example, a script might update the behavior of a zombie. It needs to update conditions repeatedly, like checking the location of the nearest player.
Today, ROBLOX’s Chief Scientist, Erik Cassel, discusses proper use of the wait function.
The Problem
A very common way to do this in ROBLOX is with the handy “wait” statement. Here is an example:
There is one problem with this code. Can you see it? The wait function takes an optional argument, which is the time that the script should sleep. If you don’t supply an argument, then the function will typically return in 0.03 seconds. That means the script is looking for an enemy to attack 30 times a second! The findClosestEnemy function isn’t cheap. It probably needs to iterate over all the players and find the closest one. That might be fine if you have one zombie in your game, but what about a hoard of 50 zombies? Do you really want 50 zombies rethinking who they will attack 30 times a second? That amounts to 1,500 enemy updates per second.
This isn’t a contrived example. I’ve been analyzing laggy games. A large fraction of them are laggy because of scripts that suck up all the compute time.
Let’s think about zombies for a minute. Zombies are stupid. Once a zombie finds an enemy, he is unlikely to change his mind and go after a new enemy for a while. Let’s make a tiny change to our script:
We supplied a reasonable wait time of five seconds. Once the zombie spots a player, it will go after him for five seconds before looking to see if anybody else is closer. Now our 50-zombie game does 10 updates per second, rather than 1,500.
I have found games that try to wait for 0.0000001 seconds. That means they try to run complex operations 10 million times per second. We may have fast computers these days, but not that fast! These kinds of games suffer from terrible lag.
If your game is laggy, check your script performance. In ROBLOX Studio, there is a great Script Performance panel. Look down the Activity column. It will tell you what percentage of your overall time that a script is taking up. Anything greater than 3% should set off alarm bells.
Better Resuming from a Wait
Another thing to keep in mind is that wait is not guaranteed to return in precisely the time interval you requested. Let’s say your game fills up with 1,000 zombies. Even our optimized scripts might take up a lot of time in aggregate. In that case, ROBLOX will decide that it can’t run all the scripts fast enough, and it will automatically wait longer than requested. We do this because ROBLOX needs to run other processes, like networking, physics and rendering. By “throttling” the script code, we can try to avoid lag.
Let’s write a script that gradually changes the time of day. If you put this script in a game you will see the sun gradually rising:
The script asks to wait for one quarter of a second. However, let’s say that your game is temporarily running out of CPU time. In that case ROBLOX will decide to make your script wait longer than 0.25 seconds, and the sun will rise slower! Here is the solution to the problem:
As stated in the documentation, the wait function returns the actual elapsed time. With that bit of information, we can adjust the time of day accordingly. If the elapsed time is longer than 0.25 seconds, then we’ll skip the time of day forward proportionally.
Lag is often preventable. I’ve found that many games are laggy because of runaway scripts that spend valuable compute time on unnecessarily frequent computation. If you use wait correctly, you’ll be on the way to lag-free game building.
10 min
In this guide, we’ll expand on screen images and explore how to make them into buttons that can be used for menus, in-game actions, and much more.
There are two types of button objects in Roblox that can be used in your game’s UI design: TextButton|TextButtons
and ImageButton|ImageButtons
.
A TextButton
is very similar to a TextLabel
, except that a player can activate it with a click. Internally, it also shares many of the same visual properties as a text label — font, background color, stroke color, etc.
Similarly, an ImageButton
is like an interactive version of the ImageLabel
object and it uses a custom image that you upload to Roblox. It also shares most of the same properties as its non-button counterpart.
Let’s add an ImageButton
to the screen and flip it between a normal appearance and a more colorful appearance when a player activates it.
This will add an empty image button to the corner of the game view.
For this button, we need to upload two custom images — one for the normal appearance of the button when it’s just sitting on the screen, and a second image for when a player activates it (clicks it with their mouse, taps it when playing on their phone, or activates it with their console controller).
This time, instead of uploading an image through the Image property of the button, we’ll use the Game Explorer method. This method is useful when you want to upload more than one image at the same time.
Setting the normal appearance for the button can be done through the button object.
The final task is to connect a function to the “activated” event of the button. This function will be used to change the appearance of the button to the brighter activated version. In an actual game, it should also be used to perform an action like opening the game’s main menu.
For this button, we’ll use a LocalScript
. This is similar to the Script
object which you may be familiar with, but a LocalScript
is used to perform actions that only relate to a specific player and things happening on that player’s screen, such as detecting their input on the screen or displaying GUI elements (in contrast, a regular Script
is used for things that occur in the overall game world and which affect all parts and players in the game).
With the local script in place, we can test the button’s behavior. When the game starts, the button should appear in its normal state. Click the button and its appearance should change to the brighter activated state. Another click should then return it to its normal appearance.
ImageButtonNormal.png
file, make sure you uploaded ImageButtonActivated.png
.'rbxgameasset://Images/ImageButtonActivated'
'rbxgameasset://Images/ImageButtonNormal'
Let’s explore the code in the local script to understand how the button works.
button
which tells the script what specific object it’s linked to. In this case it’s linked to the image button, the “parent” of the script.toggled
which lets us track the current state (appearance) of the button. Because the button begins in the normal state, we set the variable’s value to false
.toggled
is false
(the button is off), the Image
property of the button will be changed to the brighter activated image and the toggled
variable will be set to true
(meaning the button is on).The fallback condition (else
) will be triggered if the button is in the activated state. This condition resets the button to the normal appearance and sets toggled
back to false
.
GuiButton/Activated|Activated
event. This will make the function run whenever the button is activated.Although there are several different event types which you can connect to buttons, the GuiButton/Activated|Activated
event is the most reliable for basic buttons, providing standard button behavior on all platforms from PC to phone/tablet to console.
Great job! As you can see, creating basic buttons in Roblox can be done with either a TextButton
or ImageButton
object, and hooking up a local script lets you detect basic button activation as well as swap between two images.