﻿1
00:00:04,350 --> 00:00:05,520
‫こんにちは､ ようこそ｡

2
00:00:05,520 --> 00:00:12,630
‫この講義では､ 独自のクラスメンバー関数､ 移動プラットフォームと回転プラットフォームを実装する予定です｡

3
00:00:12,630 --> 00:00:17,190
‫議論を取り入れるために､ どのような設定をすればよいかを考えています｡

4
00:00:17,190 --> 00:00:21,030
‫そして､ コードの整理整頓にも少し役立ってくれそうです｡

5
00:00:21,030 --> 00:00:23,370
‫さっそく､ この仕組みを見てみましょう｡

6
00:00:24,060 --> 00:00:29,550
‫だから今までは､ すでに作成されているC++の関数を使っていたんです｡

7
00:00:29,550 --> 00:00:34,740
‫我々は､ 彼らの機能を書くという点で､ 大きなインプレイを使用してTIC Vを使用してきました｡

8
00:00:34,740 --> 00:00:38,130
‫そして､ 他の人が書いてくれた関数も使っています｡

9
00:00:38,130 --> 00:00:41,070
‫ゲットアクティブロケーション､ ゲットネームといった呼び方をしています｡

10
00:00:41,280 --> 00:00:51,900
‫さて､ コードを整理し､ これらの関数を小さくして､ すべてをずっと見やすくするために､ 新しい独自の関数を作るにはどうしたらいいでしょうか｡

11
00:00:52,320 --> 00:00:57,990
‫さて､ セクションの終盤に差し掛かったところで､ 基本的な構成要素はすでにできています｡

12
00:00:57,990 --> 00:01:00,330
‫C++の構文について､ より多くのことを理解することができました｡

13
00:01:00,330 --> 00:01:08,400
‫そこで､ 移動するプラットフォーム上に新しい関数を作成し､ 移動するプラットフォームを呼び出すと言う､

14
00:01:08,490 --> 00:01:12,600
‫単なる取り込みを可能にしたいと思います｡

15
00:01:12,870 --> 00:01:14,220
‫なぜ､ そんなことをしたいのだろう？

16
00:01:14,220 --> 00:01:22,590
‫MOVE Platformというこのような関数呼び出しができることは､ 私たちが今やろうとしていることを如実に物語っていますからね｡

17
00:01:22,590 --> 00:01:28,440
‫もし私が技術部門に入り､ 「Move platform」と書かれた機能を目にしたなら､

18
00:01:28,440 --> 00:01:34,500
‫これらのものが何をすべきなのか､ 突然コンテキストを理解することができ､

19
00:01:34,590 --> 00:01:42,480
‫何が起こっているのかを教えてくれるコメントは1つも必要ありません｡

20
00:01:42,480 --> 00:01:48,240
‫さらに､ プラットフォームを回転させることができるようになれば､ さらに便利になります｡

21
00:01:48,810 --> 00:01:52,740
‫では､ どのように関数を定義するのでしょうか｡

22
00:01:52,740 --> 00:01:56,670
‫まあ､ 宣言の面はヘッダーファイルでやり過ごすとして｡

23
00:01:56,670 --> 00:02:03,270
‫そこで､ 基本的にC++に対して､ 次のような関数を用意するように言っているのです｡

24
00:02:03,300 --> 00:02:06,930
‫そして､ C++で実際に関数を定義しているところです｡

25
00:02:06,930 --> 00:02:09,900
‫私たちはそれにボディを与え､ C++に正確に指示するのです｡

26
00:02:09,900 --> 00:02:12,660
‫このような機能です｡

27
00:02:13,140 --> 00:02:16,320
‫そして､ その方法について見てみましょう｡

28
00:02:16,320 --> 00:02:20,070
‫機能の例をいくつか紹介しましたが､ 遊びの中で大きくなったんです｡

29
00:02:20,070 --> 00:02:29,040
‫これは､ ヘッダーファイルのさまざまなセクションを見るのによいタイミングです｡

30
00:02:29,040 --> 00:02:35,190
‫ここでパブリックとプロテクトの話が出たり､ またパブリックの話が出たりしています｡

31
00:02:35,370 --> 00:02:36,510
‫さて､ これはどういうことでしょうか｡

32
00:02:36,510 --> 00:02:43,410
‫これらのキーワードと末尾のコロンが､ 基本的にアクセシビリティのセクションを定義しています｡

33
00:02:43,410 --> 00:02:46,470
‫これらの機能､ どこからアクセスできるのでしょうか？

34
00:02:46,650 --> 00:02:51,390
‫ゲットセーフ・ノーマルで確認済みです｡

35
00:02:51,390 --> 00:02:59,880
‫これはFベクター上で呼び出している関数ですが､ Fベクターの中からではなく､ 別のクラスから呼び出しています｡

36
00:03:00,150 --> 00:03:05,070
‫つまり､ この関数のアクセシビリティは公開する必要があるということです｡

37
00:03:05,070 --> 00:03:09,900
‫ここで､ 少し複雑になるので､ プロテクトは一旦置いておくことにします｡

38
00:03:09,900 --> 00:03:14,400
‫しかし､ もう一つのタイプのキーワードとして､ プライベートというものがあります｡

39
00:03:14,700 --> 00:03:19,410
‫そこで､ tickの後に､ プライベートキーの単語を追加します｡

40
00:03:19,410 --> 00:03:24,360
‫これらのセクションをインデントしていないことと､ 最後にコードを付けることに注意してください｡

41
00:03:24,360 --> 00:03:31,710
‫そして､ その後に続く次のセクションまで､ ここに入れた次のキーワードはすべてプライベートなものになるということです｡

42
00:03:31,710 --> 00:03:38,310
‫つまり､ これらの変数をすべて取り出して､ 他のクラスがこれらに触れることを許さないということです｡

43
00:03:38,310 --> 00:03:40,380
‫そして､ それは通常､ ベストプラクティスです｡

44
00:03:40,380 --> 00:03:44,640
‫ここまでやっていないのは､ ちょっとわかりにくくなってはいけないと思ったからです｡

45
00:03:44,640 --> 00:03:49,350
‫しかし､ 授業中の変数は､ 一般的に自分たちの仕事であるべきです｡

46
00:03:49,350 --> 00:03:55,980
‫オブジェクト指向プログラミングの基本的な考え方として､ 変数の管理はクラスに任せ､ そのクラスがパブリックであることを示す関数だけを用いて変数にアクセスする､

47
00:03:55,980 --> 00:04:02,280
‫というものがあります｡

48
00:04:03,060 --> 00:04:08,070
‫Move Platformのようなものがクラスの外から呼び出されないように､

49
00:04:08,070 --> 00:04:12,300
‫ここにさらにプライベート関数を追加していきます｡

50
00:04:12,300 --> 00:04:16,590
‫自社のダニ機能で管理してほしい｡

51
00:04:16,860 --> 00:04:20,370
‫では､ どのようにプライベート関数を定義するのでしょうか｡

52
00:04:20,370 --> 00:04:22,680
‫まあ､ 非公開にしたんですけどね｡

53
00:04:22,680 --> 00:04:24,780
‫そこで､ 秘密鍵盤をここに設置しました｡

54
00:04:24,780 --> 00:04:31,470
‫しかし､ 変数の後に置くことにして､ まずは戻り値の型から始めます｡

55
00:04:31,470 --> 00:04:40,020
‫また､ 関数が何も返さない場合は､ voidと入力して､ この関数からは何も返ってこないことを示します｡

56
00:04:40,470 --> 00:04:42,570
‫そして､ それに関数名をつける｡

57
00:04:42,570 --> 00:04:51,180
‫そこで､ move platformが欲しいもので､ それにいくつかの括弧を付けて､ これが関数の開閉括弧であることを示し､

58
00:04:51,180 --> 00:04:57,330
‫セミコロンで行を終えて､ よし､ これでおしまいとしました｡

59
00:04:57,330 --> 00:05:03,180
‫これがヘッダーファイルで宣言したい関数と､ そのすべての働きです｡

60
00:05:03,260 --> 00:05:11,670
‫これは関数の形､ これは戻り値､ これは受け取るパラメータ､ そして名前とどのクラスに属するかが書かれています｡

61
00:05:11,690 --> 00:05:16,280
‫さて､ 実際に実装を行うには､ C++ファイルで定義する必要があります｡

62
00:05:16,280 --> 00:05:17,540
‫では､ そちらに行ってみましょう｡

63
00:05:17,780 --> 00:05:23,540
‫そして､ ファイルの最後､ 中括弧のすぐ外側にある､ この場所で行います｡

64
00:05:23,540 --> 00:05:25,670
‫再び戻り値の型から始めます｡

65
00:05:25,670 --> 00:05:32,750
‫C++のファイルの中なので､ クラスの中括弧の中ではないので､ これはvoidになるわけです｡

66
00:05:32,750 --> 00:05:42,590
‫スコープ解決演算子を使って､ 移動するプラットフォームクラスの中から関数を定義しようとしていることを示す必要があるのだ｡

67
00:05:42,590 --> 00:05:50,630
‫そこで､ アクターであることを示す接頭辞があることを思い出しながら､ クラスの名前である動くプラットフォームを入力します｡

68
00:05:51,320 --> 00:05:55,970
‫次にコロン､ コロン､ スコープ解決演算子､ そして定義している関数名､

69
00:05:55,970 --> 00:06:03,440
‫MOVE platform､ そしてヘッダーファイルで行ったのと同じパラメータセットを使っています｡

70
00:06:03,440 --> 00:06:07,970
‫今回は､ パラメータが空だったので､ 括弧だけにしています｡

71
00:06:08,300 --> 00:06:18,830
‫そして､ この行の最後にセミコロンをつけて改行する代わりに､ 開始中括弧とそれに対応する終了中括弧をつけています｡

72
00:06:18,950 --> 00:06:24,860
‫そして､ この中括弧の間には､ 関数のコードを入れます｡

73
00:06:24,860 --> 00:06:29,750
‫そこで､ 私が今やりたいことは､ ここにあるすべての機能､ そして実際､ コメントはもう必要ないので削除します､

74
00:06:29,750 --> 00:06:32,330
‫と言ってみることです｡

75
00:06:32,330 --> 00:06:38,150
‫これを実装するための擬似コードだったのですが､ 今はもうその目的を果たしたようなものです｡

76
00:06:38,150 --> 00:06:40,400
‫私たちは､ コードの行が何をしているのかを理解しています｡

77
00:06:40,520 --> 00:06:51,590
‫TTICからMOVEプラットフォーム機能以外を取り出し､ コピーして､ 代わりにうちのMOVEプラットフォーム機能に貼り付けます｡

78
00:06:52,040 --> 00:06:59,540
‫ティックに入ると､ ムーブプラットフォームを呼び出し､ 同じコードが実行されるだけなので､ ほとんど同じように動作するはずです｡

79
00:06:59,540 --> 00:07:06,950
‫ただし､ 今は関数にバンドルされているので､ 読みやすく､ 将来的に再利用できる可能性もあります｡

80
00:07:07,160 --> 00:07:11,390
‫しかし､ これをやると､ 問題があることに気づきます｡

81
00:07:11,900 --> 00:07:21,110
‫デルタ時間にアクセスしていますが､ これはtickに渡されたパラメータなので､ もはやアクセスすることはできません｡

82
00:07:21,440 --> 00:07:29,930
‫そのため､ これを取得するためには､ 関数にパラメータを指定する必要があります｡

83
00:07:29,930 --> 00:07:33,020
‫そのため､ パラメータを定義する際には､ 2箇所で行う必要があります｡

84
00:07:33,020 --> 00:07:40,190
‫関数を定義したときと同じように､ ヘッダーファイルに戻って､ MOVEプラットフォーム関数の括弧の間に移動します｡

85
00:07:40,190 --> 00:07:45,770
‫ここで､ どのようなパラメータが欲しいかを言うのだが､ これはまさに変数の定義と同じである｡

86
00:07:45,770 --> 00:07:48,110
‫型と名前をつける必要があります｡

87
00:07:48,110 --> 00:07:53,000
‫そこで､ float型とし､ Delta Timeと呼ぶことにします｡

88
00:07:53,000 --> 00:07:54,320
‫同姓同名である必要はない｡

89
00:07:54,320 --> 00:07:56,870
‫Dと呼ぶこともできる｡  T. それを「時間」と呼ぶこともできます｡

90
00:07:56,870 --> 00:08:03,500
‫しかし､ 同じ名前をつけると､ 誰が読んでもここに何を通すべきかが一目瞭然になるので､

91
00:08:03,500 --> 00:08:04,460
‫簡単です｡

92
00:08:04,460 --> 00:08:09,590
‫そして､ C++ファイルの中で､ パラメータのリストを照合する必要があります｡

93
00:08:09,590 --> 00:08:13,790
‫ですから､ 繰り返しになりますが､ コピー＆ペーストでも､ 入力でもいいんです｡

94
00:08:13,790 --> 00:08:18,350
‫タイプアウトすると､ コンパイラが文句を言うので､ タイプミスをしないように注意してください｡

95
00:08:18,350 --> 00:08:24,740
‫そこで､ Delta Timeというfloatをパラメータとして渡すか､ move platformのパラメータとして定義することになりますが､

96
00:08:24,740 --> 00:08:30,800
‫実際にはmove platform in tickの引数として渡していないのです｡

97
00:08:30,800 --> 00:08:33,800
‫そして､ ここに小さな赤い四角い線があるのがおわかりになると思います｡

98
00:08:33,800 --> 00:08:39,860
‫ヘッダーファイルで定義し､ C++でも定義して､ float型のパラメータを1つ要求しているため､

99
00:08:39,860 --> 00:08:46,400
‫この関数呼び出しでは引数が少なすぎると表示されます｡

100
00:08:46,670 --> 00:08:48,770
‫だから､ そのパラメータを提供しなければならない｡

101
00:08:48,770 --> 00:08:58,760
‫そこで､ 私が提供するパラメータ､ 私が提供する値は､ tickのデルタ時間変数またはデルタ時間パラメータから来ることを確認するつもりです｡

102
00:08:58,940 --> 00:09:03,950
‫つまり､ 値をスレッド化することで､ 値はtickに渡され､ MOVEプラットフォームに渡され､

103
00:09:03,950 --> 00:09:12,830
‫最終的にMOVEプラットフォーム関数のパラメータになり､ MOVEプラットフォーム機能を実行するために使用されるのです｡

104
00:09:12,830 --> 00:09:18,950
‫そこで､ TICから呼び出す回転台関数を自作してほしいんだ｡

105
00:09:18,950 --> 00:09:23,720
‫つまり､ MOVEプラットフォーム関数でやったように､ ヘッダーファイルに追加するわけです｡

106
00:09:23,720 --> 00:09:26,390
‫C++ファイルにも同じように追加していきます｡

107
00:09:26,390 --> 00:09:34,190
‫そこで､ これらの関数で行った方法をヒントにして､ tick関数から呼び出すようにします｡

108
00:09:34,190 --> 00:09:40,250
‫Delta timeを渡すことを確認し､ Delta timeを渡すためのパラメータを定義し､ Rotateプラットフォームの本体を実装して､

109
00:09:40,460 --> 00:09:45,980
‫メッセージをログアウトするようにします｡

110
00:09:45,980 --> 00:09:51,410
‫まだ実際にプラットフォームを回転させるわけではありませんが､ 実際に呼び出されることを確認するためのプレースホルダとして､

111
00:09:51,410 --> 00:09:56,360
‫学習したUIログを使用してログメッセージを出力します｡

112
00:09:56,360 --> 00:09:58,430
‫ビデオを一時停止して､ 試してみてください｡

113
00:10:01,720 --> 00:10:02,110
‫なるほど｡

114
00:10:02,110 --> 00:10:02,900
‫お帰りなさい｡

115
00:10:02,920 --> 00:10:10,030
‫まず､ ヘッダーファイルから始め､ MOVEプラットフォームで行ったのと同じことを行います｡

116
00:10:10,030 --> 00:10:14,590
‫クラス内でしかアクセスできないように､ プライベートセクションに配置することにします｡

117
00:10:14,910 --> 00:10:19,900
‫戻り値の型をvoidにして､ rotate platformと呼ぶことにする｡

118
00:10:19,900 --> 00:10:21,460
‫パラメータリストを開いてみます｡

119
00:10:21,460 --> 00:10:24,550
‫そしてその中に､ float型のパラメータを1つ入れることにします｡

120
00:10:24,580 --> 00:10:30,940
‫Delta timeと呼んでパラメータを閉じ､ セミコロンで終了させることにします｡

121
00:10:31,150 --> 00:10:36,310
‫さて､ C++ファイルで行うことのほとんどは､ ヘッダーファイルの場合と全く同じです｡

122
00:10:36,310 --> 00:10:41,650
‫そこで､ 実際にこの行をコピーして､ C++ファイルに移動して､ 何が違うのかをお見せします｡

123
00:10:41,650 --> 00:10:50,470
‫そこで､ ファイルの末尾にある新しい空の行に､ このファイルを貼り付けます｡

124
00:10:50,470 --> 00:10:58,120
‫そこで､ 動くプラットフォーム､ コロン､ コロン回転のプラットフォームを用意します｡

125
00:10:58,210 --> 00:11:01,390
‫それから､ パラメータ・リストがあれば､ 最後のセミコロンは必要ありません｡

126
00:11:01,390 --> 00:11:08,140
‫そこで､ セミコロンを削除して改行し､ 代わりに中括弧を追加して､ その2つの中括弧の間に改行します｡

127
00:11:08,620 --> 00:11:12,070
‫ここでやりたいことは､ ログメッセージを出力することです｡

128
00:11:12,070 --> 00:11:15,190
‫そこで､ you log hit enterと入力する｡

129
00:11:15,490 --> 00:11:17,560
‫シンプルな表示メッセージになるだけです｡

130
00:11:17,560 --> 00:11:24,460
‫そして本文中には､ 私たちのプラットフォームの名前を入れるつもりです｡

131
00:11:24,460 --> 00:11:26,800
‫だから､ パーセンテージになるんです｡

132
00:11:26,800 --> 00:11:32,590
‫それから､ 回転するドットをタイプして､ 名前を渡すんだ｡

133
00:11:32,590 --> 00:11:37,660
‫変数に入れることもできますが､ ここではかなり短い行なので､ star､

134
00:11:37,660 --> 00:11:45,640
‫get nameと入力し､ 括弧を付けて､ 本質的にget nameを呼び出していることにします｡

135
00:11:45,640 --> 00:11:48,280
‫それが､ Fの文字列を手にする表現です｡

136
00:11:48,280 --> 00:11:53,620
‫そして､ その結果をログメッセージに入れるために変換しているのです｡

137
00:11:53,890 --> 00:12:01,390
‫ですから､ すべてのプラットフォームから､ 回転が印刷されることを期待しているのですが､ これは実際に技術で呼び出した場合のみです｡

138
00:12:01,390 --> 00:12:09,430
‫そこで､ MOVEプラットフォームが新しい行を追加し､ 回転プラットフォームを呼び出すことができる後にティック関数に上がってみましょう｡

139
00:12:09,670 --> 00:12:16,870
‫そして､ 括弧を開くと､ デルタ時間の引数を渡す必要があることを教えてくれるんだ｡

140
00:12:16,870 --> 00:12:21,490
‫つまり､ ここでも同じデルタ時間変数を内部から渡すだけです｡

141
00:12:21,490 --> 00:12:24,850
‫そして､ さっきも言ったように､ ここにある名前は同じである必要はないんです｡

142
00:12:24,850 --> 00:12:28,720
‫そのため､ このデルタタイムは､ ティック以内のデルタタイムと一致させる必要があります｡

143
00:12:28,990 --> 00:12:35,680
‫しかし､ 代わりにrotate platformのdateで変数を呼び出すこともできますし､ rotate platformのどこで使っても､

144
00:12:35,680 --> 00:12:41,470
‫パラメータの名前にdateを使う必要があり､ 引数は基本的に異なっていてもかまいません｡

145
00:12:41,470 --> 00:12:46,870
‫それでは､ ヘッダーファイルにいくつか変更を加えたので､ unrealに飛んでコンパイルを押してみましょう｡

146
00:12:46,870 --> 00:12:52,990
‫コンパイルが完了したら､ 再生ボタンを押して､

147
00:12:52,990 --> 00:12:57,820
‫出力ログを開いてみましょう｡

148
00:12:57,970 --> 00:13:04,030
‫そして､ 実際に回転している各プラットフォームに関するログメッセージが表示されていることがわかります｡

149
00:13:04,030 --> 00:13:08,890
‫つまり､ この関数は実質的にtickで呼び出されているように見えるのです｡

150
00:13:09,010 --> 00:13:09,640
‫素晴らしい内容です｡

151
00:13:09,640 --> 00:13:15,160
‫これで､ クラスのメンバである独自の関数を作成する方法を理解しました｡

152
00:13:15,190 --> 00:13:21,490
‫コードの再利用はもちろんのこと､ Blueprintと同じようにコードを整理するのにとても便利なツールです｡

153
00:13:21,820 --> 00:13:23,710
‫それでは､ 次回の講義でお会いしましょう｡

