【Lua言語講座】10.イベント

イベント Lua言語講座

こんにちは、ロブスタのハルです!
前回の講座では入力と出力のある関数について説明しました。
今回はイベントとそれを使った関数の起動について解説します。
前回の講座を見ていない方はこちらからご覧ください。

前回の宿題

宿題として以下の関数を作ってみてください。また、作ったらスクリプトエディタで実行してみましょう。

  1. 2つの数字を足して、”足した結果は○です。”と返す関数addアド
    ただし、○には足した結果の数値が入ります。
  2. 3つの文字列を連結して返す関数linkリンクStringsストリングス
  3. 比例係数aと入力(独立変数)xの値を受け取って、1次関数y=axである出力(従属変数)yの値を返す関数linearリニア

前回の宿題はできましたか?

1.の解説

まずは1.について解説します。
これは2つの数値が引数、”足した結果は○です”という文字列が戻り値であるような関数を作ればいいです。処理の部分は2つの数値を足した結果を変数に代入しておけばいいですね。コードとしては以下のようになります。

-- 解答例
local function add(num1, num2)
  local ans = num1 + num2
  return "足した結果は"..ans.."です"
end

print(add(2, 3))

-- 別解
local function add(num1, num2)
  local ans = num1 + num2
  return print("足した結果は"..ans.."です")
end

add(2, 3)

文字列の中に数値を埋め込むには連結演算子を使えばよかったですね。また、文字列や数値を表示したいときにはprintプリント文を使う必要がありました。解答例のように文字列だけを戻り値として呼び出し側をprint文の中に書いてもいいですし、別解のようにprint文自体を戻り値とすることもできます。

2.の解説

続いて2.です。これは3つの文字列をそれぞれ引数として受け取り、それを連結したものを戻り値として返す関数を作ればいいです。解答例としては以下のようになります。

-- 解答例
local function linkStrings(str1, str2, str3)
  local v = str1..str2..str3
  return v
end

print(linkStrings("abc", "def", "ghi"))

3.の解説

最後に3.です。これは比例係数aと入力(独立変数)xの値を引数とし、y=axとなるyを返す関数を作ればいいです。解答例は以下のようになります。

-- 解答例
local function linear(a, x)
  local y = a * x
  return y
end

print(linear(2, 5))

-- 別解
local function linear(a, x)
  return a*x
end

print(linear(3, 8))

数学ではy=axのように書くだけで関数を表現できましたが、プログラムとしては上のように書いてあげる必要があります。しかし、やっていることは同じでa*xを返してあげる関数となっています。この問題では従属変数yを返すという指示があるので一度yに代入したうえで返していますが、実際に使う時は別解のようにa*xを直接返してあげた方がコードの行数を短くできます。

*補足
数学では掛け算記号を省略して書くことができます。例えば、a*bやa×bはabのように表します。今回の例ではy=axのうちaxの部分はa*xやa×xを表しているのと同じです。

関数についての補足

関数を使ったときのプログラムの実行順についてです。

例1

-- 処理1
-- 関数定義
local function test()
  -- 処理A
  -- 処理B
  -- 処理C
end
-- test()
-- 処理2

まずは上のような場合を考えます。この場合は処理1→関数定義→処理A→処理B→処理C→処理2の順番になります。基本は上から順に実行されますが、関数は呼び出されるまでは中身が実行されることはありません。また、呼び出された場所では関数の中の処理は基本的に上から順に実行されます。

例2

-- 処理1
-- 関数定義
local function test(arg1, arg2)
  -- 処理A
  -- 処理B
  -- 処理C
  return value
end
-- 処理2
-- test(arg1, arg2)
-- 処理3

続いて上のような場合はどうなるでしょうか。この場合は処理1→関数定義→処理2→処理A→処理B→処理C→処理3の順に実行されます。引数と戻り値があってもなくても関数は呼び出されるまでは処理が実行されることはないと覚えておきましょう。

イベントについて

イベントとは何かしらの動作を起こすもとになるものです。具体的にはパーツに触れたことを検知したり、パーツが破壊されたことを検知したりします。

これまでは関数を関数名()の形で呼び出すことで実行していました。しかし、イベントを使うことでそのイベントが発生したときに自動的に関数を呼び出すことができるようになります。

つまり、イベントとは入力→処理→出力の流れのうち入力にあたるものなのです。

イベントの型

この内容はゲーム作りにはそこまで関係ないので読み飛ばしてもらっても構いません。

これまで数値型や文字列型、booleanブーリアン型、関数型が出てきましたが、実はイベントにも型があります。それがRBXScriptスクリプトSignalシグナルという型です。この型はイベントを定義し、イベントが発生したときに実行される関数(リスナー)に接続するという役割を持っています。

イベントの使い方

イベントにもいくつか種類がありますが基本的には以下のように使います。

オブジェクト.イベント名:メソッド(リスナー)

パーツに触れるとメッセージが表示されるプログラム

イベントの使い方だけみても意味が分からないと思うので実際にプログラムを書いてみましょう。今回はパーツに触れたことを検知してメッセージを表示するプログラムを書いてみます。

-- パーツの指定
local part = script.Parent

-- リスナーの定義
local function hit()
  print("パーツに触れたよ")
end

-- イベントの記述
part.Touched:Connect(hit)

さて、2行目はもう大丈夫ですね。パーツの子としてスクリプトを作成し、スクリプトから見た親つまり、パーツのことをpartパートという変数に代入しています。

次に5~7行目ですが、ここではイベントが発生したときに実行される関数を定義しています。このような関数をリスナーと呼ぶことがあります。今回はhitヒットという名前のリスナーを作成し、処理として”パーツが触れたよ”という文字列をprint文で表示するようにしました。

それから10行目ではイベントを記述しています。まずイベントを設定したいオブジェクト(今回はpart)に対して.Touchedタッチドと書きます。このTouchedこそがイベントです。これは.の前のオブジェクトが触れられたときに発生します。続いて:の後にConnectコネクト()とありますが、Connect()の役割としてはイベントが発生したときにリスナーとイベントを繋ぐというものです。つまり、10行目全体の意味としてはpartに触れた(Touched)ときhitリスナーと繋ぐ(Connect)というものになります。

このプログラムをRoblox Studioのスクリプトエディタに書いて実行してみましょう。

パーツに触れたよ♡

画像のようにパーツに触れるたびに”パーツに触れたよ”という文字列が表示されると思います。
もしうまくいかないという人はエクスプローラーの階層が下の画像のようになっているか、スクリプトが間違っていないか確認してみてください。

階層
Anchoredプロパティ

また、実行するとパーツに触れていないのにテキストが表示されてしまうという人はパーツのAnchoredアンカードプロパティにチェックを入れてみてください。Anchoredプロパティはパーツをその場に固定するためのプロパティです。

まとめ

  • イベントとは何かしらの動作を起こすもとになるもの
  • 触れたことを検知するにはTouchedイベントを使う
  • イベントが起きたときに関数を実行させるにはConnectメソッドを使う
  • イベントが起きたときに実行される関数をリスナーと呼ぶ

お疲れ様でした。第10回は以上です。
今回は少し難しかったかもしれませんね。
次回はイベントを使ったプログラムが書けるようになるための演習をしようと思います。

コメント

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