﻿1
00:00:03,980 --> 00:00:05,210
‫こんにちは､ ようこそ｡

2
00:00:05,210 --> 00:00:11,840
‫この講義では､ 乱雑になったブループリントを関数にきちんと整理して､ ブループリントのイベントグラフで起こっていることを簡単に読み､

3
00:00:11,840 --> 00:00:17,870
‫理解できるようにします｡

4
00:00:17,870 --> 00:00:19,850
‫さっそく､ その方法を見てみましょう｡

5
00:00:20,600 --> 00:00:26,030
‫さて､ イベントグラフを拡大してみると､ 非常にノイズが多くなってきていることがわかります｡

6
00:00:26,030 --> 00:00:28,610
‫また､ 何にも接続されていないノードがいくつか見えます｡

7
00:00:28,610 --> 00:00:34,340
‫削除する予定のgetノード､ アセット､ M0ノードがありますが､ 非常にノイズが多くなっているのがわかると思います｡

8
00:00:34,340 --> 00:00:36,860
‫何が何だかわからなくなってきた｡

9
00:00:36,860 --> 00:00:46,010
‫さて､ 一般的な解決策としては､ 「このノードのブロックは､ すべて発射体を生成するためのものだ」というものがあります｡

10
00:00:46,010 --> 00:00:47,300
‫だから､ これらを選択することができるのです｡

11
00:00:47,300 --> 00:00:54,080
‫Cキーを押すと､ コメントブロックと呼ばれるブロックがこの周囲に配置されるんだ｡

12
00:00:54,080 --> 00:01:02,360
‫そして､ spawn projectilesと入力すると､ そのコードのブロックが何をしているのかがわかるんです｡

13
00:01:02,360 --> 00:01:05,410
‫確かにそれは､ コードを整理する一つの方法です｡

14
00:01:05,420 --> 00:01:12,680
‫しかし､ 私の考えでは､ これは最良の方法ではなく､ 関数と呼ばれるより良いツールを手に入れることができました｡

15
00:01:12,680 --> 00:01:14,420
‫では､ 機能とは何でしょうか｡

16
00:01:14,780 --> 00:01:20,510
‫機能とは､ 設計図のブロックを実行し､ ゲームに何かをさせることです｡

17
00:01:20,510 --> 00:01:25,310
‫Unreal Real が提供する多くのノードは､ 実はすでに関数なのです｡

18
00:01:25,310 --> 00:01:27,380
‫だから､ これらに遭遇したのです｡

19
00:01:27,380 --> 00:01:33,170
‫例えば､ スポーンアクターの発射ノードをズームインすると､ これが関数になります｡

20
00:01:33,170 --> 00:01:39,410
‫インパルスの追加を見ると､ これは､ これらのノードのほとんどすべてに対する関数です｡

21
00:01:39,410 --> 00:01:44,090
‫実行ピンを持たず､ 青色でもない､ 前方アクティブベクターの取得なども関数で､

22
00:01:44,090 --> 00:01:52,370
‫左上の小さな f 記号は関数の略です｡

23
00:01:52,370 --> 00:01:56,150
‫関数も自分たちで作れますし､ 本当に簡単です｡

24
00:01:56,150 --> 00:01:57,050
‫Blueprintでは｡

25
00:01:57,050 --> 00:02:02,630
‫これにより､ コードのブロックを再利用することができます｡

26
00:02:02,630 --> 00:02:06,500
‫コメントだとコピー＆ペーストしなければならないので､ コメントよりいいわけです｡

27
00:02:06,500 --> 00:02:12,620
‫一方､ 関数は､ 1つのコードのブロックを複数の使用場所で共有することができます｡

28
00:02:12,620 --> 00:02:19,280
‫では､ このようなものをどのようにコードのブロックにするのか見てみましょう｡

29
00:02:19,610 --> 00:02:24,620
‫まあ､ コメントブロックは削除すればいいんですよ､ まず､ その必要はないと思うので｡

30
00:02:24,620 --> 00:02:31,340
‫代わりに､ get playerからadd impulseまでのすべてのノードを選択し､ 右クリックしてcollapse

31
00:02:31,340 --> 00:02:35,180
‫to functionを選択します｡

32
00:02:35,360 --> 00:02:42,920
‫そして､ 新しいブロックを作成し､ 以前あったノードをすべて置き換えるのです｡

33
00:02:42,920 --> 00:02:46,520
‫では､ この関数に名前を付けます｡ 左側のペインに表示されているのがそれです｡

34
00:02:46,520 --> 00:02:53,870
‫ブループリント・ペインの関数セクションに新しい関数が作成され､

35
00:02:53,870 --> 00:03:02,120
‫自動的に名前が変更されるように選択されています｡

36
00:03:02,120 --> 00:03:09,530
‫そして､ コードというのは基本的にコミュニケーションがすべてですから､ プログラムにおいて良いネーミングは絶対に欠かせません｡

37
00:03:09,530 --> 00:03:14,750
‫自分たちが書いたものを理解できるように､ 自分たちとのコミュニケーションを図っているのです｡

38
00:03:14,750 --> 00:03:17,210
‫これからの自分たちとのコミュニケーションを考えているのです｡

39
00:03:17,210 --> 00:03:21,050
‫このプロジェクトに戻ったとき､ なぜそのように書いたのか､ 忘れてしまっていることがあります｡

40
00:03:21,050 --> 00:03:25,310
‫また､ チームで仕事をする場合､ 他のメンバーともコミュニケーションを取ろうとしますよね｡

41
00:03:25,340 --> 00:03:31,130
‫コードの品質を測る良い指標は､ 1分あたりの何という数字かという説があります｡

42
00:03:31,130 --> 00:03:36,500
‫もしあなたがコードを読んでいて､ 1分間に50回も「なんだこりゃ」と思うのなら､ それはかなり悪いコードです｡ もしあなたがコードを読んでいて､

43
00:03:36,500 --> 00:03:44,930
‫1分間に1回か2回「なんだこりゃ」と思うだけなら､ それはおそらくかなり良いコードで､ あなたは常にある程度ヘックスを取得しようとしているのです｡

44
00:03:44,930 --> 00:03:49,220
‫だから､ その数を減らすために､ 機能を絞っているんです｡

45
00:03:49,220 --> 00:03:51,650
‫重要なのは､ 私たちは機能を動詞で呼ぶ傾向があることです｡

46
00:03:51,650 --> 00:03:59,270
‫このルールには後ほど説明する例外がありますが､ たいていの場合､ 関数は何かをするものです｡

47
00:03:59,270 --> 00:04:06,230
‫もし､ この機能をどう名付けるか迷ったら､ チームで仕事をしているのであれば､ 他の誰かに相談して､

48
00:04:06,230 --> 00:04:14,060
‫どんな名前がいいと思うか､ どんなことが納得できるかを聞けばいいわけです｡

49
00:04:14,060 --> 00:04:19,760
‫問題に染まってしまって､ どう話せばいいのか思いつかないということはよくありますよね｡

50
00:04:19,760 --> 00:04:27,170
‫では､ この弾丸を発射する関数を作ったとき､ 私のコードはどこに行ってしまったのでしょうか？

51
00:04:27,320 --> 00:04:34,610
‫さて､ この関数が実際にどのように実装されているのか､ その詳細に戻るには､ イベントグラフでそれをダブルクリックするか､ My Blueprintsタブでそれをクリックするか､

52
00:04:34,610 --> 00:04:41,840
‫My Blueprintsタブでそれをダブルクリックするか､ いずれかの方法で行います｡

53
00:04:41,840 --> 00:04:48,950
‫イベントグラフ・タブに戻ることもできますし､ 「Spawn projectile」タブに飛び込んで､

54
00:04:48,950 --> 00:04:57,980
‫この関数だけを表示させることもできます｡

55
00:04:58,610 --> 00:05:05,480
‫そして､ ここに新しいノードがあるのがわかります｡ この小さな紫色のノードが､ この関数へのエントリポイントです｡

56
00:05:05,480 --> 00:05:09,800
‫これは､ 機能が始まったらこうしようというものです｡

57
00:05:09,800 --> 00:05:11,180
‫あくまで入り口です｡

58
00:05:11,180 --> 00:05:17,690
‫この関数が呼ばれるたびに､ そのノードがトリガーとなり､ 関数内の残りのすべてのノードがトリガーされます｡

59
00:05:17,690 --> 00:05:19,820
‫そこで､ イベントグラフに戻ると

60
00:05:19,960 --> 00:05:23,190
‫ズームアウトして､ ノードを少し寄せるとか｡

61
00:05:23,200 --> 00:05:26,850
‫これで､ ノードグラフがとても小さくなり､ 見やすくなりました｡

62
00:05:26,860 --> 00:05:33,760
‫機能を抜いたり､ モノを入れ替えたりする候補は､ ここにも2つほどあると思います｡

63
00:05:33,940 --> 00:05:38,380
‫そのひとつが､ 弾薬をプリントアウトしているところでしょう｡

64
00:05:38,380 --> 00:05:43,780
‫ですから､ この場合､ 弾薬の印刷は2箇所で行うものです｡

65
00:05:43,780 --> 00:05:47,800
‫ビギンプレイでもそうだし､ スポーンプロジェクタイルでもそうだ｡

66
00:05:48,190 --> 00:06:01,200
‫もうひとつは､ 弾薬を減らしていくような機能で､ これは弾薬の減少を表す関数に置き換えることができます｡

67
00:06:01,210 --> 00:06:09,640
‫そこで､ 課題を出す直前に､ 問題が複雑になりそうなので､ spawn projectileの後にあるconversionノードとprint

68
00:06:09,640 --> 00:06:15,280
‫stringノードを削除しておきたいと思います｡

69
00:06:15,280 --> 00:06:21,370
‫上の機能をコピーして､ 2つとも全く同じに見えるようにしたいのですが｡

70
00:06:21,370 --> 00:06:29,200
‫Begin Playから3つのノードをコピーして下にペーストし､ 実行ピンを接続すると､

71
00:06:29,200 --> 00:06:39,970
‫まったく同じノードセットと同じ機能が2つの間に存在し､ これを関数に抽出する際に混乱がないことがわかります｡

72
00:06:39,970 --> 00:06:43,240
‫そこで､ もう少し機能を増やすことにチャレンジしてみたいと思います｡

73
00:06:43,240 --> 00:06:47,140
‫最初にやっておいた方がいいのは､ 減少弾薬です｡

74
00:06:47,140 --> 00:06:52,720
‫つまり､ 弾薬の減少に関わる3つのノードを取り出し､ それを関数に抽出して名前をつけているのです｡

75
00:06:52,960 --> 00:06:56,020
‫そして､ 2つ目はプリント用弾薬です｡

76
00:06:56,020 --> 00:07:05,740
‫そこで､ 弾薬の取得､ 変換､ 印刷の機能を1つの関数に抜き出すことになるわけです｡

77
00:07:05,740 --> 00:07:11,500
‫また､ 弾薬を印刷するサイトが2つあるので､ そのうちの1つを削除して､

78
00:07:11,500 --> 00:07:17,020
‫代わりに関数を持ってきた方がいいかもしれません｡

79
00:07:17,260 --> 00:07:22,750
‫そして最後に､ いくつかのウェルカムメッセージ､ ウェルカムメッセージノードの出力があります｡

80
00:07:22,750 --> 00:07:24,820
‫それをプリントに抽出することができます｡

81
00:07:24,820 --> 00:07:27,070
‫ウェルカムメッセージの機能もあります｡

82
00:07:27,100 --> 00:07:29,170
‫ビデオを一時停止して､ 試してみてください｡

83
00:07:32,230 --> 00:07:32,740
‫なるほど｡

84
00:07:32,740 --> 00:07:33,570
‫お帰りなさい｡

85
00:07:33,580 --> 00:07:37,450
‫そこで､ まず減少弾を抽出することにします｡

86
00:07:37,450 --> 00:07:39,640
‫そこには3つのノードが関係しているわけです｡

87
00:07:39,640 --> 00:07:47,740
‫この関数を右クリックして､ 「Decrease Ammo（弾薬の減少）」と名付けます｡

88
00:07:47,740 --> 00:07:51,940
‫つまり､ 弾薬を発射し､ 弾薬を減らし､ そして弾薬をプリントしているのです｡

89
00:07:51,940 --> 00:07:58,210
‫そこで､ 3つのノード､ get convertとprint stringを取り､ 右クリックでcollapse to functionして､

90
00:07:58,210 --> 00:08:02,020
‫この1つのprint ammoを呼び出すことにしましょう｡

91
00:08:02,470 --> 00:08:08,590
‫この機能は2箇所で繰り返されているので､ begin playでこの機能を実行している箇所を削除し､

92
00:08:08,590 --> 00:08:19,840
‫関数リストからprint ammoをドラッグして実行ピンを接続し､ print stringの後に実行されるようにします｡

93
00:08:20,200 --> 00:08:25,630
‫そこで､ 最後に作りたいのが､ print welcome messagesと名付けた関数です｡

94
00:08:25,630 --> 00:08:32,050
‫そこで､ print strings after being in play collapse to functionを選択し､ print welcome

95
00:08:32,050 --> 00:08:34,390
‫messagesと呼ぶことにします｡

96
00:08:34,390 --> 00:08:43,200
‫このノードで､ すべてのノードを並べ替えると､ 1つの画面いっぱいに表示されたすべての内容をはるかに読みやすくすることができます｡

97
00:08:43,210 --> 00:08:49,960
‫ゲームの機能が1つの画面に収まり､ 同じような抽象度と理解度でうまくまとめられているため､

98
00:08:49,960 --> 00:08:56,380
‫より理解しやすくなっているのがおわかりいただけると思います｡

99
00:08:56,380 --> 00:09:04,900
‫そしてこれは､ 何をするのかを説明するためのコメントや文書を必要としないコードであるため､ セルフ・ドキュメント・コードと呼ばれるものである｡

100
00:09:04,900 --> 00:09:07,150
‫ただ､ 英語のように読めます｡

101
00:09:07,270 --> 00:09:08,110
‫素晴らしい内容です｡

102
00:09:08,110 --> 00:09:10,120
‫それでは､ 次回の講義でお会いしましょう｡

