﻿1
00:00:04,270 --> 00:00:05,530
‫こんにちは､ ようこそ｡

2
00:00:05,530 --> 00:00:15,760
‫この講義では､ 自作関数から実行ピンを削除する方法と､ いつどのように削除するのが良いかを学びます｡

3
00:00:15,760 --> 00:00:16,690
‫潜入してみよう｡

4
00:00:16,960 --> 00:00:23,560
‫そのため､ 以前は必要なかったhas ammo関数が実行ピンを持つようになり､

5
00:00:23,560 --> 00:00:27,610
‫コードが少し悪化したのは少し奇妙なことです｡

6
00:00:27,610 --> 00:00:29,110
‫では､ それは何なのか？

7
00:00:29,110 --> 00:00:35,710
‫なぜそのようなことが起こったのか､ また､ あるファンクションノードでは実行ピンが必要で､ 他のファンクションノードでは不要なのか｡

8
00:00:35,710 --> 00:00:39,850
‫まあ､ 結局は副作用ということになるんですけどね｡

9
00:00:39,850 --> 00:00:42,250
‫では､ 副作用とは何でしょうか？

10
00:00:42,250 --> 00:00:50,260
‫本来､ 副作用とは､ ある関数が実行された後に､ 観察可能な何らかの影響を及ぼすことです｡

11
00:00:50,350 --> 00:00:52,090
‫さて､ これはどういう意味でしょうか｡

12
00:00:52,090 --> 00:00:58,420
‫prints, print, stringを理解するために､ 副作用のある関数の例を見てみましょう｡

13
00:00:58,870 --> 00:01:01,090
‫print stringを実行した後｡

14
00:01:01,090 --> 00:01:05,860
‫画面に文字列が表示されたので､ 何かが起こったことがよくわかります｡

15
00:01:05,860 --> 00:01:12,490
‫このように､ 文字列で衝撃を加えると､ 突然､ 衝撃を加えたものが遠くへ飛んでいくので､

16
00:01:12,490 --> 00:01:16,960
‫明らかに観察可能な効果があることがわかります｡

17
00:01:17,440 --> 00:01:25,210
‫弾薬を設定した後は､ その変数の値が変化しているので､ 弾薬を設定することで観察可能な効果が得られます｡

18
00:01:25,210 --> 00:01:29,320
‫さて､ ここで皆さんは､ 「どんな関数にも観測可能な効果があるはずだ」と思われるかもしれません｡

19
00:01:29,320 --> 00:01:31,540
‫そうでなければ､ 何の意味があるのでしょうか？

20
00:01:31,600 --> 00:01:32,740
‫まあ､ そうでもないんですけどね｡

21
00:01:32,740 --> 00:01:35,590
‫純粋な機能というものがあるのです｡

22
00:01:35,590 --> 00:01:37,600
‫純関数とは何ですか？

23
00:01:38,200 --> 00:01:41,170
‫基本的に副作用のない機能です｡

24
00:01:41,170 --> 00:01:45,040
‫ただし､ 戻り値はあります｡

25
00:01:45,040 --> 00:01:47,380
‫つまり､ その機能から出てくる値があるわけです｡

26
00:01:47,380 --> 00:01:53,830
‫そして､ その値を計算して教えてくれるのが､ この関数の全ての目的なのです｡

27
00:01:53,830 --> 00:01:57,250
‫そこで､ もう一度､ 例を挙げてみましょう｡ そうすれば､ かなり明確になりますから｡

28
00:01:57,520 --> 00:01:58,570
‫弾薬を入手する｡

29
00:01:58,570 --> 00:02:01,090
‫それは､ 純粋な機能です｡

30
00:02:01,090 --> 00:02:06,640
‫弾薬は何度でも手に入るので､ 副作用はありません｡

31
00:02:06,640 --> 00:02:14,380
‫そして､ そこから得た価値で何かをしない限り､ あなたのプログラム､ あなたのゲームは何も変わらないのです｡

32
00:02:14,380 --> 00:02:22,780
‫弾薬を常に入手し続けるだけで､ ゲームに何の変化も見られない｡

33
00:02:22,810 --> 00:02:24,910
‫アクティブな前方ベクトルを取得します｡

34
00:02:24,910 --> 00:02:27,730
‫これも何度でも手に入れられるものですね｡

35
00:02:27,730 --> 00:02:37,900
‫返された値で何かをするまでは何も変わりませんし､ 掛け算マイナス大のような数学的な関数もすべてそうです｡

36
00:02:37,900 --> 00:02:47,260
‫これらのノードはすべて､ その結果が何らかの大きな目的に使用されるまで､ プロジェクトに影響を与えることはありません｡

37
00:02:47,260 --> 00:02:56,920
‫これらは純粋関数と呼ばれ､ まさに実行ピンを必要としないため､ 実行ピンを持たなかったノードであることがおわかりいただけると思います｡

38
00:02:56,920 --> 00:03:08,320
‫いつ弾薬を手に入れるか､ 50回走らせるか1回走らせるかは関係なく､ 観察可能な副作用がないので問題ないでしょう｡

39
00:03:08,560 --> 00:03:13,540
‫では､ 関数が純粋であることをblueprintに示すにはどうすればよいのだろうか｡

40
00:03:13,660 --> 00:03:16,150
‫さて､ ここで私のテスト関数を見てみましょう｡

41
00:03:16,150 --> 00:03:20,800
‫イベントグラフまたはブループリント・ペインでそれを選択します｡

42
00:03:21,010 --> 00:03:25,870
‫そして､ 詳細ペインにpureと書かれたチェックボックスがあるのがわかると思います｡

43
00:03:25,870 --> 00:03:31,150
‫そのため､ このチェックボックスをオンにすると､ 実行ピンがちょうど消えることに注意してください｡

44
00:03:31,150 --> 00:03:35,410
‫そして､ 今あるのは､ この関数の入力と出力だけです｡

45
00:03:35,410 --> 00:03:40,120
‫これで､ この関数は出力が必要なときにいつでも実行されるようになります｡

46
00:03:40,120 --> 00:03:46,750
‫つまり､ この出力をprint文字列に差し込むと､ print文字列の前にこの関数が実行され､

47
00:03:46,750 --> 00:03:51,910
‫print文字列の実行に間に合うように結果が得られます｡

48
00:03:51,910 --> 00:04:01,450
‫副作用がなく､ 観測可能な効果がない関数であれば､ has ammo関数のようなものでも同じことが可能です｡

49
00:04:01,450 --> 00:04:06,280
‫そこで､ has ammoを純粋な関数にすることに挑戦してみたいと思います｡

50
00:04:06,280 --> 00:04:10,150
‫そこで､ それを選択して､ そのチェックボックスを設定し､ 純粋なものにします｡

51
00:04:10,360 --> 00:04:14,380
‫そして､ 実行の流れが今どうなっているのか｡

52
00:04:14,380 --> 00:04:17,380
‫現在それが機能を通じてフックアップされたもの｡

53
00:04:17,380 --> 00:04:18,600
‫どこに行くのでしょうか？

54
00:04:18,610 --> 00:04:20,770
‫ビデオを一時停止して､ 試してみてください｡

55
00:04:23,870 --> 00:04:24,410
‫なるほど｡

56
00:04:24,410 --> 00:04:25,360
‫お帰りなさい｡

57
00:04:25,370 --> 00:04:27,460
‫そこで､ 弾薬を選択しましょう｡

58
00:04:27,470 --> 00:04:34,760
‫純粋なチェックボックスをチェックすると､

59
00:04:34,760 --> 00:04:41,360
‫すぐに実行ピンが消えて､ 以前はhas

60
00:04:41,360 --> 00:04:51,820
‫ammoを経由していた実行フローが直接分岐文に流れます｡

61
00:04:51,830 --> 00:05:00,500
‫注意点として､ この純粋なチェックボックスは､ 関数に副作用がないことが確認できる場合にのみ使用してください｡

62
00:05:00,500 --> 00:05:09,290
‫よくあるケースや使用例としては､ has ammoのような単純に値を計算しようとする関数の場合です｡

63
00:05:09,290 --> 00:05:17,540
‫この機能が動詞の命名規則に従っていないのは､ 何かをするのではなく､ 何かを得たり､

64
00:05:17,540 --> 00:05:21,980
‫質問に答えたりするためなのです｡

65
00:05:21,980 --> 00:05:24,680
‫この場合､ 問題は弾薬があるかどうかです｡

66
00:05:24,680 --> 00:05:29,330
‫実際､ 関数に小さな疑問符を付けることもできます｡ Blueprintではできて､

67
00:05:29,330 --> 00:05:36,080
‫C++ではできないことに名前を付けて､ この関数は質問に答えているのだとわかるようにするのです｡

68
00:05:36,080 --> 00:05:37,850
‫何かをしようとしているのではありません｡

69
00:05:37,850 --> 00:05:46,490
‫ですから､ 純粋な機能とそうでない機能の区別は､ 動詞に合うか､ 質問に合うか､ ということがよくあります｡

70
00:05:46,490 --> 00:05:49,160
‫では､ 復習のために､ 用語集を見てみましょう｡

71
00:05:49,430 --> 00:05:56,660
‫副作用とは､ 私たちが見てきた機能のうち､ 観察可能な効果のことで､ その例も見てきました｡

72
00:05:56,660 --> 00:06:05,270
‫そして､ 純関数とは､ これらの取得関数や質問応答関数のような副作用のない関数のことである｡

73
00:06:05,390 --> 00:06:06,680
‫今回の講義は以上です｡

74
00:06:06,680 --> 00:06:08,120
‫次回作でお会いしましょう｡

