Roblox コース mission02
アスレチックで冒険!(後編)
■Chapter1 障害物を作ろう
■Chapter2 ジャンプ床を作ろう
■Chapter3 すり抜けてしまう床を作ろう
■Chapter4 移動する床を作ろう
■Chapter5 ゲームをより面白くしていこう
■【応用編】 大砲を作ろう
■完成コード
Chapter1 障害物を作ろう
障害物となるオブジェクトを作る
触れたらゲームオーバーになる障害物を作 っていきます。今までは Block を使って足 場を作っていました。今回は足場と違うオ ブジェクトだと分かるように違う形で作っ ていきましょう。
確認がしやすいように、スタートしてすぐ の足場に移動します。Part→Sphere を選ん で球体のオブジェクトを追加します。
追加したオブジェクトを選択した状態で Ex plorer を見てみましょう。右クリック→Re name をクリックして、名前を「Trap」な どの分かりやすい名前にしておきましょう。
色も変えておきましょう。例では赤色にし ておきます。
2
©D-SCHOOL All Rights Reserved. アスレチックで冒険!(後編)
障害物にプログラミングする準備
障害物となるオブジェクトを追加したので 早速プログラミングをしていきましょう。
障害物は「キャラクターが触れたらゲーム オーバーになる」ようにプログラミングし ていきます。
プログラミングができるように、Trap に S cript を追加しましょう。
追加した Script の名前を「TrapScript」と いう名前に変えておきましょう。
TrapScript を開きます。すると、print(“He llo world!”)と書かれた行が最初から追加 されています。今回は使わないので消して おきましょう。
障害物のプログラミング
まずは障害物が何かに触れたときに関数が 実行されるようにしましょう。
今回は 1 行目に変数を作って script.Parent を格納しておきましょう。こうすることで 毎回 script.Parent と打たなくても trap と 打つだけでよいのでコードが短くなります。
また、変数の名前を見るだけで何に対して プログラミングをしているのかが分かりや すくなります。
何かが触れたときに関数が実行されるよう に Touched イベントに onTouch 関数を書 いてあげます。この内容は mission1 の内容 と同じですが、コードをすべて覚えておく 必要はありません。思い出せれば OK です。
TrapScript
1 print("Hello world!")
TrapScript
1 local trap = script.Parent
TrapScript
1 2 3 4 5 6 7
local trap = script.Parent
function onTouch(hit)
end
trap.Touched:Connect(onTouch)
「Hello world!」は初めてプログ ラミングをするときの挨拶のよ うなもの!今後は Script を追加 したら消しておこう!
続いて、onTouch 関数を書いていきます。
キャラクターが触れたときだけゲームオー バーにしたいので、キャラクターかどうか 判定するコードを追加します。
触れたら体力を0にする
キャラクターが触れたときにゲームオーバ ーにするようにしていきます。
1 度ゲームを実行してキャラクターの中の Humanoid を選択してみます。すると Prop erties の中の情報が更新され、色々な項目が 出てきます。Propertiesにはオブジェクト が持っている情報が表示され、その1つ1 つの情報をプロパティと言います。Human oid のプロパティの中には、キャラクターの 体力である Health という情報を持ってい ますので、この値を 0 にすることでゲーム オーバーにします。
TrapScript
1 2 3 4 5 6 7 8 9
local trap = script.Parent
function onTouch(hit)
if hit.Parent:FindFirstChild("Humanoid") then
end end
trap.Touched:Connect(onTouch)
4
FindFirstChild という関数は、オブジェクト を見つけるとそのオブジェクトを結果とし て返してくれる関数でもあります。今回は 見つけてきた Humanoid というオブジェク トの体力を変えたいので、1 度変数に入れて おきます。
5 行目の if で humanoid の中身があるかを 判定し、あったら体力の情報である Health を 0 にしてあげます。
ゲームを実行して Trap に触れてみます。す ると、キャラクターがバラバラになり、ゲー ムオーバーになってくれます。
このままだと Trap に触れたときに Trap が 転がってしまいます。ゲームを停止してか ら Anchor を設定しておきましょう。
TrapScript
1 2 3 4
5 6 7 8 9 10
local trap = script.Parent
function onTouch(hit)
local humanoid = hit.Parent:FindFirstChild("H umanoid")
if humanoid then humanoid.Health = 0 end
end
trap.Touched:Connect(onTouch)
Chapter2 ジャンプ床を作ろう
ジャンプ床の追加
続いて、触れるとジャンプ力が上がる床を 作っていきましょう。今回は板のようなオ ブジェクトに触れるとジャンプ力が上がる ようにしたいので、Part→Block を追加し、
板のように Scale を調整します。色も変え ておくと分かりやすいので変えておきまし ょう。
オブジェクトの名前も「Jump」に変えてお きます。Jump にプログラミングをしていく ので、Script を追加し、名前を「JumpScr ipt」に変えておきましょう。
ジャンプ力のプロパティ
それでは早速ジャンプ床のプログラムを書 いていきましょう。もう一度ゲームを実行 して Humanoid のプロパティを見てみると、
JumpPowerというプロパティがあります。
JumpPower はキャラクターのジャンプ力 の値で、最初の値は 50 になっています。
今回は JumpPower が変わるようにしてい きます。
プロパティの値は直接編集する ことができます。ゲームを実行中 に編集した場合はゲームを停止 するとプロパティの値はもとに 戻ります。JumpPower の数字を 色々設定してみましょう。
6 ジャンプ床のプログラミング
ジャンプ床のプログラミングをしていきま す。Jump にキャラクターが触れたら Jum pPower の値を変えてあげたいです。
これと似たようなことを Trap の時も書きま したね。今回も似たようなコードを書くの で、Trap のコードをコピーして使ってみま しょう。
TrapScript を開き、SCRIPT MENU の中の Select をクリックします。その中の Select All をクリックします。すると TrapScript のコード全体が選択されます。
コードを右クリックし、Copy を選択します。
JumpScript を開き、右クリック→Paste を クリックします。すると、JumpScript に T rapScript の内容が全てコピーされます。
このままだと Jump に触れると、Trap と同 様にゲームオーバーになってしまいます。
ジャンプ力の値である JumpPower を変更 したいので、Helath の部分を JumpPower に変えます。また、もともとの JumpPowe r は 50 でしたので、100 に変えるようにし
てみましょう。 JumpScript
1 2 3 4
5 6 7 8 9 10
local trap = script.Parent
function onTouch(hit)
local humanoid = hit.Parent:FindFirstChild("H umanoid")
if humanoid then
humanoid.JumpPower = 100 end
end
trap.Touched:Connect(onTouch)
①
②
③
ゲームを実行して Jump に触れてみます。
すると、ジャンプする高さが大きく変わっ たのが確認できます。
ギミックの調整
しかし、このままだとジャンプでかなりの 高さまで飛べるため、アスレチックゲーム が簡単にクリアできてしまいます。ですの で、ジャンプ床に触れてから 3 秒間だけジ ャンプ力が上がるように調整してみましょ う。
3 秒後にジャンプ力がもとに戻るようにするためにはどうすればいいでしょうか。
今までの内容を思い出して考えてみよう!
?
8
3 秒後に JumpPower を元に戻します。「~
秒待つ」という命令を書いてあげればいい ので wait(3)を書きます。そのあとに Jump Power を 50 にすればよいので JumpPowe r=50 と書けば元に戻ります。
このままだと、どのタイミングでジャンプ 力が戻ったかが分かりづらいので、print を 追加しておくといいでしょう。Output を見 ればいつジャンプ力が戻ったのかが分かる ようになります。
ゲームを実行して確かめてみましょう。床 を踏んでから 3 秒後に「終了!」と Outpu t に出て、実際にジャンプ力が戻っているこ とが分かります。
ジャンプ床の補足
しかし、今のままだとジャンプ床を踏むた びに Output にメッセージが出たり、ジャン プ床を踏み続けているのにジャンプ力が元 に戻ったりしていると思います。ジャンプ 床を踏んで、離れてから 3 秒後に元の値に 戻すことができれば、違和感のないギミッ クになりそうです。
JumpScript
1 2 3 4
5 6 7 8 9 10 11 12 13 14
local trap = script.Parent
function onTouch(hit)
local humanoid = hit.Parent:FindFirstChild("H umanoid")
if humanoid then
humanoid.JumpPower = 100 print("ハイジャンプモード!") wait(3)
humanoid.JumpPower = 50 print("ハイジャンプモード終了!") end
end
trap.Touched:Connect(onTouch)
ただし、これを実装するためには少し難し いプログラミングが必要になるので今回は このままにしておきます。また、ジャンプ床 は走り抜ければ違和感のないギミックとし て動作するので、遊ぶときにジャンプ床は 走り抜けるようにして遊んでみてください。
コードの修正
今回、JumpScript は TrapScript のコード をコピーしてきました。このとき、1 行目の script.Parent を代入している変数の名前が trap のままになっています。
このままでも問題なく動くのですが、今回 プログラミングするのは Jump に対してな ので、変数の名前も jump に変えておくと いいでしょう。
JumpScript
1 2 3 4
5 6 7 8 9 10 11 12 13 14
local jump = script.Parent
function onTouch(hit)
local humanoid = hit.Parent:FindFirstChild("H umanoid")
if humanoid then
humanoid.JumpPower = 100 print("ハイジャンプモード!") wait(3)
humanoid.JumpPower = 50 print("ハイジャンプモード終了!") end
end
jump.Touched:Connect(onTouch)
10
Chapter3 すり抜けてしまう床を作ろう
すり抜け床の準備
数秒おきにすり抜ける床を作っていきまし ょう。すり抜ける床を作るために、アスレチ ックの足場の中から、1 つ選び、すり抜ける 床にしていきます。
選んだ足場の名前は ColorChangeBlock に なっていると思いますので、名前を「FallB lock」にします。FallBlock に追加されてい る Script も「FallScript」という名前に変 えておきましょう。
床がすり抜けるようにするためには、FallBl ock の CanCollide というプロパティを変 えてあげます。CanCollide というプロパテ ィは、チェックが入っている状態だとキャ ラクターが上に乗ることができ、チェック が入ってない状態だと乗ることができず、
すり抜けるようになります。
つまり、すり抜けるかどうかをプログラミ ングするためには CanCollide を変更してあ げるようにしていきます。
すり抜け床のプログラミング
FallScript にプログラミングをしていきま しょう。まずは script.Parent を格納してお く変数を作っておきます。また、すり抜ける かどうかを変えていくので、CanCollide を 変更するようにコードを変えます。
Propertieies ではチェックが入っているか どうかで編集できましたが、コードからは t rue か false かで指定していきます。true は チェックが入っている状態、false はチェッ クが外れている状態になります。
FallScript
1 2 3 4 5 6 7 8
local fallBlock = script.Parent
while true do
fallBlock.CanCollide = true wait(2)
fallBlock.CanCollide = false wait(1)
end
最初は乗ることができるようにし、2 秒後に すり抜ける状態に、その 1 秒後に再度乗る ことが出来る状態にしてみます。
ゲームを実行して確認してみましょう。す ると、色を変えるコードを変えたので色は グレーのままです。乗ってみるとタイミン グによって乗ることができたり、すり抜け たりします。
しかし、このままだと、どのタイミングで乗 ればいいのか分からないですね。
見た目で分かるようにする
いつ乗れるのかを見た目で分かるようにし ていきます。すり抜けるタイミングのとき は半透明にすることで表現してみたいと思 います。
もう 1 度 FallBlock のプロパティを見てみ るとTransparencyという項目があります。
Transparency は0~1の数字で指定され るプロパティで、0 の時は全く透明ではない 状態、1 の時は完全に透明の状態になります。
例では、乗ることが出来るタイミングのと きは Transparency の値が 0,すり抜けるタ イミングのときは Transparency の値を 0.
5 にして半透明にしてみたいと思います。
Transparency の値が変わるようにプログラミングをしてみよう!
自分で考えて書いてみてから、次のページで確認してみよう!
?
12
すり抜けるかどうかは CanCollide の値で設 定していたので、この値を変えたタイミン グで Transparency も変えてあげればよい です。ですので、5 行目と 8 行目に Transp arency を変えるコードを書いてあげましょ う。
ゲームを実行して確認してみます。すると、
一定のタイミングで足場が半透明になるよ うになりました。実際に乗ってみると、半透 明のときだけ、すり抜けてしまうことが確 認できます。
FallScript
1 2 3 4 5 6 7 8 9 10
local fallBlock = script.Parent
while true do
fallBlock.CanCollide = true fallBlock.Transparency = 0 wait(2)
fallBlock.CanCollide = false fallBlock.Transparency = 0.5 wait(1)
end
Chapter4 移動する床を作ろう
移動する床の準備
移動する床を作っていきましょう。Chapte r3 と同じく、アスレチックの足場の中から 1つ、動くようにする床を選びましょう。
また、名前を「MoveBlock」、Script を「M oveScript」に変えておきましょう。
今回も MoveBlock のプロパティを見てみま す。するとPositionというプロパティがあ ります。Position には X,Y,Z の 3 つの数字 があります。今までオブジェクトを動かす 時は Tools の Move を選択して矢印で移動 させてきましたが、Position プロパティで は直接数字で位置を設定することができま す。
移動する床、つまり位置が変わる床を作っ ていくので、Position が変わるようにプロ グラミングをしていきます。
移動する床のプログラミング
いつも通り、script.Parent を格納する変数 を作っておきましょう。
MoveScript
1 2 3 4 5 6 7 8
local moveBlock = script.Parent
while true do
script.Parent.BrickColor = BrickColor.Blue() wait(5)
script.Parent.BrickColor = BrickColor.Red() wait(5)
end
14
それでは Position が変わるようにプログラ ミングしていきます。まずは、Z の方向に 1 ずつ動くようにプログラミングしていきま しょう。
図のように Position の Z に 1 を足した数字 を代入するようにすれば上手くいきそうな 気がします。5 秒待つのも長いので 1 秒待 つように変えておきましょう。
しかし、実行して確認してみると、足場は全 く動きません。また、Output を見てみると、
赤字のメッセージが出ています。
Roblox Studio では、Position の Z だけ変 えるようなコードの書き方はエラーになっ てしまいます。このようなときは、X,Y,Z の 3 つの値の組み合わせを変更するようにす る必要があります。
X,Y,Z の組み合わせのデータはVector3で 表します。Vector3 は X,Y,Z の値をそれぞ れ(X,Y,Z)のように組み合わして表します。
今回は Z の値だけを 1 足したいので、X,Y は 0,Z だけ 1 を指定してあげます。
実行して確認してみると、1 秒おきにブロッ クが Z の方向に移動していることが確認で きます。
MoveScript
1 2 3 4
5 6
local moveBlock = script.Parent
while true do
moveBlock.Position.Z = moveBlock.Position.Z + 1
wait(1) end
MoveScript
1 2 3 4
5 6
local moveBlock = script.Parent
while true do
moveBlock.Position = moveBlock.Position + V ector3.new(0,0,1)
wait(1) end ゲームのどこかでエラーが出て
いると、Output に赤字でエラー メッセージができます。エラーメ ッセージをクリックすると、エラ ーが出ている行に移動してくれ ます。
別の書き方
先ほど書いたコードですが、別の書き方を することができます。今回のように、左の値 に足したいときは、図のように「+=」と書 くことができます。「+=」を使って書くと、
右辺に書いていた moveBlock.Position を 書かなくても moveBlcok.Position に右辺 の値を足すという意味になります。
この書き方の方が短くて楽なので、今後は
「+=」を使って書いていきます。(もちろん、
今まで通りの書き方でも問題ありません)
足場が往復するようにする
足場を移動させることができましたが、こ のままだと、ずっと Z の方向に移動し続け てしまいます。ジャンプして乗れないよう な位置に動いてしまうと 2 度とクリアでき なくなってしまって、ゲームとして面白く ないので、同じところを往復するように改 造していきましょう。
往復するようにするには、逆の方向に進む ようにしてあげればよさそうですね。さき ほどは「+=」で足してあげましたが、「-=」
を使って引くコードも追加してみましょう。
実行して確かめてみると、往復するように 動くようにはなりましたが、1 回ずつ動くだ けなのでギミックとしてあまり意味がない 動きになっています。
1ずつ動くのではなく、10 ずつ動くように するとギミックらしくなりますが、かなり 急に移動してしまいます。
MoveScript
1 2 3 4 5 6
local moveBlock = script.Parent
while true do
moveBlock.Position += Vector3.new(0,0,1) wait(1)
end
MoveScript
1 2 3 4 5 6 7 8
local moveBlock = script.Parent
while true do
moveBlock.Position += Vector3.new(0,0,1) wait(1)
moveBlock.Position -= Vector3.new(0,0,1) wait(1)
end
16
©D-SCHOOL All Rights Reserved. アスレチックで冒険!(後編)
10 回ずつ動くようにする
1 回動いたら逆に動くのではなく、10 回動 いたら逆に 10 回動くようにさらに改造し てみましょう。
今まで繰り返す処理は while を使ってきま したが、決まった回数だけ繰り返す場合に はforを使います。Scratch や micratch の
「~回繰り返す」と同じ意味になります。
「for~do」までの間に繰り返す回数を設定 します。
「count = 1, 10, 1」は繰り返しに使う変 数を設定する所です。「count = 1」で変数 count の値を最初は 1 にします。次の「10」
で count が 10 になるまで繰り返すという 指定をします。最後の「1」は、繰り返す処 理を 1 回するたびに count の値を 1 ずつ増 やすという意味になります。
「do~end」までの間の処理を繰り返しま す。今までは 1 秒ごとに動かしていました が、さらに速く 0.2 秒ごとに動くようにし てみます。
実行して確かめてみると、10 回ずつ動いて 往復する床ができました。これでギミック らしい動きになってくれました。
MoveScript
1 2 3 4 5 6 7 8 9 10 11 12
local moveBlock = script.Parent
while true do
for count = 1, 10, 1 do
moveBlock.Position += Vector3.new(0,0,1) wait(0.2)
end
for count = 1, 10, 1 do
moveBlock.Position -= Vector3.new(0,0,1) wait(0.2)
end end
「for count = 1, 10, 1 do」
なかなか複雑に見えるけど、「10」
の部分を変えるだけで繰り返す 回数を変えることができるよ。
①変数 count を最初は 1 にする
②count が 10 になるまで繰り返す
③繰り返すごとに count を1ずつ増やす
動く床に書いたコードを Scratch で書くと 図のようになります。難しいことをしてい そうな気がしますが、よく見てみると思っ たより簡単な動きをしていることが分かり ます。
Scratch や図を使って、コードを 書く前に整理してから書くと分 かりやすいかも!自分に合った 方法でプログラミングしてみよ う!
18
Chapter5 ゲームをより面白くしていこう
足場の見た目を変えてみる
ゲームの見た目をカスタムして、ゲームの クオリティを上げていきましょう。見た目 を変えたい足場を1つ選択します。
HOME のタブの中の Material をクリック します。すると、いくつか候補が出てくるの で、Brick を選択してみます。
すると、さきほどのツルツルしていた見た 目からレンガのような見た目に変わりまし た。このように Material を変更するとオブ ジェクトの質感を変更することができます。
例では Material を Neon、色を黄色にして みました。Material を変えるだけでかなり 印象が変わります。
ゲームを実行してみると、せっかく黄色に したのに青色や赤色に変わってしまいます。
これは ColorChangeScript から色を変えて いるせいです。
この足場は色を変えずに黄色のままにして おきたい場合は、Explorer から ColorChan geBlock を右クリック→Delete をクリック し、Script を削除しておきましょう。
ゴールするまでの時間を測る
次に、スタートしてからゴールするまでの 時間を測るようにしてみたいと思います。
ゴールに関するプログラミングをするので、
GoalLineScript を開いてみましょう。
時間を測るプログラミングを追加で書いて いくので、今まで書いたコードの下に書い ていきます。
時間を計測するための変数を作ります。名 前は timer にしておきます。プレイヤーが ゴールするまで、この timer という変数の 値を 1 秒ごとに1ずつ増やしていけば、時 間の計測ができそうです。
GoalLineScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
local isGoal = false
local goalLine = script.Parent
local sound = goalLine["Good Feeling"]
function onTouch(hit)
if hit.Parent:FindFirstChild("Humanoid") then if isGoal == false then
print("Goal!!!") isGoal = true
local effect = Instance.new("Sparkles") effect.Parent = goalLine
sound:Play() end
end end
goalLine.Touched:Connect(onTouch)
local timer = 0
プレイヤーがゴールするまで 1 秒ごとに timer の値が1ずつ増えるように考えてみよ う!書いてみてから次のページに進もう!
?
20
プレイヤーがゴールするまでずっとカウン トしていきます。「~までずっと」というの は、今まで何回も出てきたように while を 使えばよさそうです。
「プレイヤーがゴールするまでずっと」数 えるようにします。ゴールしたかどうかは i sGoal という変数で管理していましたね。is Goal が true になったらゴールしたことに なるので、isGoal が false である限りずっ とカウントするようにします。
1 秒ごとに1ずつ増やすためには、wait で 1 秒待ってから timer を 1 増やせばいいで すね。
このままだと何秒経ったかが分からないの で、print で Output に出す処理も追加して おくと分かりやすいです。
実行してみると、Output に時間がどんどん print されていきます。
GoalLineScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
local isGoal = false
local goalLine = script.Parent
local sound = goalLine["Good Feeling"]
function onTouch(hit)
if hit.Parent:FindFirstChild("Humanoid") then if isGoal == false then
print("Goal!!!") isGoal = true
local effect = Instance.new("Sparkles") effect.Parent = goalLine
sound:Play() end
end end
goalLine.Touched:Connect(onTouch)
local timer = 0
while isGoal == false do wait(1)
timer += 1 print(timer) end
より分かりやすく出力する
このままでもいいのですが、より分かりや すく出力するために「~秒経過・・・」と O utput に出るようにしてみましょう。
timer の値と”~秒経過・・・”という文字を くっつけて print してあげる必要がありま す。このとき「..」を使うことで、文字をく っつけてあげることができます。
Scratch や micratch だと「~と~」という パーツと同じ役割です。
実行して確認してみると、「1 秒経過・・・」
のように出力されていることが分かります。
また、ゴールをすると時間の計測が止まる ことが分かります。
BGM を追加する
ゲーム中にずっと流れる BGM を追加しま す。Toolbox を開き、Model の所を Audio にしておきます。
今回は「When u coming Back - NoVoc als」という曲を使いますので、検索して探 します。
GoalLineScript 1
21 22 23 24 25
local isGoal = false
while isGoal == false do wait(1)
timer += 1
print(timer .. "秒経過・・・") end
コードが長くなる場合は、変更が ないところは波線で省略するこ とがあります。何行目かをよく確 認して写してください。
22
BGM は workspace の子供に追加してあげ ます。Explorer から workspace を選択し た状態で、音をダブルクリックします。する と音が追加されます。
このままだとゲームを実行しても音が流れ てくれません。追加した音を選択し、Prope rties を見てみましょう。
ゲームを実行したと同時に音を流してほし い場合は、Playing というプロパティをチ ェックしておきます。また、BGM はループ して再生したいので、Looped というプロ パティもチェックを入れておきましょう。
Volume も変更して音の多い大きさを調整 しておきます。
ゲームを実行すると、BGM が流れてくれる ようになるはずです。
【応用編】 大砲を作ろう
砲台を作る
大砲を発射するための砲台を作っていきま す。大砲は図のような方向に撃つように作 っていきます。
大砲を作るために Block を新しく追加しま す。追加した Block を移動したり、大きく したりして、例では図のような位置に配置 します。位置や大きさも自由で構いません。
さらに大砲らしくするために、弾を発射す る筒を追加します。Part→Cylinderをクリ ックすると、筒のようなオブジェクトが追 加されます。
Cylinder の位置や大きさを調整して、先ほ ど追加した Block から筒が出ているような 位置に持って行きます。
また大砲の色も黒色などに変えておくと、
より大砲らしさが出ると思います。
大砲だと分かりやすいように名前も変えて おきましょう。Block の部分を Cannon、
筒の部分をBarrelという名前にします。(C annon は大砲、Barrel は大砲の筒という意 味の英語)
24 大砲を親子関係にする
Cannon と Barrel は別々のオブジェクトな ので、例えば Cannon を移動したときに Ba rrel は移動してくれません。このままだと位 置を動かしたいときに面倒です。
こういったときは、Cannon と Barrel を親 子関係にしてあげます。親子関係にすると、
親を動かすと子も動いてくれるので、大砲 を同時に動かすことができます。
今回は Cannon が親、Barrel が子になるよ うにします。Explorer で Barrel をクリック したままマウスを移動します。Cannon の所 でマウスを離すと、Cannon の子供に Barr el が移動します。
大砲の弾を作る
さらに、大砲から発射する弾を作ります。P art→Sphere をクリックして追加します。
大きさを調整して、筒より少し小さいぐら いの大きさにします。今回作る大砲の弾は 炎の弾を発射するので、名前をFireBallに して、Barrel と同じように Cannon の子に しておきましょう。
Anchor の設定
このままだとゲームを実行すると大砲が落 ちていってしまいます。Cannon,Barrel,Fir eBall すべてに Anchor を設定しておきまし ょう。
このとき、Cannon の子のすべてのオブジェ クトが Anchor 設定されていないと Canno n の Anchor を設定してもグレーになって くれません。子をすべて Anchor にすれば、
Cannon もグレーになってくれます。
クリックしたまま Cannon に移動
大砲のプログラミング
準備ができたので大砲のプログラミングを していきましょう。Cannon に Script を追 加し、CannonScriptという名前にしてお きます。
いつも通り script.Parent を変数に入れてお きます。また、今回は Barrel や FireBall も 使っていくので、あらかじめ変数に入れて おきましょう。
弾を発射する
続いて、弾が発射されるようにしていきま す。弾はゲーム中ずっと発射したいので wh ile を使います。
弾を動かす向きを考えてみましょう。大砲 の弾を動かしたい向きは、みなさんが作っ てくれ大砲の向きによって変わります。
向きを確認するためにはViewSelectorで 確認します。ViewSelecor は VIEW→Actio ns の中にあるので、表示されていない場合 はこちらをクリックして表示させましょう。
すると X,Y,Z と書かれた線が右上に表示さ れたと思います。線が向いている方向が、X, Y,Z のプラスの方向になります。
例の画像ですと、X の伸びている向きと逆の 方向に大砲が向いているので、大砲の弾は X のマイナス方向に飛ぶようにすればよいこ とが分かります。
CannonScript
1 2 3
local cannon = script.Parent local barrel = cannon.Barrel local fireBall = cannon.FireBall
CannonScript
1 2 3 4 5 6 7
local cannon = script.Parent local barrel = cannon.Barrel local fireBall = cannon.FireBall
while true do
end
←が X のプラスの方向
弾は X のマイナスの方 向に撃つ
26
©D-SCHOOL All Rights Reserved. アスレチックで冒険!(後編)
while の中で X のマイナス方向に進むよう に Position を変更してあげます。このとき、
wait が必ず必要になります。
ずっと繰り返す処理をしているときに Posi tion などを変えた場合、ゲームの更新を待 ってあげる必要があるからです。今回は、0.
05 秒ごとに X の方向に-1 ずつ進むように してみました。
ゲームを実行して確かめてみましょう。弾 が大砲の向きに発射されるようになりまし た。
弾が何度も発射されるようにする
このままだと弾が遠くに行ってしまいます ので、ある程度動いたら、もう 1 度大砲の 位置に戻って再発射されるようにしていき ましょう。
今回は 20 回移動したら大砲の位置に戻る ようにしてみます。弾が移動する前に、弾の 位置を大砲の筒の位置に移動させます。
for を使って 20 回移動するようにします。
このようにすると、「筒の位置に移動」→「2 0 回移動」→「筒の位置に戻る」→「20 回 移動」・・・と何度も発射されるような動き にすることができます。
弾のスピードが遅く感じる場合は-3 などの 数字にしてみるといいでしょう。
CannonScript
1 2 3 4 5 6 7 8
local cannon = script.Parent local barrel = cannon.Barrel local fireBall = cannon.FireBall
while true do
fireBall.Position += Vector3.new(-1,0,0) wait(0.05)
end
CannonScript
1 2 3 4 5 6 7 8 9 10 11 12
local cannon = script.Parent local barrel = cannon.Barrel local fireBall = cannon.FireBall
while true do
fireBall.Position = barrel.Position
for count = 1,20,1 do
fireBall.Position += Vector3.new(-3,0,0) wait(0.05)
end end 繰り返す処理の中に wait を忘れ
ないようにしよう!
当たるとゲームオーバーにする
弾に当たったときにゲームオーバーになる ようにしてみましょう。同じようなことを T rap のときもやりましたね。
TrapScript の function~から下をすべてコ ピーしましょう。そして、while の前に貼り 付けます。
今回は trap ではなく fireBall が当たったと きにゲームオーバーにしたいので、12 行目 の Touched のところは fireBall に書き換え ておきます。
ゲームを実行して確認してみましょう。ア スレチックが難しくて大砲の弾に当たるこ とができない場合は、Cannon を動かして簡 単に当たる位置に移動させましょう。
弾に当たるとゲームオーバーになるような りました。
エフェクトを付ける
最後に炎のエフェクトを追加しましょう。E xplorer から FireBall を選択します。
Script を追加した時のようにプラスボタン をクリックし、Effects の中にある Fire を 選択します。すると FireBall の子供に Fire が追加されます。
貼り付ける位置は local~の行と while の間に貼ろう!
CannonScript
1 2 3 4 5 6
7 8 9 10 11 12 13 14
local cannon = script.Parent local barrel = cannon.Barrel local fireBall = cannon.FireBall
function onTouch(hit)
local humanoid = hit.Parent:FindFirstChild("H umanoid")
if humanoid then humanoid.Health = 0 end
end
fireBall.Touched:Connect(onTouch)
while true do
28
追加しただけで弾が燃えてくれるようにな ります。
Fire を選択して Properties を選択すると、
様々な項目を設定できます。
例では、Size を 10,Color を青色にしてみま した。なかなか恐ろしいエフェクトになり ましたね。
以上で mission02 の内容は終わりです!
mission01 と比べると、たくさんプログラミングして、アスレチックゲームに 様々なギミックを追加して、より面白くなりましたね。
エフェクトをもっと追加したり、ギミックを増やしたりして、みんなのオリジ ナルのアスレチックゲームを作ってみてください!
30
©D-SCHOOL All Rights Reserved. アスレチックで冒険!(後編)
完成コード
TrapScript
1 2 3 4 5 6 7 8 9 10
local trap = script.Parent
function onTouch(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid") if humanoid then
humanoid.Health = 0 end
end
trap.Touched:Connect(onTouch)
JumpScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14
local jump = script.Parent
function onTouch(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid") if humanoid then
humanoid.JumpPower = 100 print("ハイジャンプモード!") wait(3)
humanoid.JumpPower = 50 print("ハイジャンプモード終了!") end
end
jump.Touched:Connect(onTouch)
31
©D-SCHOOL All Rights Reserved. アスレチックで冒険!(後編)
FallScript
1 2 3 4 5 6 7 8 9 10
local fallBlock = script.Parent
while true do
fallBlock.CanCollide = true fallBlock.Transparency = 0 wait(2)
fallBlock.CanCollide = false fallBlock.Transparency = 0.5 wait(1)
end
MoveScript
1 2 3 4 5 6 7 8 9 10 11 12
local moveBlock = script.Parent
while true do
for count = 1, 10, 1 do
moveBlock.Position += Vector3.new(0,0,1) wait(0.2)
end
for count = 1, 10, 1 do
moveBlock.Position -= Vector3.new(0,0,1) wait(0.2)
end end
32
©D-SCHOOL All Rights Reserved. アスレチックで冒険!(後編)
GoalLineScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
local isGoal = false
local goalLine = script.Parent
local sound = goalLine["Good Feeling"]
function onTouch(hit)
if hit.Parent:FindFirstChild("Humanoid") then if isGoal == false then
print("Goal!!!") isGoal = true
local effect = Instance.new("Sparkles") effect.Parent = goalLine
sound:Play() end
end end
goalLine.Touched:Connect(onTouch)
local timer = 0
while isGoal == false do wait(1)
timer += 1
print(timer .. "秒経過・・・") end
33
CannonScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
local cannon = script.Parent local barrel = cannon.Barrel local fireBall = cannon.FireBall
function onTouch(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid") if humanoid then
humanoid.Health = 0 end
end
fireBall.Touched:Connect(onTouch)
while true do
fireBall.Position = barrel.Position
for count = 1,20,1 do
fireBall.Position += Vector3.new(-3,0,0) wait(0.05)
end end