14.1. 自作関数①
さて、ここまで学んだ知識を生かして、ためしに信号機のライトのスクリプトを作ってみましょう。
ライトは 赤色、黄色、緑色 の3つです。
ライトとなるパーツを追加して、各ライトのパーツの中にPointLightオブジェクトを入れておきましょう。
PointLightの色を調節して、明るさをあらわすBrightnessプロパティと、明かりの範囲を表すRangeプロパティを大きくすることをおすすめします。
オブジェクト配置例

ライトが3秒ごとに 赤色、黄色、緑色 に切り替わるスクリプトを書いてみましょう。
急に切り替わるのではなく、徐々にライトの明るさが変わると目に優しいですね。
こうなればOK!
一度ご自身で書いてみて、どうしても分からない場合は以下のスクリプトをご確認ください。
こたえ

また長いスクリプトだ…😭
徐々にライトの明るさを変更したいため、for文を使用しています。
いろいろと値を変更してみて、スクリプトがどのように動作しているのか確認してみてください。
-- 3色のパーツの中に作成したPointLightを各変数に代入しておく
local redLight = workspace.Red.PointLight
local yellowLight = workspace.Yellow.PointLight
local greenLight = workspace.Green.PointLight
while true do
-- 徐々に赤色のライトの明るさを上げ、ほかは下げる
for brightness = 0, 15, 0.5 do
task.wait()
redLight.Brightness = brightness
yellowLight.Brightness = yellowLight.Brightness - 0.5
greenLight.Brightness = greenLight.Brightness - 0.5
end
task.wait(3)
-- 黄色でも
for brightness = 0, 15, 0.5 do
task.wait()
redLight.Brightness = redLight.Brightness - 0.5
yellowLight.Brightness = brightness
greenLight.Brightness = greenLight.Brightness - 0.5
end
task.wait(3)
-- 緑色でも
for brightness = 0, 15, 0.5 do
task.wait()
redLight.Brightness = redLight.Brightness - 0.5
yellowLight.Brightness = yellowLight.Brightness - 0.5
greenLight.Brightness = brightness
end
task.wait(3)
end
14.2. 自作関数②
先ほど作成したスクリプトに少し手を加えて、ライトが緑から赤に切り替わる前に緑を点滅させたいです。
現在のスクリプトでは、ライトの明るさをゆっくり変更するためにfor文を使用して、ライトのBrightnessプロパティを徐々に変更していますが、同じような処理が3つ並んでいます。
これらをコピー&ペーストして緑色のライトを点滅させる処理を追加しても良いのですが、自作関数と呼ばれる機能を使用すればスクリプトが格段に見やすくなります!
自作関数とは、特定の処理を行う関数を自分で作成し、似た処理を何度も書く手間を省くことができる機能です。
print関数、task.wait関数、math.random関数など既存の関数ではなく、自分オリジナルの関数を作成できるということです!
今回は、ライトの明るさを徐々に変更する関数を作ります。
関数の作り方はとても簡単で、以下で作成できます。
local function 自作関数の名前()
-- ここに自作関数が行う処理を書く
end
ためしにこんにちは
と出力する関数を作成してみましょう。関数の名前は好きな名前で構いません。
local function test()
print("こんにちは")
end
関数を実行するには、いつも関数を実行するときと同じように、関数の名前()
と書きます。
-- 名前が"test"の関数を作成する
local function test()
print("こんにちは")
end
test()
-- 出力ウィンドウでは... --
こんにちは
それでは、自作関数の作り方を学んだので、実際にライトの明るさを徐々に変更する関数を作ってみましょう!
for文を使用している部分をそのまま関数として作成し、処理を置き換えましょう。
以下がスクリプト全文です。
-- 3色のパーツの中に作成したPointLightを各変数に代入しておく
local redLight = workspace.Red.PointLight
local yellowLight = workspace.Yellow.PointLight
local greenLight = workspace.Green.PointLight
-- ライトの明るさを変更する自作関数を作成する
local function changeLight()
for brightness = 0, 15, 0.5 do
task.wait()
redLight.Brightness = brightness
yellowLight.Brightness = yellowLight.Brightness - 0.5
greenLight.Brightness = greenLight.Brightness - 0.5
end
end
while true do
-- 徐々に赤色のライトの明るさを上げ、ほかは下げる
changeLight()
task.wait(3)
changeLight() -- 黄色でも
task.wait(3)
changeLight() -- 緑色でも
task.wait(3)
end

スクリプトが見やすくなった!
しかし、このスクリプトには問題があります。
すでにお気づきかもしれませんが、作成したchangeLight
関数は赤色のライトを明るくする処理のみを行うので、信号機が正しく動作しません。
これを解決するために引数と呼ばれる機能を利用して、関数を実行する時に明るくしたいライトを指定できるようにしましょう。
引数とは、関数を実行するときに関数に任意の値を渡す機能です。
これまでの、print関数に渡した出力したい値や、task.wait関数に渡した待ちたい時間の数値も引数です。
引数の使い方はとてもかんたんです。以下のように書くと使用できます。
local function test( 引数を代入する変数名 )
end
test( 関数に渡したい値〔引数〕)
for文のときと同じように、関数の()
内で定義した変数は関数の中でしか使用できません。
ためしに引数を利用して、受け取った数値に5
を足して出力する関数を作ってみましょう。
local function test(aaa)
-- 変数aaaには受け取った引数が代入されている
print(aaa + 5)
end
test(10)
test(5)
test(0)
-- 出力ウィンドウでは... --
15
10
5

引数があれば、ひとつの関数でできることが一気に増えるんじゃね?知らんけど。
実践
それでは引数を使用して、先ほど作成したchangeLight
関数を修正しましょう!
changeLight
関数に明るくしたいライトを渡せるようにして、受け取ったライトの明るさを上げるようにすれば良さそうですね。
一度ご自身で書いてみて、どうしても分からない場合は以下のスクリプトをご確認ください。
スクリプト例
あくまでこのスクリプトは一例で、動けば問題ありません!
-- 3色のパーツの中に作成したPointLightを各変数に代入しておく
local redLight = workspace.Red.PointLight
local yellowLight = workspace.Yellow.PointLight
local greenLight = workspace.Green.PointLight
-- ライトの明るさを変更する自作関数を作成する
-- 明るくするライトを引数として受け取る
local function changeLight(light)
for brightness = 0, 15, 0.5 do
task.wait()
redLight.Brightness = redLight.Brightness - 0.5
yellowLight.Brightness = yellowLight.Brightness - 0.5
greenLight.Brightness = greenLight.Brightness - 0.5
--[[ 上ですべてのライトの明るさを下げていますが、
ここでプロパティを変更しなおしているので問題ありません。]]
light.Brightness = brightness
end
end
while true do
-- 徐々に赤色のライトの明るさを上げ、ほかは下げる
changeLight(redLight)
task.wait(3)
changeLight(yellowLight) -- 黄色でも
task.wait(3)
changeLight(greenLight) -- 緑色でも
task.wait(3)
end
14.3. 自作関数③
自作関数を使用してスクリプトが見やすくなったので、14.2. 自作関数②の目標だった「赤色になる前に緑色のライトを点滅する」プログラムを書いてみましょう!
ですが、先ほど作成した点灯するライトを切り替えるchangeLight
関数には、指定したライトを消灯させる機能はありません。
changeLight
関数に少し変更を加えて、受け取った引数が空っぽだったらどのライトも明るくしないようにしましょう!
一度ご自身で書いてみて、どうしても分からない場合は以下の変更後の関数をご確認ください。
変更後の関数
local function changeLight(light)
for brightness = 0, 15, 0.5 do
task.wait()
redLight.Brightness = redLight.Brightness - 0.5
yellowLight.Brightness = yellowLight.Brightness - 0.5
greenLight.Brightness = greenLight.Brightness - 0.5
-- 受け取った引数がnil(空っぽ)でなければ、明るくする
if light ~= nil then
light.Brightness = brightness
end
end
end
これでライトをすべて消灯出来るようになりました!
つづいて、緑色のライトを点滅させる時は明るさが切り替わる速度を速めたいので、もう一度関数に変更を加えましょう。
切り替わる速度も引数として渡せるようにすれば使いやすそうですね!

切り替わる速度を引数にすれば使いやすい関数になるんじゃね?知らんけど。
以下の例をご覧いただくと分かる通り、,
で区切ることで、引数は好きなだけ渡せます。
local function test(aaa, bbb, ccc, hahaha)
-- 引数として受け取った3つの数値の合計を変数に代入する
local result = aaa + bbb + ccc
-- result変数と、受け取った文字列をつなげて出力する
print(hahaha .. result)
end
test(1, 1, 1, "1を3回足した数: ")
test(1, 2, 3, "1, 2, 3を足した数: ")
test(0, 0, 0, "0を3回足した数: ")
それではchangeLight
関数が受け付ける引数をひとつ増やして、明るさが切り替わる速度を渡せるようにしましょう!
一度ご自身で書いてみて、どうしても分からない場合は以下の変更後の関数をご確認ください。
変更後の関数
local function changeLight(light, speed)
-- 2つ目の引数で切り替え速度を受け取り、その値をfor文に使用する
for brightness = 0, 15, speed do
task.wait()
-- ライトが暗くなる速度も受け取った引数を使用する
redLight.Brightness = redLight.Brightness - speed
yellowLight.Brightness = yellowLight.Brightness - speed
greenLight.Brightness = greenLight.Brightness - speed
if light ~= nil then -- light引数が空っぽ(nil)じゃなかったら
light.Brightness = brightness
end
end
end
changeLight
関数に必要な機能はそろいました!
信号機のスクリプトに、赤色になる前に緑色のライトが数回点滅する機能を追加しましょう。
こうなればOK!
一度ご自身で書いてみて、どうしても分からない場合は以下の変更後の関数をご確認ください。
スクリプト例
-- 3色のパーツの中に作成したPointLightを各変数に代入しておく
local redLight = workspace.Red.PointLight
local yellowLight = workspace.Yellow.PointLight
local greenLight = workspace.Green.PointLight
local function changeLight(light, speed)
for brightness = 0, 15, speed do
task.wait()
redLight.Brightness = redLight.Brightness - speed
yellowLight.Brightness = yellowLight.Brightness - speed
greenLight.Brightness = greenLight.Brightness - speed
if light ~= nil then
light.Brightness = brightness
end
end
end
while true do
-- 徐々に赤色のライトの明るさを上げ、ほかは下げる
changeLight(redLight, 0.5)
task.wait(3)
changeLight(yellowLight, 0.5) -- 黄色でも
task.wait(3)
changeLight(greenLight, 0.5) -- 緑色でも
task.wait(3)
-- 緑色のライトを点滅させる
local isLightOn = true
for count = 1, 6 do
task.wait(0.5)
if isLightOn then -- isLightOn変数がtrueだったらライトをオフ
isLightOn = false
ChangeLight(nil, 2)
else -- falseだったらライトをオン
isLightOn = true
ChangeLight(greenLight, 2)
end
end
end
14.4. 自作関数④
パーツに対して、上の方向にランダムな大きさの物理的な力を加えるスクリプトを書いてみましょう。
パーツを作成し、その中
スクリプトを作成してください。

エクスプローラのようす⇩
パーツに重力の影響を受けてほしいので、Anchoredプロパティはオフにしましょう。
せっかくなので、自作関数を使用してスクリプトを書いてみましょう。
パーツにはVector3型 (位置型)のAssemblyLinearVelocityプロパティがあります。
このプロパティはパーツの物理的な速度を指します。
これを活用したスクリプトで、3秒ごとにプロパティを変更してランダムなスピードでパーツを上に飛ばすようにしましょう。
一度ご自身で書いてみて、どうしても分からない場合は以下をご確認ください。
スクリプト例
-- パーツを変数に代入
local part = script.Parent
-- パーツを上に飛ばす関数を作成
local function pushPartUp()
local randomForce = math.random(30, 200)
-- Y軸のみに力を加える
part.AssemblyLinearVelocity = Vector3.new(0, randomForce, 0)
end
-- 3秒ごとにパーツを上に飛ばす
while true do
pushPartUp()
task.wait(3)
end
パーツが上に飛んでいけば成功です!
動きがカクカクしているかもしれませんが、これはパーツの物理的な動作がサーバーからクライアントに送信される時に発生する遅延などの影響です。
サーバーとクライアントの違いを説明すると長くなってしまうので今回は省きますが、気になる方はこの解説がおすすめです⇩
このスクリプトでも動作しますが、パーツに与えた力によって待ち時間が変われば面白いですね。
パーツが高くまで飛んだら、その分地面に落下する時間も長くなるので待ち時間を延ばして、パーツがほとんど飛ばなかったらすぐに地面に落下するので、待ち時間を短くするという感じです。
これを実現するために、戻り値を使用します。
自作関数では、戻り値を決めることができます。

戻り値については、12. 関数の戻り値でやったね!
いま思い返してみると、戻り値は引数の反対のものと考えることができるね。
引数は、実行元が関数に値を渡す。そして戻り値は、関数が実行元に値を渡す。
それぞれ、インプットとアウトプットの役割があるんだね!
戻り値を返すには、関数内でreturn 返したい戻り値
というかたちで書きます。
これが実行されると、まだ下にプログラムが書いてあっても関数が終了され、実行元に値が渡されます。
以下が自作関数での戻り値の使い方です。
local function test(abc)
print("受け取った数値:" .. abc)
return abc * 100 -- 100をかける
end
-- 3×100 の結果がresult変数に代入される
local result = test(3)
print("戻り値: " .. result)
それでは戻り値を使用して、パーツに与えられた力によって待ち時間が変わるようにスクリプトを変更しましょう!
一度ご自身で書いてみて、どうしても分からない場合は以下をご確認ください。
スクリプト例
local part = script.Parent
local function pushPartUp()
local randomForce = math.random(30, 200)
part.AssemblyLinearVelocity = Vector3.new(0, randomForce, 0)
return randomForce
end
while true do
local force = pushPartUp() -- 戻り値を変数に代入
task.wait(force / 50) -- 与えた力÷適当な秒数(ここでは50秒)だけ待つ
end

ランダムな数字の範囲とか、待つ秒数の数値をいろいろ変えてみたら面白いんじゃね?知らんけど。
以上です!
最後まで読んでいただき、ありがとうございました!そしてここまでの学習、おつかれさまでした。
この記事はいかがだったでしょうか?改善点や質問・疑問があれば、ぜひ一番下の記事コメントでお知らせください。
スクリプトがつかえるようになれば本当に多くのことができるようになります。
なので、これからゲーム制作がより楽しくなるはずです!
次のステップとして、スクリプトを深堀りしていくことをおすすめします!
この記事では紹介しきれなかったローカルスクリプトや
モジュールスクリプト、プレイヤーが特定のパーツに触ったことを検知することなどができるイベント、プレイヤーのデータを保存するDataStoreServiceなど…まだまだたくさんの機能があります。
好評であればまた、スクリプトについて深掘りした記事を書くかもしれませんが、ご自身で調べて学んでいくこともできます。
現状、Roblox Studioについてのサイトは英語のものがほとんどですが、翻訳などを駆使しながら公式サイトや公式フォーラムでクリエーターの方々が作ったチュートリアルを見てみたりなど、方法はたくさんあります。
もし学んでいる途中でつまづいてしまったり、わからないことを質問したくなったら、Discordコミュニティ「Roblox好きの集い」※13歳以上対象がおすすめです。
主にRobloxプレイヤーが多いですが、ゲーム開発者もたくさんいるので気軽に質問できます。このページ下部に参加ボタンがありますので、覗いてみてください!
(ステマじゃないですよ!!この段落はChocolateAntsさん原案ですからね by )
それでは、この記事はここまで。最後までご覧いただき、ありがとうございました!!


著作
ChocolateAnts
Robloxで総プレイ数6億回を記録した「ひみつのおるすばん」などを制作しているクリエーター。


編集
Mint
Roblox日本人コミュニティ「Roblox好きの集い」で、上級モデレーターとして運営に携わる。

.rbxl
ファイルなにやら制作中のようす⋯⇩