【Lua言語講座】12.演習-関数-

関数の演習回 Lua言語講座

こんにちは、ロブスタのハルです!
前回の講座ではイベントを使ったプログラムについて演習しました。
今回はInstance.new()と複数の引数を持つ関数を使ってプログラムが書けるようになるための演習をします。
前回の講座を見ていない方はこちらからご覧ください。

概要

今回作りたいプログラムは次のようなものです。

  • ゴミとお宝を判別する
  • ゴミだった場合はゴミオブジェクトを消す
  • お宝だった場合はお宝オブジェクトを輝かせるエフェクトをつける

これを実装じっそうするにあたってオブジェクトをかがやかせるためのエフェクトParticleEmitterパーティクルエミッタInstanceインスタンス.newニューメソッド、Destroyデストロイメソッドについて解説しておきます。

ParticleEmitter

ParticleEmitterとはエフェクトの一種で、パーツから粒子を放出するものです。エフェクトについてはこちらの記事にまとめてあるので見てみてください。

エフェクトはパーツに直接つけておくこともできますが、コード上で追加することもできます。追加方法ですが、次で説明するInstance.newメソッドを使えばいいです。

Instance.newメソッド

メソッドとは

まずはメソッドについて軽く紹介します。メソッドとはオブジェクトに何かしらの機能(動作や効果など)を使うためのものです。ここではメソッド=関数と思ってもらっても大丈夫です。メソッドについては後々詳しく説明する予定です。

メソッドはコード上では次のように使います。

オブジェクト名.メソッド名(引数)

Instance.new()について

上の説明をもとに考えるとInstanceはオブジェクトの名前、newはメソッドの名前ということがわかりますね。また、メソッド名のあとに()がつくのも関数を呼び出すときに関数名()と書くのに似ています。

Instance.new()メソッドはコード上で新たにパーツやフォルダを作成したり、エフェクトのついたオブジェクトを作り出すことができます。

Destroyメソッドについて

オブジェクトを削除するにはDestroyメソッドを使います。
具体的には下のように書きます。

オブジェクト名:Destroy()

これを見てメソッドを使うには.メソッド名()じゃなかったっけ?と思った人。鋭いですね。実はメソッドの呼び出し方には.を使うドット記法と:を使うコロン記法の2種類があるんです。これに関しては後々解説したいと思います。

実装

それでは実際にプログラムを書いていきます。まずはゴミとお宝にあたるパーツを作っていきます。

ゴミとお宝オブジェクトを作成

今回はテンプレートの中のBaseplateベースプレートを使っていきます。

まず、パーツを2つ追加してそれぞれCementセメント, GlassグラスBottleボトルという名前をつけます。CementのMaterialマテリアルConcreteコンクリート, GlassBottleのMaterialをGlassに変えておきます。また、BrickブリックColorカラーを好きな色に変えておきましょう。

パーツの見本

僕は画像のように作ってみました。

プログラムを書く

流れを考える

前回と同じくまずはプログラムの流れを考えてみます。

その前に今回のプログラムは特定とくていのオブジェクトに使われるものではないのでServerサーバーScriptスクリプトServiceサービスの中にScriptを作成します。

準備ができたところで今回のプログラムの流れを考えてみてください。

思いつきましたか?
今回のプログラムの流れとしては次のようになります。

  1. CementオブジェクトとGlassBottleオブジェクトをそれぞれ変数に代入しておく
  2. CementとGlassBottleを渡して処理をする関数を作る
  3. 関数の中の処理として以下(4~6)を追加する
  4. キラキラを作り出すためにParticleEmitterを生成する
  5. 受け取ったパーツがCementなら削除する
  6. 受け取ったパーツがGlassBottleならParticleEmitterを出す
  7. 関数を呼び出す

もちろん全く同じようにする必要はないです。
まずは自分のアイデアで試してみて、うまくいかなかったら上の手順を参考にしてみてください。

コーディング

それでは考えた手順をもとにしてプログラムを書いていきます。

-- ゴミとお宝の分別プログラム
local cement = workspace.Cement
local glassBottle = workspace.GlassBottle

local function sortObject(trash, treasure)
    local sparkle = Instance.new("ParticleEmitter")

    trash:Destroy()
    sparkle.Parent = treasure
end

sortObject(cement, glassBottle)

コードを解説します。

まず2・3行目ではそれぞれRoblox Studioで作ったセメントオブジェクトとガラスオブジェクトをコード上で使えるように変数に代入しています。

5~10行目までがsortObject()というゴミとお宝を分別する自作関数です。
その中身はまず6行目でInstance.new()メソッドを使ってParticleEmitterを作り出しています。
続いて8行目ではsortObject()関数にtrashとして渡された引数をDestroy()メソッドで消しています。
9行目ではsparkleの親にtreasureとして渡された引数を代入しています。sparkleの中身は6行目に書いてある通りParticleEmitterなので結果としてtreasureにあたるオブジェクトをキラキラと輝かせる処理をしていることになります。

最後に12行目でsortObject()関数を呼び出しています。このとき、引数にはcementとglassBottleが入っています。これは5~10行目のsortObject()関数内でtrashとtreasureに代入されます。つまり、引数が複数ふくすうある関数を呼び出すときには関数を定義ていぎしたときの引数と同じ順番で入っていきます。

複数の引数がある関数の呼び出し

言葉だとわかりづらいので例を出しましょう。
e.x. 引数が複数ある関数の呼び出し

local function subNum(x, y)
    return x - y
end

subNum(3, 5)
subNum(5, 3)

1~3行目に引き算をする関数subNum()を定義しました。
5行目のように呼び出した場合、xには3が、yには5が代入されます。よって、x-y=3-5=-2が返されます。一方で6行目のように呼び出した場合、xには5が、yには3が代入されます。よって、x-y=5-3=2が返されることになります。

つまり、sortObject(glassBottle, cement)として呼び出すとglassBottleがtrashとなるのでglassBottleが消えて、cementが輝くことになりますね。

実行

プログラムが書けたらプレイボタンを押してテストしてみましょう。
ゲームの読み込みが終わった時にはおそらくcementオブジェクトが消えて、glassBottleオブジェクトがキラキラと輝いていると思います。

プログラムを実行している様子

まとめ

  • ParticleEmitterエフェクトを使うとパーツをキラキラと輝かせることができる
  • メソッドはオブジェクトが使える関数のようなもの
  • Instance.new()はコード上で新たにパーツやフォルダなどのオブジェクトを作れる
  • Destroy()メソッドは呼び出し先のオブジェクトを消すことができる

お疲れ様でした。今回はメソッド、関数の呼び出しなど新しいことが多くて大変でしたね。
今はふーん、そういう機能があるんだくらいの認識にんしきで大丈夫です。これから一緒いっしょに理解していきましょう!

次回はifイフ文というものについて見ていきたいと思います!

コメント

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