﻿1
00:00:04,420 --> 00:00:05,260
‫こんにちは､ ようこそ｡

2
00:00:05,260 --> 00:00:12,400
‫この講義では､ 純粋なブループリント関数に相当するC++の概念関数について見ていきます｡

3
00:00:12,400 --> 00:00:20,200
‫このコンソーシアムキーワードとは何か､ どのように使うのか､ そして､ より安全なコードにするために､ どのように制限をかけるのかを見ていきます｡

4
00:00:20,200 --> 00:00:22,000
‫さっそく潜入してみましょう｡

5
00:00:22,850 --> 00:00:32,570
‫ブループリントの上から､ 純粋な機能を作ることができたので､ 実行ピンが不要になったということです｡

6
00:00:32,600 --> 00:00:38,840
‫さて､ C++では､ 関数を定数にするという､ ちょっと強いことができる｡

7
00:00:39,230 --> 00:00:41,540
‫さて､ 関数をconstにするというのはどういうことでしょうか｡

8
00:00:41,570 --> 00:00:51,950
‫これは､ その関数がクラスの状態を変更できないことを意味し､ 実際にコンパイラの規則によって強制されます｡

9
00:00:51,950 --> 00:00:54,500
‫では､ 例を挙げましょう｡

10
00:00:54,500 --> 00:01:01,220
‫この関数を呼び出してif文の中で使うと､ プラットフォームの位置が実際に変わったり､

11
00:01:01,220 --> 00:01:07,790
‫移動距離やプラットフォームの速度が更新されたりしたらおかしいので､

12
00:01:07,790 --> 00:01:16,460
‫それを忘れたら本当にエラーになります｡

13
00:01:16,640 --> 00:01:20,540
‫だから､ それに対して自分たちが正直でいるために､ 変換できるようにする｡

14
00:01:20,540 --> 00:01:28,610
‫そして､ その方法は､ 関数の括弧の後にcontactキーワードを入れることである｡

15
00:01:28,610 --> 00:01:30,920
‫ここにもスペースを空けることが多いです｡

16
00:01:31,220 --> 00:01:41,700
‫さて､ C++ファイルの関数と正しく一致させるために､ 実際にはconstキーワードもそこに置く必要があります｡

17
00:01:41,720 --> 00:01:46,730
‫さて､ 先ほども言ったように､ これでクラスを変更するようなことをするとエラーになります｡

18
00:01:46,730 --> 00:01:53,480
‫そのため､ 万が一プラットフォームが戻ってきたときに､ 移動距離などのクラス変数を変更しようとした場合｡

19
00:01:53,480 --> 00:01:57,050
‫移動距離を200にしてみようかな｡

20
00:01:57,320 --> 00:02:01,700
‫アンリアルに移動して､ コンパイルボタンを押すとどうなるか見てみましょう｡

21
00:02:01,700 --> 00:02:02,020
‫なるほど｡

22
00:02:02,030 --> 00:02:03,830
‫現在､ エラーが発生していることがわかります｡

23
00:02:03,830 --> 00:02:15,110
‫このエラーを見ると､ 定数ポインタを通してアクセスされているため､ 何かを変更することができないということが言われていることがわかります｡

24
00:02:15,110 --> 00:02:17,330
‫今はその言葉を気にしないでください｡

25
00:02:17,330 --> 00:02:22,490
‫ちょっと解釈が難しいですが､ 要はconstというキーワードがあって､ 何かを修正できないと言っているわけで､

26
00:02:22,490 --> 00:02:25,760
‫そこが肝心です｡

27
00:02:25,760 --> 00:02:31,820
‫また､ constであることが明記されていない関数を呼び出した場合も問題です｡

28
00:02:31,820 --> 00:02:39,410
‫そのため､ コスト関数であるget actor locationを呼び出すのは良いのですが､ ロケーションを取得するだけで､ 何も変わりません｡

29
00:02:39,410 --> 00:02:48,140
‫constとしてマークされていないset actor locationを呼ぶのはダメなので､ 有効ではありません｡

30
00:02:48,140 --> 00:02:50,270
‫クラスを改造している可能性があります｡

31
00:02:50,270 --> 00:02:55,760
‫つまり､ constとしてマークされていない関数は､ コスト関数内から呼び出すことができないのです｡

32
00:02:56,090 --> 00:02:58,730
‫そうすると､ 問題が出てくるのは目に見えています｡

33
00:02:58,730 --> 00:03:09,620
‫なぜなら､ should platform returnはconstであるが､ get distance movedはそのようにマークされていないからである｡

34
00:03:09,620 --> 00:03:16,280
‫ヘッダーとpファイルにconstキーワードを追加して､

35
00:03:16,280 --> 00:03:22,040
‫C++にクラスを変更してはいけないことを知らせ､

36
00:03:22,220 --> 00:03:26,120
‫コンパイルします｡

37
00:03:29,320 --> 00:03:29,770
‫なるほど｡

38
00:03:29,770 --> 00:03:30,420
‫お帰りなさい｡

39
00:03:30,430 --> 00:03:32,830
‫そこで､ まずヘッダーファイルの方に移動してみます｡

40
00:03:32,830 --> 00:03:38,530
‫そして､ 閉じ括弧の後に､ スペース概念を追加し､ C++ファイルに戻ることにします｡

41
00:03:38,530 --> 00:03:42,670
‫そして､ 距離を移動した括弧の後に､ スペースコンセプトを入れるのです｡

42
00:03:42,670 --> 00:03:47,680
‫これで､ get distance movedの下にあるスクイッグラインが少しづつ更新されていくはずです｡

43
00:03:47,680 --> 00:03:53,290
‫しかし､ Unreal でコンパイル ボタンを押すと､ コンパイラが私たちが行ったことを好むかどうか､

44
00:03:53,290 --> 00:03:55,780
‫究極の判断材料になります｡

45
00:03:55,780 --> 00:04:03,100
‫そして､ 今回はコンパイルに成功し､ コードが正しく更新されたことになります｡

46
00:04:03,100 --> 00:04:10,780
‫そして､ それは理にかなっています｡ なぜなら､ ゲットディスタンスムーブから呼び出されるものは､ コンセプトではなく､ 何かを変えようとしているわけではないからです｡

47
00:04:10,780 --> 00:04:18,250
‫また､ プラットフォームが返すべき関数を呼び出す場合は､ const関数だけを使用します｡ これは､

48
00:04:18,250 --> 00:04:26,230
‫私たちが知らないうちに関数が何かを変更することがないように､ コードの安全性を高めるための方法です｡

49
00:04:26,230 --> 00:04:30,790
‫では､ ちょっとしたエクササイズとして､ これまで使ってきた関数のうち､

50
00:04:30,790 --> 00:04:35,380
‫定数としてマークされているものとそうでないものを見てみましょう｡

51
00:04:35,410 --> 00:04:41,890
‫これは､ get actor locationなどの関数にカーソルを合わせるだけで､ 含まれるポップアップが､

52
00:04:41,890 --> 00:04:46,240
‫括弧の後にcontactがあるかないかを見ることができるのです｡

53
00:04:46,240 --> 00:04:53,050
‫get active locationにカーソルを合わせるとconstが表示され､ get nameにカーソルを合わせると､ これがconstであることが表示され､

54
00:04:53,050 --> 00:04:55,360
‫意味がわかります｡

55
00:04:55,360 --> 00:04:59,560
‫どちらもクラスの状態を変えてはいけないんです｡

56
00:04:59,770 --> 00:05:05,110
‫tickの上にカーソルを置くと､ これがconstとしてマークされていないことがわかります｡ これは理にかなっていて､

57
00:05:05,110 --> 00:05:11,350
‫Tickは通常､ ワールドでのクラスの位置やクラスの状態を更新するために使われます｡

58
00:05:11,500 --> 00:05:13,360
‫そして､ ベクターも手に入れました｡

59
00:05:13,360 --> 00:05:18,880
‫get safe, normal にカーソルを合わせると const と表示されます｡ これは get safe

60
00:05:18,880 --> 00:05:24,790
‫normal が実際には vector を変更せず､ 新しい vector を含む値を返すだけだからです｡

61
00:05:24,790 --> 00:05:25,510
‫というわけで､ これでおしまいです｡

62
00:05:25,510 --> 00:05:32,620
‫この講義では､ コードの安全性を高めるために､ 関数にconstを追加することについて学びました｡

63
00:05:32,620 --> 00:05:34,060
‫次回作でお会いしましょう｡

