【Lua言語講座】7.親と子

親と子 Lua言語講座

※この記事は会話形式にリライトしました。

こんにちは、ロブスタのハルです!
前回の講座ではオブジェクトとプロパティについて説明し、パーツの色を変えるプログラムを作ってみました。
今回は何度も使えるようなコードを書くために必要な大切な親と子という考え方について説明したいと思います!
前回の講座を見ていない方はこちらからご覧ください。

前回の宿題

fromRGB()内のRGBの値を以下のように変えて実行してみてください。

  1. 0, 0, 0
  2. 255, 0, 0
  3. 0, 255, 0
  4. 0, 0, 255
  5. 255, 255, 255

また、fromRGB()ではなく、fromHSV()を使ってみてください。

https://roblox-starter.com/programing-lua/lua-lesson6-object-and-property/

前回の宿題はどうでしたか? まず、fromフロムRGB()を使ったプログラムでは1.は黒色、2.は赤、3.は緑、4.は青、5.は白になったかと思います。

これはRGBがR(赤)、G(緑)、B(青)の組み合わせで色を作っているためです。前回の講座で軽く紹介したようにRGB値はそれぞれ0~255までとなっており、0が光らない/255が最大に光ることを表しています。

これがRGBのモデルですね。

解説に戻ります。
1.は全てが光っていない状態=真っ暗な状態なので黒となっています。
同様に2.~4.は赤、緑、青のいずれかが最大に光っており、それ以外は光っていないためこのような解答になっています。
また、5.はいずれも最大に光っているため白となっています。

色を指定するにはRGB以外にもHSVという方法があります。これはH(色相)、S(彩度)、V(明度)の組み合わせで色を作る方法です。デジタルで絵を描く人はなじみがあるかもしれませんね。

RobloxではColor3クラスのfromHSV()を使うことで指定できます。色の指定方法はRGBだけじゃないんだなと思ってもらいたくて出題しました。

色を変えるプログラム2

――ある日の会話――

先生
先生

前回はプログラムでパーツの色を変えましたね。
今回はプログラムを少しいじってみましょう。

たかし
たかし

どんな変更をするんですか?

先生
先生

変数を使ってパーツを表す部分とプロパティを表す部分を分けてみましょうか。
そうすることで意味がわかりやすくなりますよ。

解説

今回はColorPartカラーパートというパーツを作成し、その中にChangeColorScriptチェンジカラースクリプトというスクリプトを作成してみてください。スクリプトはパーツの右側の+マークをクリックすることで追加できます。

ChangeColorScript

そうしたら以下のコードをChangeColorScriptに書いてみてください。

--色を変えるプログラム2
local colorPart = game.Workspace.ColorPart
colorPart.Color = Color3.fromRGB(0, 85, 255)

実行してみるとパーツの色が変わっていることが確認できると思います。

コードを詳しく見てみましょう。
まず、2行目では変数ColorPartを宣言しており、その中身としてgameゲーム.Workspaceワークスペース.ColorPartカラーパートを代入しています。これは前回の講座で学んだようにColorPartオブジェクトそのものを変数ColorPartとして扱っていることを示しています。
続いて3行目ではColorPartオブジェクトのColorプロパティにColor3クラスのfromRGB()を使ってRGB値を設定しています。

--色を変えるプログラム
game.Workspace.ColorPart.Color = Color3.fromRGB(0, 85, 255)

--色を変えるプログラム2
local colorPart = game.Workspace.ColorPart
colorPart.Color = Color3.fromRGB(0, 85, 255)

前回のコードと比較するとColorPartを変数として宣言することでどこがプロパティなのかがわかりやすくなったように思います。

※追記

実はgame.Workspaceの部分はworkspaceと書くこともできます。
中身はどちらも同じものを表していますが、workspaceと書くことでコードを少なくすることができます。

--色を変えるプログラム
workspace.ColorPart.Color = Color3.fromRGB(0, 85, 255)

--色を変えるプログラム2
local colorPart = workspace.ColorPart
colorPart.Color = Color3.fromRGB(0, 85, 255)

親と子

――ある日の会話――

たかし
たかし

プロパティをいじるにはそのパーツの位置を取ってくる必要がありました。
これはいつもgame.Workspaceやworkspaceを使って取らないといけないんですか?

先生
先生

その方法でもいいんですが、パーツを移動してしまったり、名前が被っていたりするとエラーの原因になります。そこで、スクリプト自身からパーツの位置を判断する方法があるんですよ。

解説

親とはその下にスクリプトやパーツなどのオブジェクトを持つオブジェクトのことです。
また、子とは親の下にあるオブジェクトのことです。

親子関係の説明

例えば、上の画像でColorPartの子はChangeColorScriptとなっています。逆にChangeColorScriptの親はColorPartです。このように親子関係を考える際にはどっちの立場(視点)から考えるかが大切になってきます。

絶対参照と相対参照

game.Workspace.ColorPartのようにgameオブジェクトのどの位置(階層)に指定したいオブジェクトがあるかを自分で探して決める方法を絶対参照ぜったいさんしょうと言います。

一方でscript.Parentのように自分自身のスクリプトからオブジェクトがどの位置にあるのかをプログラム上で調べて指定する方法を相対参照そうたいさんしょうと言います。

絶対参照はエクスプローラ上でパーツの位置(階層)や名前が少しでも変わってしまうとプログラムが動かなくなる可能性があります。相対参照であれば自分自身を基準にしてオブジェクトを探しているため変更について行けるというメリットがあります。

色を変えるプログラム3

続いて親子関係を使って色を変えるプログラムを作ってみます。

--色を変えるプログラム3
local colorPart = script.Parent
colorPart.Color = Color3.fromRGB(0, 85, 255)

2行目では変数colorPartの中身にscriptスクリプト.Parentペアレントを代入しています。scriptというのは自分自身のことを指しています。script.Parentと書くことで自分自身の親つまり、ChangeColorScriptの親であるColorPartを示していることになります。

ここで、エクスプローラ上でColorPartを右クリックして複製を選んでみましょう。(ColorPartを選択した状態でctrl+Dでも複製できます)

複製後
テストプレイ時

パーツを並べて、テストプレイを実行すると同じコードで3つとも色を変えることができました。

つまり、パーツを変更してもコードを修正する必要がないということが確認できましたね。

宿題

  1. 色を変えるプログラム2を子にもつパーツを複製ふくせいしてテストプレイをしてください。このとき、色を変えるプログラム3と比べて何が違うか考えてみましょう。
  2. 以下の画像をもとに次の質問に答えてください。
  1. Workspaceの子がどれか答えてください。
  2. Decalの親を答えてください。
  3. TestPartの子を答えてください。

最後に

――ある日の会話――

たかし
たかし

今回は親と子の関係、絶対参照、相対参照というものについて学びました。

先生
先生

これらは本当に基本となることなのでしっかり復習しておきましょうね。

たかし
たかし

確かにこれがわからないとパーツが取ってこれないな…

まとめ

  • パーツは変数名の中にgame.Workspace.パーツ名を代入する方法がある(絶対参照)
  • 親子関係を用いて変数名の中にscript.Parentのようにパーツを代入する方法がある(相対参照)
  • 相対参照を使うと同じ変化をするパーツを手軽に増やすことができる
  • game.Workspaceはworkspaceと書くこともできる

お疲れ様でした。第7回はここまでです。
次回はいよいよ関数について解説します。
親子関係は最初理解しづらいかと思いますのでエクスプローラ上でどれの親がどれで……どれの子がどれで……と考える練習をしてみるといいと思います。

コメント

タイトルとURLをコピーしました