クリエイターの教科書

Excel, ChatGPT, Stable Diffusion, Visual Studioなどの教科書

【Robloxゲームの作り方】スクリプトを書く 場所は?サンプルは?

Robloxでは、スクリプト、つまりプログラムを書くことができます。

いきなり全部をやるのは難しいですが、さわりの部分をまず覚えましょう。

Robloxでスクリプトを書く

MS-DOS Green 3 Underexposed

Robloxではスクリプトを書くことができます。

 

LUAというプログラミング言語をサポートしており、LUAの書き方で命令を書いていけばそのとおり制御できます。

 

LUAの文法については以下参照ください。 

LUAの書き方

Moon

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) do

    print(ver)

end

 

数字の場合はiparisを使います。

t = {}

t[0] = "str1"

t[1] = "str2"
for i, ver in iparis(t) do

    print(ver)

end

 

 

 

 

コマンド出力を使う

文字を出力

まずは「表示(View)」タブへ移動。

「出力(Output)」を選択。

f:id:apicode:20211103152946p:plain


するとでプログラムからの出力が画面上で確認できるようになります。

f:id:apicode:20211103153110p:plain

 

「コマンドバー(Command Bar)」を押すと

f:id:apicode:20211103153206p:plain

 

コマンド入力部が下側に出てきます。

f:id:apicode:20211103153156p:plain



するとRobloxStudioの下のほうにコマンド入力部分が出現します。

print('ok bokujo')

と入れてエンターキーを押します。

 

「print~」は文字を出力しなさいという命令です。

f:id:apicode:20191125145458p:plain

 

実行すると、出力のほうのパネルに「ok bokujo」と出力されます。

f:id:apicode:20191125145446p:plain

 

 

日本語も使えます。

「print('こんちわーっす')」で、「こんちわーっす」と出力されます。これなら脳みそ夫さんも一安心です。

f:id:apicode:20191125145801p:plain

 

計算させる

計算もできます。

print(1+2)

とうつと...ちゃんと「3」と出力されました。

f:id:apicode:20191125150023p:plain

 

このようにコマンドバーを使うだけでも、命令を実行させて結果を確認することができます。

 

 

ただしプログラミングの面倒なところは、細かいところでルールがいろいろとあります。

例えば「print(1+2)」で「3」となりますが、「print("1+2")」なら「1+2」と出力されます。

「”」や「’」で囲まれたものは文字として扱うというルールがあるためです。

f:id:apicode:20191125150234p:plain

 

 

ゲームで動くスクリプトを書く

スクリプトを作成

今度はゲームの中で動くスクリプトを書いてみます。

 

右のツリーでワークスペース(Workspace)を選んで右クリックします。

メニューから「オブジェクト挿入(Insert Objects)」で「スクリプト(Script)]を選びます。

f:id:apicode:20191125204233p:plain

 

するとスクリプトが挿入され、このようにスクリプトを書く画面が出てきます。

これは右のツリーでスクリプトをダブルクリックすればいつでも開けます。

命令としてすでに「print("hellow world")とあります。

f:id:apicode:20191125204237p:plain

 

ゲームを実行すると、「Hello World」という文字が下のコンソールへ出てきます。

f:id:apicode:20191125204238p:plain

 

スクリプトで特定の情報を調べる

今度は創っている物体の情報へスクリプトから調べてみましょう。

まず「Ball」という名前の物体を作っておきましょう。

そしてスクリプトに

print(game.Workspace.Ball.Transparency)

と入力します。

f:id:apicode:20191125204630p:plain

 

これは現在のゲームのなかのWorkspaceのなかのBallという物体のTransparency(透明度)という項目へアクセスすることを意味します。

調べた情報を「print」でコンソールへ書き出します。

f:id:apicode:20191125204634p:plain

 

実行するとこのようになります。

本来なら「0.15」と出るべきところが「0.1499999..」となっています。

おそらく「0.15」に設定したものの、ゲームの最適化の都合上近似値になっているのだと思います。

f:id:apicode:20191125204758p:plain

 

スクリプトで特定の情報を変更する

スクリプトから特定の値を変更することもできます。

 

ステージ上にBallという物体を作っています。この透明度を変更してみます。

f:id:apicode:20191125205301p:plain

Ballという物体がすでにあるとします。

スクリプトに 

game.Workspace.Ball.Transparency = 0.9

と入力しましょう。

 

これは現在のゲームのなかのWorkspaceのなかのBallという物体のTransparency(透明度)という項目を「0.9」に設定することを表します。

f:id:apicode:20191125205330p:plain

 

実行するとBallという物体の透明度が0.9へ変更されました。

ほとんど消えかかっているのがわかると思います。これはスクリプトがゲーム開始時に実行されたためです。

f:id:apicode:20191125205059p:plain

 

スクリプト例:イベント

「物体にふれるとアクションが発生する」というような場合、「どんなイベントか」と「それに対する反応」を記述していきます。

 

パルクールのようにぶつかったらヘルスが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」として指定できます。

オブジェクトの見える度を一定間隔でオンにしたりオフにしたりします。

f:id:apicode:20210518092036p:plain

 

ループ(繰り返し)させるので、「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」という場所に格納するとよいでしょう。

f:id:apicode:20210519100422p:plain

 

 

重力の値を変更すると、月のような世界が作れます。

workspace.Gravity = 10

 

Lighting(ライティング)」のところに「ClockTime(クロックタイム=時刻)」があるので、それを0にセットすると夜になります。

game.Lighting.ClockTime = 0

 

 

 

スクリプトの小技

オフにするには?

行頭に「--」を入れるとその行は無効となり実行されません。

行自体が緑色となり、無効であることがわかるようになります。

f:id:apicode:20191126092247p:plain

 

 

スクリプトの場所を調べるには?

他のゲームを開いて作り方を調べる時、スクリプトの場所は見つけにくいです。

そのとき「エクスプローラー(Explorer)」のところで「Script」とうつと、スクリプトだけ一覧できます。

以下のようにアイテム1つ1つに書かれている場合もあれば、別の場所に全体を制御するスクリプトががっつり書かれている場合もあります。

f:id:apicode:20191126092359p:plain

 

使えるコマンド一覧は?

Robloxにレファレンスがあります。

https://developer.roblox.com/en-us/api-reference

 

 

Configurationとは?

Robloxのテンプレートを見ているとConfigurationフォルダというのがよくつかわれています。

f:id:apicode:20210520202503p:plain

 

ただ、使おうと思っても、上記のように「Speed」アイテムが追加データにはないので使い方がよくわかりませんでした。

 

結局、これは変数の値をスクリプトの外にセットできる...という機能のようでした。

 

例えば速度を変えたい場合に、Configuratioに入れていたデータだけ変更すればよくなります。

 

ということは、複数人で開発しているときも、個別のデータの変更をしたい場合に別の人が変更させやすくなるわけです。

 

 

使うには「Configuration」を挿入します。

f:id:apicode:20210520202750p:plain

 

Configurationを選択してさらに追加します。数値ならIntValueを、色ならColor3Valueを追加します。

f:id:apicode:20210520202949p:plain

 

試しにIntValueを追加します。

追加したら名前を「Speed」、値(Value)を「10」などにセットします。

名前は何でもいいですが、わかりやすいものにしておきましょう。

f:id:apicode:20210520202952p:plain

 

ここでセットされた数値は

script.Parent.Configuration.Speed.Value

のようにしてスクリプトのほうから取り出すことができます。

 

そうすれば数値を変更したい場合にスクリプトを上書きするのではなく、Configurationフォルダ内に作ったデータの値を変更するだけで済むようになります。

 

このブログは、ネットや書籍上の情報、個人の体験や感想を中心にまとめたものです。 正確性を期していはいますが、間違い・誤訳等あるかもしれません。 当サイトの情報によって生じたいかなる損失について一切の責任を負わないものとします. あらかじめご了承ください。

プライバシーポリシー |〇利用規約 |〇問い合わせ