Skip to content

Instantly share code, notes, and snippets.

@pocketberserker
Last active December 25, 2022 13:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pocketberserker/0a8d4c77780de8defd49ec88447205c8 to your computer and use it in GitHub Desktop.
Save pocketberserker/0a8d4c77780de8defd49ec88447205c8 to your computer and use it in GitHub Desktop.

「スクリプト付きアむテム」のためのJavaScript入門非公匏

本資料では「スクリプト付きアむテム」に採甚されおいるJavaScriptずいうプログラミング蚀語に぀いお、公匏サンプル集で䜿われおいる範囲に絞っお解説したす。

プログラミング経隓がある堎合は本資料の代わりにJavaScript Primerあるいは同名の曞籍を取っ掛かりにするか、玠晎らしいリファレンスであるMDN Web Docsを参考にしたしょう。

本資料に䞍正確な蚘述がある堎合はぜひご指摘ください(@pocketberserkerにメンションされれば数日内にアクションしたす)。 できる限り修正察応したいず考えおいたす。

非公匏、ず曞いたのは䌚瀟の業務ずは関係ない時間に曞いたからです

環境の準備

動くクラフトアむテムを䜜っおみようを参考にし぀぀、スクリプト゚ディタやコン゜ヌルが䜿える環境を敎えおください。

コン゜ヌルの衚瀺の意味

コン゜ヌルでは、ナヌザヌが入力したコヌドは行頭に >、 入力されたコヌドを実行した際に取埗した結果には行頭に < が衚瀺されたす。 たた $.log で出力されたメッセヌゞには情報ログを衚すアむコン ℹ、スクリプトが゚ラヌになったずきのメッセヌゞにぱラヌログを衚すアむコン赀色のℹが行頭に衚瀺されたす。

本資料では、赀色のℹが衚せない郜合により゚ラヌログのアむコンを❌で代甚しおいたす。

数倀ず蚈算

JavaScriptは敎数や小数ずいった数倀を扱えたす。 コン゜ヌルでは入力した数倀がそのたた衚瀺されたすが、これによりコン゜ヌルが数倀をちゃんず認識しおいるずわかりたす。

> 3
< 3
> -5
< -5
> 1.1
< 1.1

JavaScriptでは数字ずいく぀かの蚘号を甚いた蚈算は数匏ずしお実行されたす。 詊しに2 + 2ずコン゜ヌルに入力しお゚ンタヌキヌを抌しおみるず、4ずいう蚈算結果が衚瀺されるはずです。

> 2 + 2
< 4

JavaScriptにはいく぀かの算術挔算が甚意されおおり、算術挔算に甚いられる蚘号を算術挔算子ず呌びたす。 もっずも簡単な算術挔算は四則挔算ず剰䜙です。

蚘法 解説
A + B A 足す B
A - B A 匕く B
A * B A 掛ける B
A / B A 割る B
A % B A を B で割った䜙り

䞀般的な算数ず同様に、ひず぀の匏の䞭で耇数の四則挔算を甚いるこずができたす。 このずきの蚈算の優先順序も䞀般的な抂念ず同様です䟋: */ は +- より先に蚈算する。

> 1 + 2 * 3
< 7

たた、蚈算の優先順序を指定したい堎合は(ず)で囲みたす。

> (1 + 2) * 3
< 9

文字列

倚くのプログラミング蚀語では、連続した文字の䞊びを衚すデヌタを文字列ず呌びたす。 JavaScriptでは'シングルクォヌトあるいは"ダブルクォヌトで囲んだ文字を文字列ずしお扱いたす。

> 'こんにちは'
< こんにちは
> "Hello Cluster!"
< Hello Cluster!

文字が0個の文字列は空文字列ず呌ばれたす。

> ''
<

'や"で囲わなかった堎合ぱラヌになりたす。 囲い忘れはプログラミングにありがちなミスなので、゚ラヌが衚瀺されおも慌おずに察凊したしょう。

> さようなら
❌ ReferenceError: さようなら is not defined

'で囲んだ文字列の䞭で'を䜿いたいずき、もしくは"で囲んだ文字列の䞭で"を䜿いたいずきには\(バックスラッシュ、Windowsでは¥蚘号が衚瀺されるこずも)を盎前に眮く必芁がありたす。 これを゚スケヌプず呌びたす。

> 'I\'m cluster user.'
< I'm cluster user.

文字列は他の文字列や数倀ず+蚘号で連結するこずで新たな文字列ずなりたす。

> 'Hello' + 'Cluster'
< HelloCluster

> 1 + ' + ' + 1 + ' = ' + 2
< "1 + 1 = 2"

'ず"に意味的な違いはなく、どちらを䜿うかは開発者の奜みや開発プロゞェクトが採甚するコヌディング芏玄プログラムの曞き方に関する決たりごずによっお異なりたす。 本資料では䞻に'を䜿甚しおいたすが、奜みにあわせお"に眮き換えおも動䜜に圱響はありたせん。

倉数

倉数は倀に名前を぀け、識別しやすくしたり再利甚しやすくするための機胜です。 JavaScriptではletキヌワヌドを䜿うこずで倉数を定矩できたす。 倉数に倀をセットするこずを代入ず呌びたす。

倉数が定矩されおいない堎合ぱラヌずなりたす。 詊しにコン゜ヌルにiず入力しおください。

> i
❌ ReferenceError :i is not defined

次に倉数iを定矩し、iに10を代入しおからiを呌び出しおみたしょう。 このずき、事前に定矩された倉数iにセットされた10が衚瀺されたす。

> let i = 10
< undefined
> i
< 10

倉数名はある皋床自由に぀けられたすが、゜ヌスコヌドを埌から読み返すずきに理解しやすいような名前を぀けるべきです。

定矩した倉数は、別の倉数を定矩する際や文字列ずの連結にも䜿えたす。

> let j = i * 2
< undefined
> i + 'の2倍は' + j + 'です'
< 10の2倍は20です

数倀をセットした倉数には++むンクリメントず--デクリメントずいう算術挔算子が䜿えたす。 ++は指定した倉数にセットされた数倀を結果ずしお返し぀぀、その数倀に1加えた倀を倉数ぞセットしたす。 --は逆に、1枛らした倀を倉数にセットしたす。

> let i = 0
< undefined
> i++
< 0
> i
< 1
> i--
< 1
> i
< 0

letキヌワヌドで定矩した倉数には別の倀を再代入できたす。 再代入する堎合にはletは必芁ありたせん。

> i = 5
< 5
> i
< 5

たた、挔算ず代入を省略しお蚘述できる耇合代入挔算子がありたす。 䟋えば巊偎の倉数の倀ず右偎の倀を加算した結果を倉数に代入する際には+=を甚いるこずもできたす。

> i = 1
> i
< 1
> i += 2
> i
< 3

耇合代入挔算子は数が倚いので、他にどういうものがあるかは調べおみおください。

定数

プログラミングでは「毎フレヌムごずに移動させる距離」ずいった固定の倀に名前を付けたいこずがありたす。 先ほど説明した倉数でも名前を付けられたすが、定数ずいう機胜を甚いるず再代入できないこず倀を固定できるこずをプログラム䞊で保蚌できたす。 再代入できないようにするこずで意図しない倀の倉曎を怜知できるようになりたす。

JavaScriptではconstキヌワヌドで定数を定矩できたす。

> const speed = 1.0
< undefined
> const range = 2.0
< undefined

定数には再代入を行えたせん。 詊しに先ほど定矩した speed に倀を代入しおみるず、定数に代入できないこずがわかりたす。

> speed = 2.0
❌ TypeError: Assignment to constant variable.

倀を倉曎する必芁のない倉数は積極的に定数に眮き換えたしょう ただし、コン゜ヌルでは定数を䞀床定矩するず倀を倉曎できなくなっおしたうので、以降のサンプルでは let を甚いる堎合がありたす。

文

JavaScriptでは凊理を実行する1ステップを文ず呌びたす。 文ず文は䞻に;セミコロンを䜿っお区切りたす。

文;
文;
文;
...

JavaScriptには;がない文にも行末に;を自動挿入する特殊ルヌルがありたす。 しかし、このルヌルは意図しない挙動を匕き起こしやすいため、実際のコヌドでは文に;を぀けるこずが倚いです。

ただし、コン゜ヌルにおいお1行ず぀入力しおコン゜ヌルからの応答を埅぀堎合は;を省略するこずがありたす。 ここたで;を曞かずにいたのはこれが理由です。

たた、埌ほど登堎するif文やfor文の末尟に;を曞く必芁はありたせん。

関数定矩ず呌び出し

プログラムを効率的に曞いたり読みやすいものにする道具のひず぀に関数がありたす。 関数は䜕か倀を受け取っお、関数内に曞かれた凊理を実行したす䜕も受け取らない関数も定矩できたす。

䟋えば、ScriptableItemの゜ヌスコヌド内で䜿甚可胜な $.log は枡した数倀や文字列、倉数をコン゜ヌルに衚瀺しおくれる関数です厳密な説明をするずややこしくなるので、ここではただそういうこずにしおおいおください。

> $.log("Hello Cluster!")
ℹ Hello Cluster!
< null
> $.log(speed)
ℹ 1
< null

コン゜ヌルに数字や文字列を盎接入力しおいたずきず異なり、むンフォメヌションの出力ずしお結果が衚瀺されたず思いたす。 これは、コン゜ヌルに倀を入力したずきに結果が衚瀺されたのは「入力したプログラムによっお埗られた最埌の蚈算結果を衚瀺する」コン゜ヌルの機胜であるこずに察し、$.logは「枡されたその時点の倀をコン゜ヌルに衚瀺する」ずいう違いがありたす。

$.logはScriptableItemであらかじめ甚意された関数ですが、関数は自分で定矩するこずもできたす。

JavaScriptでは、関数は倉数ず同様にある皋床自由に名前を決められたす。 今回は次のような圢匏で関数を定矩するこずにしたす次のコヌドは実行できたせん。

const 関数名 = (匕数) => {
  ここに凊理を曞く
};

たずは単玔にHello Cluster!を衚瀺するだけの関数を定矩しおみたす。

> const sayHelloCluster = () => {
    $.log('Hello Cluster!');
  };

関数は定矩しただけでは䜕も起きたせん。 定矩した関数を呌び出すこずではじめお、関数内に蚘述したコヌドが実行されたす。

> sayHelloCluster()
ℹ Hello Cluster!
> undefined

関数を呌び出す際に呌び出し偎から倀を枡せるよう、 匕数ひきすう を蚭定するこずができたす。

では、匕数の倀を甚いおHello **!ずコン゜ヌルに衚瀺するsayHello関数を定矩しおみたしょう。

> const sayHello = (name) => {
    $.log('Hello ' + name + '!');
  };

枡したい倀を括匧内に指定しお関数を実行したす。

> sayHello("Cluster")
ℹ Hello Cluster!
> sayHello("World")
ℹ Hello World!

䜕回も䌌たような凊理を行いたい堎合や、あるひずたずたりの凊理に名前を付けたい堎合は関数ずしお定矩するこずを考えおみおください。

真理倀

プログラミングで扱うデヌタは数倀や文字列のほかにもさたざたな圢匏がありたす。 そのうちのひず぀が真理倀ず呌ばれるデヌタ圢匏デヌタ型です。

真理倀は真trueず停falseの2぀の倀しかないデヌタ型で、埌述する比范挔算や論理挔算の結果ずしお甚いられおいたす。 たた、耇雑な凊理を行うための条件分岐や繰り返し構文を理解するには必須ず蚀っおよい、重芁なデヌタ型になりたす。

比范挔算

䟋ずしお、ある動いおいるアむテムの速床itemSpeedが速いか遅いかを刀定しお出力するこずを考えおみたす。 ここでは10未満を「遅い」、20以䞊は「速い」、その間は「普通」ず定矩したす。

たずえば「倉数itemSpeedの倀が10以䞋遅いか」ずいう条件があったずき、この条件の結果は 「条件を満たすtrue」 か 「条件を満たさないfalse」 のいずれかです。 このように倀を比范するこずを比范挔算ず呌び、その結果は必ず真理倀trueもしくはfalseずなりたす。

倀の比范を行う堎合、JavaScriptでは次のような比范挔算子を䜿いたす。

蚘法 解説
A < B AがBより小さければ真AはB未満である
A <= B AがBより小さいたたは等しければ真AはB以䞋である
A > B AがBより倧きければ真AはBより倧きい
A >= B AがBより倧きいたたは等しければ真AはB以䞊である
A === B AずBが等しければ真AずBは等しい
A !== B AずBが異なれば真AずBは異なる

たずえば、「倉数itemSpeedの倀は10未満である」ずいう比范をJavaScriptで衚珟するずitemSpeed < 10ずなりたす。

> let itemSpeed = 6.5
> itemSpeed < 10
< true

論理挔算

今回考えようずしおいるスピヌドチェックで"普通"ず刀断する条件は「itemSpeedが10以䞊か぀20未満」であるこずです。 このように、2぀の真理倀を組み合わせおひず぀の真理倀を結果ずする挔算を論理挔算ず呌び、JavaScriptでは論理挔算子を甚いお蚘述したす。

蚘法 意味 解説
A && B 論理積AND 巊右がどちらも真なら真Aか぀B
A || B 論理和OR 巊右どちらかが真なら真AたたはB
!A 論理吊定NOT 真理倀を反転させるAではない

「倉数itemSppedは10以䞊か぀20未満」ずいう条件をJavaScriptで衚すず次のようなコヌドになりたす。

> itemSpeed = 15
> itemSpeed >= 10 && itemSpeed < 20
< true

たた、「普通のスピヌドではない」ずいう条件は「itemSpeedが10未満もしくは20以䞊である」ずいえたす。

> itemSpeed = 8
> itemSpeed < 10 || itemSpeed >= 20
< true

真理倀や条件匏に!を぀けるずtrueずfalseが反転したす。 たた、比范挔算や論理挔算にも通垞の四則挔算ず同様に優先順䜍があり、()で囲むこずにより優先しお蚈算させるこずが可胜です。

次の䟋では「itemSpeedが10未満ではない」ずいう条件をJavaScriptで曞いたものになりたす。

>  !(itemSpeed < 18.5)
< false

比范挔算子や論理挔算子を䜿った匏を条件匏ず呌びたす。 条件匏をうたく䜿うこずにより、「y座暙が0以䞊か぀100以䞋である」のような耇雑な条件をプログラムで衚珟できるようになりたす。

条件分岐

たいおいのプログラミング蚀語には、条件匏の結果によっお異なる凊理をさせる条件分岐ず呌ばれる機胜が存圚したす。 JavaScriptではif文を甚いお条件分岐を衚珟したす次のコヌドは実行できたせん。

if (条件匏) {
  条件匏を満たす堎合に実行したい凊理
}

ifの盎埌にある()内の条件匏がtrueならば、それに続く{}内の凊理が行われたす。

> itemSpeed = 6;
> if (itemSpeed < 10) {
    $.log('このアむテムは遅いです');
  }
ℹ このアむテムは遅いです
> itemSpeed = 15;
< undefined
> if (itemSpeed < 10) {
    $.log('このアむテムは遅いです');
  }
< undefined

条件を満たさない堎合停の堎合の凊理も蚘述したいずきはelse文を䜿いたす。 たた、else if文を甚いおさらに现かい条件分岐をさせるこずが可胜です。

if ~ else文は䞊から順に凊理されおいき、条件に合臎するものがあれば続く{}の䞭だけが実行され、他の凊理は実行されたせん次のコヌドは実行できたせん。

if (条件匏1) {
  条件匏1を満たす堎合に実行したい凊理
} else if (条件匏2) {
  条件匏2を満たす堎合に実行したい凊理
} else if (条件匏3) {
  ...
} else if (条件匏N) {
  条件匏Nを満たす堎合に実行したい凊理
} else {
  条件匏1~Nを満たさない堎合に実行したい凊理
}

これで「itemSpeedが10未満は遅い、20以䞊は速い、その間は普通」ずいう耇雑な条件分岐を衚珟できるようになりたした。

>  itemSpeed = 30
>  if (itemSpeed < 10) {
     $.log(''このアむテムは遅いです'');
   } else if (itemSpeed >= 20) {
     $.log(''このアむテムは速いです'');
   } else {
     $.log(''このアむテムは普通の速床です');
   }
ℹ このアむテムは速いです

配列

プログラミングをしおいるず、いく぀かの同じようなデヌタを倧量に扱いたいこずがありたす。 JavaScriptでは、耇数のデヌタをたずめお扱うために配列ずいうデヌタ構造が甚意されおいたす。

配列は[]で囲み、それぞれのデヌタは,区切りで衚珟したす。

let names = ['alice', 'bob', 'charlie']

配列の各デヌタ芁玠にアクセスするには、[]に芁玠の番号むンデックスを指定したす。 先頭のむンデックスが0であるこずに気を぀けおください。

> names[1]
< bob

配列には文字列や数倀、倉数などさたざたなデヌタ型を栌玍できたす。

>  let dog = 'プヌドル'
>  let anything = [10, 'string', dog]
>  anything[2]
< "プヌドル"

ただし、耇数のデヌタ型をひず぀の配列にいれるのは混乱のもずになりやすいため避けるべきです。 耇数のデヌタ型をひずたずめにしたい堎合は埌述するオブゞェクトを利甚したしょう。

配列に倀を远加したり䞊曞きしたい堎合は、むンデックスを指定しお倀を代入したす。

> names[2] = 'charlotte'
> names[3] = 'daisy'
> names[2]
< charlotte
> names[3]
< daisy

'charlie'が'charlotte'に䞊曞きされ、新しく'daisy'が远加されたした。 ただ、配列に倀を远加する堎合は埌述するメ゜ッド 配列、 push で調べおみおください を甚いた曞き方を䜿うほうが倚いです。

埌から倀を蚭定するために、䜕も入っおいない配列空配列を定矩するこずも可胜です。

> let numbers = []
> numbers[0] = 0
> numbers[1] = 1
> numbers[2] = 2

繰り返しルヌプ)

プログラムが埗意な仕事のひず぀ずしお繰り返しがありたす。 同じような䜜業を䜕回ずなく繰り返すず人間は疲れたりミスしたり䞍機嫌になったりしたすが、プログラムは文句もいわず間違えず、粛々ず䜜業をこなしおくれたす。

プログラムが繰り返し凊理を行うこずをルヌプず呌びたす。 JavaScriptにはいく぀かのルヌプ構文がありたすが、ここではもっずも基本的なfor文に぀いお説明したす次のコヌドは実行できたせん。

for (初期化凊理; ルヌプの継続条件; 1ルヌプ終了時の凊理) {
    繰り返す凊理
}
  • 初期化凊理
    • ルヌプの最初に1回だけ実行されたす
  • ルヌプの継続条件
    • 条件匏が true であれば、盎埌の {} 内に蚘述された「繰り返す凊理」が実行されたす
  • 1ルヌプ終了時の凊理
    • 「繰り返す凊理」を実行した埌に実行されたす

初期化凊理でルヌプ開始条件を決め、ルヌプの継続条件がtrueである間繰り返す、ずいう流れを想像しおください。

> for (let i = 1; i <= 5; i++) {
    $.log(i);
  }
ℹ 1
ℹ 2
ℹ 3
ℹ 4
ℹ 5
< null

(let i = 1; i <= 5; i++) は次のようなこずを衚しおいたす。

  • 初期化凊理
    • i ずいう倉数を定矩し、初期倀ずしお 1 を代入したす
  • ルヌプの継続条件
    • i が 5 以䞋の堎合、ルヌプを継続したす
  • 1ルヌプ終了時の凊理
    • i を 1 ず぀増やしたす

぀たり䞊蚘のコヌドは「iは1から始たり、1ず぀増加し、iが5を超えるたでコン゜ヌル衚瀺を繰り返す」ルヌプになりたす。

ルヌプず配列

ルヌプ繰り返し凊理は、配列のようなたくさん䞊んだデヌタに察しお同じ凊理を行うずきに真䟡を発揮したす。 䟋ずしお、配列の党デヌタを10倍にしお衚瀺するコヌドを曞いおみたしょう。

> let numbers = [3, 5, 12, 6, 0];
> let length  = numbers.length;

配列に察しお.lengthを蚘述するこずで、その配列の芁玠数を取埗できたす。 この堎合は5をlength定数ずしお定矩しいおいたす。

> for (let i = 0; i < length; i++) {
    $.log(numbers[i] * 10);
  }
ℹ 30
ℹ 50
ℹ 120
ℹ 60
ℹ 0

オブゞェクト

関連する耇数のデヌタをひずたずめにするために利甚されるデヌタ型のひず぀がオブゞェクトです。 オブゞェクトはプロパティの集たりであり、プロパティは名前あるいはキヌず倀のペアから成り立っおいたす次のコヌドは実行できたせん。

{
  プロパティ名1: 倀,
  プロパティ名2: 倀,
  ...
  プロパティ名N: 倀
}

.ドットに続いおプロパティ名を蚘述するず、オブゞェクトに定矩されたプロパティに蚭定されおいる倀を取埗できたす。 オブゞェクトのプロパティには文字列を䜿っおアクセスするこずも可胜です。

> let person = {
    name: 'Swanman',
    age: 20
  }
< undefined
> person.name
< Swanman
> person["age"]
< 20

プロパティには関数を蚭定するこずもでき、JavaScriptではオブゞェクトのプロパティに蚭定された関数のこずをメ゜ッドず呌びたす。 メ゜ッドを呌び出す方法は関数ずプロパティの呌び出しを合わせた圢になりたす。

> let greeting = {
    hello: () => {
      return 'Hello!';
    }
  }
< undefined
> greeting.hello()
< Hello!

これたで$.logを関数ずしお扱っおいたしたが、実は$ずいう名前で定矩された定数オブゞェクトのlogメ゜ッドがより正確な衚珟です。

undefined

前節でオブゞェクトのプロパティ呌び出しを玹介したしたが、はたしお存圚しないプロパティを呌び出したらどうなるでしょう

> person.icon
< undefined

ずいうこずで、存圚しないこずを衚す倀undefinedが結果ずしお埗られたす。

さお、ここからがJavaScript固有の面倒くさい話なのですが、undefinedをif文の条件匏に枡した堎合は自動的にfalseず刀定されたす。 さらにundefinedを!で反転させるずtrueが埗られたす。 このこずを利甚しお、特定のプロパティに倀が蚭定されおいないずきに凊理を実行させる方法がありたす。

> if (!person.icon) {
    $.log(person.name + 'さん、iconを蚭定しおください');
  }
ℹ Swanmanさん、iconを蚭定しおください

null

JavaScriptには意図的に倀がないこずを衚す null が甚意されおいたす。 null ず undefined は等䟡な倀でない、぀たり null === undefined は false であるこずに泚意しおください。

クラス

クラスはむンスタンスず呌ばれるオブゞェクトを生成するためのテンプレヌトです。 テンプレヌトず曞いた通り、クラスを定矩しただけではデヌタは䜕も生成されたせん。

正盎なんのこっちゃだず思うので、ここでは独自クラスの定矩に぀いおは忘れ、Cluster Creator Kit Scriptが提䟛しおいるクラスの䜿い方をかい぀たんで玹介したす。

ScriptableItemにはVector2、Vector3、Quaternionずいう3぀のクラスが最初から甚意されおいたす。 クラスのむンスタンスはnew クラス名()の圢匏で生成できたす。

各クラスにはむンスタンスを生成する際に初期倀を指定できたす。 むンスタンス生成時に指定できるものはクラスごずに決たっおいお、䟋えばVector3のx、y、zに初期倀ずしおそれぞれ0.0、0.0、1.0を蚭定したいならnew Vector3(0.0, 0.0, 1.0)ずいう蚘述になりたす。

Vector2、Vector3、Quaternionには色々なメ゜ッドが定矩されおいるので、気になる方はCluster Creator Kit Script Referenceをご確認ください。

コメント

プログラムはこれたでに登堎した倉数や関数、条件分岐、ルヌプがいく぀も集たっおできおいたす。

しかし、既存のプログラムからは「どう動くか」は読み取れおも「なぜそのような凊理を曞いたのか」が読み取れないこずが倚いです。 そういった実装意図をプログラムのそばに蚘述できるように、プログラミング蚀語にはコメントずいう機胜が甚意されおいたす。 コメントはプログラムを実行する際に無芖されるように䜜られおいたす。

JavaScriptには1行コメントず耇数行コメントずいうふた぀の曞き方が甚意されおいたす。 1行コメント//は、//以降の同䞀行にある文字列をコメントずしお扱いたす。 耇数行コメント/* ~ */は、/*ず*/の間に蚘述されおいる文字列すべおをコメントずしお扱いたす。

// 1行コメントの䟋

/*
耇数行コメントの䟋
耇数行コメントの䟋
*/

関数再び

䞀通りの説明が終わったのでよしサンプルを  ず行きたいずころですが、関数に぀いお少し埌回しにしおいたこずがありたす。

無名関数

䟋ずしお公匏サンプル集のX軞方向に反埩移動するを芋おみたしょう。

// 基本的な動きを぀くるこずができるスクリプトのサンプルコヌド集 - X軞方向に反埩移動する
const speed = 1.0;
const range = 2.0;
const direction = new Vector3(1.0, 0.0, 0.0).normalize();

$.onUpdate(deltaTime => {
  if (!$.state.initialized) {
    $.state.initialized = true;
    $.state.pivot = $.getPosition();
    $.state.time = 0.0;
  }

  $.state.time += deltaTime;

  $.setPosition($.state.pivot.clone().add(direction.clone().multiplyScalar(Math.sin($.state.time * speed) * range).applyQuaternion($.getRotation())));
});

$.onUpdate(deltaTime => { ... });ず関数のようなものがメ゜ッドに枡されおいたすね。

実は(匕数) => {}の圢で定矩しおいるものは無名関数ず呌ばれおいるもので、数倀や文字列ず同様に倀ずしお扱えたす。 この無名関数を定数ずしお定矩したものを本資料では関数ず呌んでいたわけです。

サンプルの無名関数に名前を぀け、次のように曞くこずもできたす。

const onUpdateCallback = deltaTime => {
  if (!$.state.initialized) {
    $.state.initialized = true;
    $.state.pivot = $.getPosition();
    $.state.time = 0.0;
  }

  $.state.time += deltaTime;

  $.setPosition($.state.pivot.clone().add(direction.clone().multiplyScalar(Math.sin($.state.time * speed) * range).applyQuaternion($.getRotation())));
}

$.onUpdate(onUpdateCallback);

ずはいえ、onUpdateCallbackはスクリプト内で耇数箇所で呌び出すわけではありたせんし、名前を付けるにしおも「updateルヌプ毎に呌び出される関数」以䞊の情報量を持たせられず、関数もそれほど長くないので名前を付けるほどでもないず考えるこずもできたす。

ちなみに、無名関数の匕数が1぀の堎合は括匧(ず)を省略できたす。

return

別のサンプルむンタラクトするずZ軞方向に反埩移動するを芋おみたしょう。

// 基本的な動きを぀くるこずができるスクリプトのサンプルコヌド集 - むンタラクトするずZ軞方向に反埩移動する
const speed = 1.0;
const range = 2.0;
const direction = new Vector3(0.0, 0.0, 1.0).normalize();

$.onInteract(() => {
  $.state.enabled = !$.state.enabled;
});

$.onUpdate(deltaTime => {
  if (!$.state.initialized) {
    $.state.initialized = true;
    $.state.pivot = $.getPosition();
    $.state.time = 0.0;
    $.state.enabled = false;
  }

  if (!$.state.enabled) return;

  $.state.time += deltaTime;

  $.setPosition($.state.pivot.clone().add(direction.clone().multiplyScalar(Math.sin($.state.time * speed) * range).applyQuaternion($.getRotation())));
});

if (!$.state.enabled) return;に぀いおの説明がなされおいなかったので、かい぀たんで解説したす。

if文は䞭の凊理が1文のみのずきは波括匧{ず}を省略できたす。 ぀たり、先のコヌドは省略しないで曞いたず次の蚘述ず同じ意味になりたす。

if (!$.state.enabled) {
  return;
}

この括匧を省略するかどうかは人や堎合による、ずいった感じです。 䞋手に省略しおコヌド倉曎時にバグを誘発しおしたうくらいなら党郚省略しないずいうこずもありたすし、returnくらいわかりやすいものなら省略しおも良いのではずいう話もありたす。

returnは呌び出された関数の凊理をその堎所たでで終了するためのキヌワヌドです。 returnに到達した時点で関数の実行が終わるので、その埌の行に曞かれた関数の凊理は実行されたせん。

先のサンプルの堎合だず「!$.state.enabledがtrue$.state.enabledはfalseならこの関数の凊理を終える」ずなりたす。

サンプルの解説

続線を曞いおみたした

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment