【Lua言語講座】8.関数(1)

関数の1回目 Lua言語講座

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

こんにちは、ロブスタのハルです!
前回の講座では絶対参照ぜったいさんしょう相対参照そうたいさんしょうについて説明しました。
また、パーツの色を変えるプログラムを改良しましたね。

今回はプログラミングをする上で基本となる関数かんすうについて解説します。
前回の講座を見ていない方はこちらからご覧ください。

前回の宿題

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

前回の宿題はできましたか?
まず、色を変えるプログラム2と3の違いについてです。
2では複製をしても1つのパーツしか色が変わりません。
しかし、3だとすべてのパーツの色が変わっていました。

つまり相対参照だと同じ変化をさせたいパーツを簡単に複数つくりだせます。逆に絶対参照だとパーツの位置や名前が変わった場合に変更できないこともわかります。

続いて2.の1.はCameraカメラTerrainテレインSpawnLocationスポーンロケーションBaseplateベースプレートTestPartテストパートBlankPartブランクパート、TestPart2がWorkspaceワークスペースの子となっています。
2.の2.ですがDecalデカールの親はSpawnLocationとなっています。また、2.の3.ですがTestPartの子はChangeColorScriptチェンジカラースクリプトです。

エクスプローラ上での子の見分け方としては親の左にある黒い逆三角マークをクリックしてみて表示されたり非表示になるものが子となっています。

関数とは

――ある日の会話――

たかし
たかし

先生、プログラミングについて調べていると必ず関数という言葉が出てくるんですがこれはなんですか?
数学でも関数は出てきますが、同じなんですか?

先生
先生

いい質問ですね。
数学では関数というのは数同士の関係を表したものなどと習いますね。
一度関数を作ってしまえばそれをルールとしてある入力を別の出力に変換することができます。

たかし
たかし

うーん、確かに最初は表を書いてそこから関係式を導いていたような。
そして出来上がった関数を使ってグラフを書いたりしてましたね。

先生
先生

プログラミングでの関数もほとんど同じことをするんですが、違いといえば関数の入出力が数値だけとは限らないということでしょうか。また、いくつかの処理をまとめたものも関数と呼ばれることがあります。

たかし
たかし

言葉だけじゃわからないよ~

解説

関数とは一言でいうと次の2つの役割を果たすものです。

  1. 入力→処理→出力をまとめたもの
  2. いくつかの処理をまとめたもの

この2つが同時に成り立っている必要はありません。今回は2.の役割を紹介します。

関数の書き方1

Lua言語では関数を次のようにして宣言せんげんします。

function 関数名(引数)
  処理
  return 戻り値
end

これが基本となる関数の書き方です。処理やreturnリターン文といった関数の中身は必ずインデント(スペースを2つ分空けること)してから書くようにしましょう。

次回くわしく説明しますが、引数とは関数にわたす入力値のことで、戻り値とは関数から渡される出力値のことです。入力値や出力値がない場合は引数やreturn文を書かなくても大丈夫です。また、関数名はローワ―キャメルケースで書かれることが多いです。(命名規則

変数と同じように関数は宣言するだけではダメで使いたい場所で次のように呼び出す必要があります。

関数名(引数)

ただし、関数を呼び出すことができるのは関数を宣言した後です。

関数の書き方2

Lua言語では関数は関数型という変数として扱うことができます。そのため、次のように変数の中に関数を代入することもできます。

変数 = function(引数)
  処理
end

この書き方は匿名関数とくめいかんすう無名関数むめいかんすうと呼ばれ、例えば1度しか使わないような関数やイベントを宣言する場合などによく使われます。

いくつかの処理をまとめる役割としての関数

さて、関数の書き方がわかったところで関数の役割の1つである処理をまとめるというものについて説明します。

例として1~5を1行ずつ順番に表示するプログラムを作りたいとします。

print("1")
print("2")
print("3")
print("4")
print("5")

ここまでの知識を使うと上のようなプログラムが書けたかと思います。
では、これを好きなタイミングで何回か使いたいとします。毎回使いたい場所で上のようなコードを書くのは面倒ですよね。そこで関数を使います。

local function printNum()
  print("1")
  print("2")
  print("3")
  print("4")
  print("5")
end

printNum()
print("9999")
printNum()

Roblox Studio上で実行してみてください。一度関数としてまとめてしまえば後は好きなタイミングで呼び出すだけなので便利ですよね。実際に大規模だいきぼなゲームを開発する際にはこのような使い方をすることもあります。

注意点

処理をまとめるという使い方で関数を使う時に注意したいのが機能きのうごとにまとめるようにするということです。

例えば、てきを倒したらスコアを計算して表示するというようなスコア処理があったとします。

このとき、敵を倒したらスコアを計算して表示するという一連の流れをそのまま関数化したくなりますが、これだとデバッグや変更の際に面倒めんどうなことになってしまいます。こういう場合は敵を倒したことを検知けんちする関数、スコアを計算する関数、スコアを表示する関数のようになるべく小さな機能ごとに関数を作るようにしましょう。

最後に

――ある日の会話――

たかし
たかし

関数の書き方についてなんとなくわかりました。
使い方はまだよくわかってませんが…

先生
先生

最初はそんなもんですよ。
使っていくうちに慣れるので安心してください。
大事なことは学んだことをなるべく使うようにすることです。

まとめ

  • 関数には入力→処理→出力をまとめる役割と単にいくつかの処理をまとめる役割がある
  • 関数の宣言方法は2種類ある
  • 関数は宣言だけでなく使いたい場所で呼び出す必要がある
  • 関数化するときにはなるべく最小の機能ごとにわける

お疲れ様でした。第8回はここまでです。
次回は入力→処理→出力としての役割を果たす関数について説明します。

コメント

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