Robloxでは、スクリプト、つまりプログラムを書くことができます。
いきなり全部をやるのは難しいですが、さわりの部分をまず覚えましょう。
Robloxでスクリプトを書く
Robloxではスクリプトを書くことができます。
LUAというプログラミング言語をサポートしており、LUAの書き方で命令を書いていけばそのとおり制御できます。
LUAの文法については以下参照ください。
LUAの書き方
LUAとは?
LUAはポルトガル語で月という意味。リオデジャネイロ・カトリカ大学のメンバーらによって開発されたプログラミング言語です。
LUAを組み込んだシステムはいろいろとあり、Robloxでも採用されています。
コメントアウト
1行は行頭に「--」をいれます。
-- print("test")
複数行は「--」「--」で囲みます。
--[[
print("A")
print("B")
--]]
文字操作
連結は「..」を使います。
s1 = "日本の首都は "
s2 = "東京"
S3 = s1 .. s2
変数
変数はint、stringなど区分せずに「local」でいくようです。
local a= 1
IF
IF文も利用できます。「if ~ then」「end」ではさみます。
if x == 1 then
print("OK")
end
「&&」は「AND」、「||」は「OR」です。
「elseif」も利用可能。
「x ~= y」のように 「~=」が使われる場合があります。これはC言語などでは「!=」であり、xがyと等しくないことを表します。
関数
関数も「local」として定義できます。
local function sampleFunc(number)
return number + 1
end
ループ
1から5までのループは以下のような「For」文です。
for count = 1, 5 do
print(count)
end
「While」も利用可能。
while true do
print("Looping...")
wait(0.5)
end
連想配列
LUAではテーブルと呼ばれる形式を利用します。
local dictionary = {
val1 = "A",
val2 = "B"
}
キーとして文字列が使われるとpairs関数でループできます。
t = {}
t["str1"] = "str1"
t["str2"] = "str2"
for i, ver in pairs(t) doprint(ver)
end
数字の場合はiparisを使います。
t = {}
t[0] = "str1"
t[1] = "str2"
for i, ver in iparis(t) do
print(ver)
end
コマンド出力を使う
文字を出力
まずは「表示(View)」タブへ移動。
「出力(Output)」を選択。
するとでプログラムからの出力が画面上で確認できるようになります。
「コマンドバー(Command Bar)」を押すと
コマンド入力部が下側に出てきます。
するとRobloxStudioの下のほうにコマンド入力部分が出現します。
print('ok bokujo')
と入れてエンターキーを押します。
「print~」は文字を出力しなさいという命令です。
実行すると、出力のほうのパネルに「ok bokujo」と出力されます。
日本語も使えます。
「print('こんちわーっす')」で、「こんちわーっす」と出力されます。これなら脳みそ夫さんも一安心です。
計算させる
計算もできます。
print(1+2)
とうつと...ちゃんと「3」と出力されました。
このようにコマンドバーを使うだけでも、命令を実行させて結果を確認することができます。
ただしプログラミングの面倒なところは、細かいところでルールがいろいろとあります。
例えば「print(1+2)」で「3」となりますが、「print("1+2")」なら「1+2」と出力されます。
「”」や「’」で囲まれたものは文字として扱うというルールがあるためです。
ゲームで動くスクリプトを書く
スクリプトを作成
今度はゲームの中で動くスクリプトを書いてみます。
右のツリーでワークスペース(Workspace)を選んで右クリックします。
メニューから「オブジェクト挿入(Insert Objects)」で「スクリプト(Script)]を選びます。
するとスクリプトが挿入され、このようにスクリプトを書く画面が出てきます。
これは右のツリーでスクリプトをダブルクリックすればいつでも開けます。
命令としてすでに「print("hellow world")とあります。
ゲームを実行すると、「Hello World」という文字が下のコンソールへ出てきます。
スクリプトで特定の情報を調べる
今度は創っている物体の情報へスクリプトから調べてみましょう。
まず「Ball」という名前の物体を作っておきましょう。
そしてスクリプトに
print(game.Workspace.Ball.Transparency)
と入力します。
これは現在のゲームのなかのWorkspaceのなかのBallという物体のTransparency(透明度)という項目へアクセスすることを意味します。
調べた情報を「print」でコンソールへ書き出します。
実行するとこのようになります。
本来なら「0.15」と出るべきところが「0.1499999..」となっています。
おそらく「0.15」に設定したものの、ゲームの最適化の都合上近似値になっているのだと思います。
スクリプトで特定の情報を変更する
スクリプトから特定の値を変更することもできます。
ステージ上にBallという物体を作っています。この透明度を変更してみます。
Ballという物体がすでにあるとします。
スクリプトに
game.Workspace.Ball.Transparency = 0.9
と入力しましょう。
これは現在のゲームのなかのWorkspaceのなかのBallという物体のTransparency(透明度)という項目を「0.9」に設定することを表します。
実行するとBallという物体の透明度が0.9へ変更されました。
ほとんど消えかかっているのがわかると思います。これはスクリプトがゲーム開始時に実行されたためです。
スクリプト例:イベント
「物体にふれるとアクションが発生する」というような場合、「どんなイベントか」と「それに対する反応」を記述していきます。
パルクールのようにぶつかったらヘルスが0になるという場合「Touched」というイベントについて記述します。
script.Parent.Touched:connect(function(hit)script.Parent.Touched:connect(function(hit)
if hit and hit.Parent and hit.Parent:FindFirstChild("Humanoid") then
hit.Parent.Humanoid.Health = 0
end
end
例えばボタンが押されたら押されたよ、というスクリプトなら「MouseButton1Click」へのイベントに対する処理を記述します。
function leftClick()function leftClick()
print("Left mouse click")
end
script.Parent.MouseButton1Click:Connect(leftClick)
スクリプト例:タッチしたら実行
タッチしたらヘルスが0になるスクリプトは以下のようになります。
local trapPart = script.Parent
local function onPartTouch(otherPart)
local partParent = otherPart.Parent
local humanoid = partParent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = 0
end
end
trapPart.Touched:Connect(onPartTouch)
スクリプト例:ボタンを押したら
ボックスをボタン代わりにしてタッチして反応するスクリプトは以下のようになります。
関数を書いたら、ボタンが押されたときにその関数を実行するように接続します。
local button = script.Parent
local function onButtonActivated()
print("Buttonがおされた!")
end
button.Activated:Connect(onButtonActivated)
スクリプト例:ユーザを調べる
「ServerScriptService」フォルダに追加したスクリプトにおいて、ユーザを調べたり属性を変更します。
参加者の名前を出力する
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. "が参加しました")
end)
Players.PlayerRemoving:Connect(function(player)
print(player.Name .. "が離脱しました")
end)
スクリプト例:触るとテレポート
移動元のブロック(TP1)と、移動先のブロック(TP2)を用意しておきます。
TP1にタッチしたら、アバターのCFrame(座標)をTP2へ移動します。
local function doTeleport(part)
local humanoid = part.Parent:FindFirstChild("HumanoidRootPart")
if humanoid then
humanoid.CFrame = script.parent.TP2.CFrame + Vector3.new(0, 5, 0)
end
end
script.parent.TP1.Touched:Connect(doTeleport)
スクリプト例:触るとコンベイヤー
上記移動スクリプトの応用例で、コンベイヤーベルト上で移動するような場合です。CFrameを少しづつ動かします。
script.Parent.Touched:connect(function(hit)
local humanoid = hit.Parent:FindFirstChild("HumanoidRootPart")
if humanoid then
humanoid.CFrame = humanoid.CFrame + Vector3.new(0.3, 0, 0)
end
end)
スクリプト例:触ると歩くスピードがアップ
アバターの「WalkSpeed」を設定することで、早く走ったりゆっくり走ったりさせることができます。
script.Parent.Touched:connect(function(hit)
if hit and hit.Parent and hit.Parent:FindFirstChild("Humanoid") then
hit.Parent.Humanoid.WalkSpeed = 50
end
end)
スクリプト例:触るとジャンプ
触ったら「Jump 」をtrueにします。
script.Parent.Touched:connect(function(hit)
if hit and hit.Parent and hit.Parent:FindFirstChild("Humanoid") then
hit.Parent.Humanoid.JumpPower = 100
hit.Parent.Humanoid.Jump = true
end
end)
スクリプト例:触ると死ぬ
タッチしたアバターのHealthパラメータを0にします。
script.Parent.Touched:connect(function(hit)
if hit and hit.Parent and hit.Parent:FindFirstChild("Humanoid") then hit.Parent.Humanoid.Health = 0
end
end)
スクリプト例:顔のテクスチャを変更
あらかじめ顔のアセットIDが必要。「http://www.roblox.com/asset/?id=7080078」へ変更するには以下のように書きます。
実際にはDecalを活用して、IDの個所だけ外においていたほうが変更はしやすくなります。
local head = script.Parent
script.Parent.Touched:connect(function(hit)
local h = hit.Parent:findFirstChild("Humanoid")
if h~=nil then
if hit.Parent:findFirstChild("Head"):findFirstChild("face").Texture == nil then return end hit.Parent:findFirstChild("Head"):findFirstChild("face").Texture="http://www.roblox.com/asset/?id=7080078"
end
end
スクリプト例:点滅するオブジェクト
スクリプトは物体の中にセットできます。その場合、物体自体は「script.Parent」として指定できます。
オブジェクトの見える度を一定間隔でオンにしたりオフにしたりします。
ループ(繰り返し)させるので、「wait」で強制的に待機時間を追加しています。
while true do
script.Parent.Transparency = 1
wait(1)
script.Parent.Transparency = 0
wait(1)
end
スクリプト例:移動・回転するオブジェクト
scriptで回転させる場合、オブジェクトのCFrameに移動距離や角度をかけていきます。
CFrameは「coordinate frame(座標フレーム)」のことで3D空間における位置や角度を表します。
移動させる場合、移動用のCFrameを定義して現在のCFrameに追加します。
local p=script.parent
local cf = CFrame.new(1, 0, 0)
while true do
p.CFrame = p.CFrame * cf
wait(0.5)
end
回転させる場合、角度のCFrameを作ります。45度の場合ラジアン計算を組み込みます。
local p=script.parent
local cf = CFrame.Angles(0, math.rad(45), 0)
while true do
p.CFrame = p.CFrame * cf
wait(0.5)
end
スクリプト例:ベルトコンベヤー
上に人が乗ると、人がベルトコンベヤーに乗った状態のようにオートで移動するスクリプトです。
local conveyor = script.Parent
conveyor.Velocity = conveyor.CFrame:vectorToWorldSpace(Vector3.new(0, 0, -10))
この設定がアクティブになるには、オブジェクトが「Anchor」プロパティに設定されていることが必要です。
スクリプト例:ワークスペース
ワークスペースは、作ったゲーム空間をひとまとめに指し示す元締めといったところでしょう。
ゲーム開始時に実行するスクリプトは「SeverScriptService」という場所に格納するとよいでしょう。
重力の値を変更すると、月のような世界が作れます。
workspace.Gravity = 10
Lighting(ライティング)」のところに「ClockTime(クロックタイム=時刻)」があるので、それを0にセットすると夜になります。
game.Lighting.ClockTime = 0
スクリプトの小技
オフにするには?
行頭に「--」を入れるとその行は無効となり実行されません。
行自体が緑色となり、無効であることがわかるようになります。
スクリプトの場所を調べるには?
他のゲームを開いて作り方を調べる時、スクリプトの場所は見つけにくいです。
そのとき「エクスプローラー(Explorer)」のところで「Script」とうつと、スクリプトだけ一覧できます。
以下のようにアイテム1つ1つに書かれている場合もあれば、別の場所に全体を制御するスクリプトががっつり書かれている場合もあります。
使えるコマンド一覧は?
Robloxにレファレンスがあります。
https://developer.roblox.com/en-us/api-reference
Configurationとは?
Robloxのテンプレートを見ているとConfigurationフォルダというのがよくつかわれています。
ただ、使おうと思っても、上記のように「Speed」アイテムが追加データにはないので使い方がよくわかりませんでした。
結局、これは変数の値をスクリプトの外にセットできる...という機能のようでした。
例えば速度を変えたい場合に、Configuratioに入れていたデータだけ変更すればよくなります。
ということは、複数人で開発しているときも、個別のデータの変更をしたい場合に別の人が変更させやすくなるわけです。
使うには「Configuration」を挿入します。
Configurationを選択してさらに追加します。数値ならIntValueを、色ならColor3Valueを追加します。
試しにIntValueを追加します。
追加したら名前を「Speed」、値(Value)を「10」などにセットします。
名前は何でもいいですが、わかりやすいものにしておきましょう。
ここでセットされた数値は
script.Parent.Configuration.Speed.Value
のようにしてスクリプトのほうから取り出すことができます。
そうすれば数値を変更したい場合にスクリプトを上書きするのではなく、Configurationフォルダ内に作ったデータの値を変更するだけで済むようになります。