ユーザー定義関数
ユーザー定義関数とは
LL定義関数だけを使ってスクリプトを書いていってもいいのですが、基本的ではない、つまり高度なスクリプトを書いていくと、次第にある壁にぶつかります。
それは、同じような文章を何度も何度も繰り返すうちにスクリプトがかなり大きな要領になり、自分でもどこがどこだかわからなくなっていくという壁です。(そのようなスクリプトは俗にスパゲティプログラムと呼ばれ、デバッグの際に相当の苦労を強いられることになります)
そこで役立つのがユーザー定義関数です。
ユーザー定義、という名前の通り、これはLSLでリンデンラボがもともと用意した関数ではなく、自分でつくることのできる関数です
LSLWikiのUserDefinedFunction(ユーザー定義関数)のページを見てみましょう。
http://rpgstats.com/wiki/index.php?title=UserDefinedFunction
User-defined functions are blocks of code that can be executed just like a built-in "ll" function. They are used to improve readability and to reduce the amount of redundant code in a script. If you copy and paste a section of code more then once in a script, that code should be put into a function.
訳文(多少あやしいのですが)
ユーザー定義関数はコードの一部を関数(Function)として利用できる第二の関数です。
ユーザー定義関数を用いることで、冗長なコードの量を減らし、スクリプトの読みやすさを改善することができます。
もし、あなたが同じコードを何度もコピーペーストでスクリプトに入れているのであれば、それはユーザー定義関数にしなければなりません。
スクリプトを書く際、要求されるのはより高度なスクリプトを書くこともそうですが、スクリプトをよりシンプルにかつ、量を減らすことも求められます。
スクリプトをシンプルにするには2つの方法があり、一つはムダな文章を省くこと(これは熟練したプログラマーであればあるほど上手です)。もう一つは何度もでてきているコードをユーザー定義関数に収納してコンパクトにすることです。
ユーザー定義関数を指定する命令文(形式)以下の通りです。
type functionName(type parameter1, type parameter2, type parameter3) {}
typeのところにはLSLWikiで記述されている『型』というものが入ります。
各type parameterは設定です。設定のいらないユーザー定義関数はfunctionname()と記述することになります。
ユーザー定義関数 第一型
比較的理解のしやすい型です。(LSLWikiからの引用)
01行目:sayOutloud(string message) {
02行目: llSay(0, message);
03行目:}
04行目:
05行目:saySomething() {
06行目: sayOutloud("Something");
07行目:}
08行目:
09行目:default {
10行目: state_entry() {
11行目: saySomething();
12行目: }
13行目:}
このスクリプトはsayOutloudというユーザー定義関数を作った後、それをさらにsaySomethingというユーザー定義関数にしてから出力しているものです。
実質的には、
default {state_entry(){llsay(0,"Something");}}
と全く同様のスクリプトです。これだけ短いスクリプトだと、ユーザー定義関数にする意味はあまりありませんが、もっと大規模なスクリプトだと、かなりの効力を発揮します。
解説
1行目~3行目。llsay(0,message)という関数をユーザー定義関数にしています。sayOutloudでstring型の変数messageが定義されていますので、ここではsayOutloud("string text")というsayで文章を話すユーザー定義関数が定義されました。
5行目~6行目。1行目~3行目で定義したユーザー定義関数にSomethingの値を代入したものを新しくユーザー定義関数saySomethingとして定義しています。
9行目~12行目。ユーザー定義関数saySomethingの実行。
LSLWikiの3番目のサンプルもこの形と大差はありませんので、自分でスクリプトを読んでみてください。
ユーザー定義関数 第二型
第二型は第一型とは違い、関数を変数のように用います。
LSLwikiに絶対値に関する文章をsayで話すというサンプルが用意されています。
01行目:float getAbsoluteValueOf(float value) {
02行目: if (value < 0)
03行目: return value * -1;
04行目: return value;
05行目:}
06行目:
07行目:default {
08行目: state_entry() {
09行目: float myFloat = 4.392;
10行目: float absFloat = getAbsoluteValueOf(myFloat);
11行目: llSay(0, "The absolute value of " + (string) myFloat
12行目: + " is " + (string) absFloat);
13行目: }
14行目:}
(LSLWikiからの引用)
解説
1行目。getAbsoluteValueOfというユーザー定義型関数を定義しています。floatは整数型の変数を定義する際に用いられるので、関数に入れる変数の型に応じてintやstringにこの部分を変えてください。
1行目~4行目では、valueが0より低いならvalueに-1をかけてプラスにしてからreturnで値を戻す。プラスならそのまま値を戻す。という処理をするユーザー定義関数が定義されています。
7行目~12行目では、myFloatという変数を定義して4.392を代入、また、absFloatにmyFloatの値をユーザー定義関数を絶対値化したものを代入しています。11行目、12行目で"The absolute value of 4.392 is 4.392"(4.392の絶対値は4.392です)という文章を出力しています。