﻿1
00:00:04,400 --> 00:00:05,720
‫こんにちは､ ようこそ｡

2
00:00:05,720 --> 00:00:11,870
‫この講義では､ C++のベクトルや一般的により複雑な構造体について､

3
00:00:11,870 --> 00:00:19,810
‫また､ 構造体の設定と取得の両方に個々のパーツにアクセスする方法について見ていきます｡

4
00:00:19,820 --> 00:00:20,720
‫潜入してみよう｡

5
00:00:21,260 --> 00:00:29,870
‫そこで､ C++で基本的なデータ型を扱い､ 変数を作成して代入し､ さらにそれを使って基本的な算術を行う方法を学びました｡

6
00:00:29,870 --> 00:00:35,570
‫しかし､ ベクトルや変換など､ より複雑な型を扱いたい場合はどうでしょうか｡

7
00:00:35,840 --> 00:00:38,090
‫まあ､ 実はプロセスはよく似ているんですけどね｡

8
00:00:38,090 --> 00:00:41,630
‫まずは､ すでにあるテストコードを片付けることから始めましょう｡

9
00:00:41,630 --> 00:00:43,580
‫プロパティをすべて削除する

10
00:00:43,580 --> 00:00:46,700
‫私の場合､ 26行目から51行目までですね｡

11
00:00:46,940 --> 00:00:56,900
‫さらに､ C++ファイルに移動して､ 19行目から23行目までを削除します｡ ここでは､ 先ほど削除した変数を使ってすべての作業を行っています｡

12
00:00:56,900 --> 00:01:01,760
‫そのため､ Begin Playは完全に空っぽになり､ 実質的に振り出しに戻りました｡

13
00:01:02,570 --> 00:01:06,350
‫そこで､ 今度は新しいyouプロパティを追加してみたいと思います｡

14
00:01:06,350 --> 00:01:22,190
‫大文字のF､ 小文字のVに注目してください｡ これがBlueprintで扱ったベクターの扱い方です｡

15
00:01:22,190 --> 00:01:27,470
‫水面下では同じベクトルなのですが､ C++ではこのようにタイプします｡

16
00:01:27,470 --> 00:01:33,710
‫その前にあるFは､ ムービングプラットフォームを進めるAからそれがアクターであることがわかるのと同じように､

17
00:01:33,710 --> 00:01:37,010
‫これが構造体であることを知らせるだけです｡

18
00:01:37,010 --> 00:01:38,390
‫それはC++のことではありません｡

19
00:01:38,390 --> 00:01:44,240
‫それは､ 異なるクラス､ 構造体､ 型を名付けるための非現実的な命名規則である｡

20
00:01:44,630 --> 00:01:51,080
‫そして､ この変数に名前をつけて､ floatやintと全く同じように動作させるのです｡

21
00:01:51,080 --> 00:01:53,600
‫例えば､ 私の浮き輪と呼ぶこともできます｡

22
00:01:53,600 --> 00:01:55,010
‫スペースがないことが必要です｡

23
00:01:55,160 --> 00:01:59,120
‫そして､ ここで行末にセミコロンをつけるとしたら､ それで終わりです｡

24
00:01:59,120 --> 00:02:07,100
‫新しい変数を宣言して､ エディターの詳細ペインに表示されるようにしましたが､ それだけでは十分ではありません｡

25
00:02:07,100 --> 00:02:14,030
‫実際にこれにデフォルトの000とは異なる値を与えてみたいと思います｡

26
00:02:14,150 --> 00:02:17,690
‫そのためには､ 用語集を新しい用語で更新する必要があります｡

27
00:02:17,690 --> 00:02:25,070
‫コンストラクタは､ 基本的にC++で新しい構造体やクラスの値を作成するものです｡

28
00:02:25,160 --> 00:02:34,700
‫ベクターのコンストラクタを作成する場合､ 値を代入したいので､ equalsを実行します｡

29
00:02:34,700 --> 00:02:41,330
‫そして､ 通常､ 整数や浮動小数点数を扱うときは､ 1やtrueのようなものを使えばよいのです｡

30
00:02:41,330 --> 00:02:46,280
‫それらの基本型の値を設定するための値が組み込まれていたのです｡

31
00:02:46,280 --> 00:02:56,240
‫しかし､ 構造体のような凝った型があると､ コンストラクタを使う必要があり､ コンストラクタは常にデータ型と同じ名前になります｡

32
00:02:56,240 --> 00:03:05,930
‫つまり､ fベクトルと全く同じ綴りで､ 括弧をいくつか開けて､ その括弧の中に好きな値を入れていくのです｡

33
00:03:05,930 --> 00:03:08,600
‫つまり､ X､ Y､ Zがベクトルを構成するものです｡

34
00:03:08,600 --> 00:03:17,000
‫つまり､ 1､ 2､ 3はすべてカンマで区切り､ 括弧を閉じて行末にセミコロンをつけるのです｡

35
00:03:17,000 --> 00:03:23,480
‫そして､ このベクトルのX､ Y､ Zのデフォルト値が1､ 2､ 3になります｡

36
00:03:23,480 --> 00:03:24,590
‫試してみよう｡

37
00:03:24,740 --> 00:03:27,470
‫Unrealに戻り､ コンパイルボタンを押します｡

38
00:03:27,560 --> 00:03:34,550
‫そして､ 正常に完了したら､ 異常値で移動プラットフォームアクターが選択されていることを確認し､ 詳細ペインを見て､

39
00:03:34,550 --> 00:03:40,730
‫実際にMy Floatという新しいプロパティがあることを確認できます｡

40
00:03:40,730 --> 00:03:47,510
‫他のものは取り去られ､ その異なる位置X､ Y､ Zでの値は1､ 2､ 3となり､

41
00:03:47,510 --> 00:03:49,700
‫期待通りである｡

42
00:03:50,090 --> 00:03:51,170
‫だからすごいんです｡

43
00:03:51,170 --> 00:03:57,680
‫しかし､ これらの値を取得して､ 別のプロパティに貼り付けたいとしたらどうでしょうか｡

44
00:03:57,680 --> 00:04:04,250
‫インスペクタで確認できるように､ どこでも編集可能とマークされた別のプロパティ､

45
00:04:04,550 --> 00:04:13,160
‫my x という float 型を用意します｡

46
00:04:13,640 --> 00:04:22,370
‫そして､ begin playでmy floatからxの値を取得し､ それをmy x変数に設定したいのです｡

47
00:04:22,460 --> 00:04:29,450
‫C++ファイルに移動して､ begin playのsuper big in playという行の後に､

48
00:04:30,020 --> 00:04:38,600
‫私のxを私のベクトルから何かを得たいが､ 私のベクトル全体は得たくないものに等しく設定することにしましょう｡

49
00:04:38,600 --> 00:04:39,860
‫それはエラーになります｡

50
00:04:39,860 --> 00:04:44,780
‫ベクトルをfloatに設定することはできないので､ そのベクトルのx部分が欲しいだけです｡

51
00:04:44,930 --> 00:04:48,740
‫さて､ それを理解するためには､ 演算子の概念を理解する必要があります｡

52
00:04:48,770 --> 00:04:53,090
‫演算子とは､ C++で何かをするための記号のことです｡

53
00:04:53,090 --> 00:04:54,590
‫すでにいくつか見てきました｡

54
00:04:54,590 --> 00:04:57,950
‫これまで､ 2つのものを足すプラス演算子を見てきました｡

55
00:04:57,950 --> 00:04:59,510
‫マイナス演算子もある｡

56
00:04:59,510 --> 00:05:03,770
‫等号演算子､ イコール演算子があり､ これは代入する｡

57
00:05:03,980 --> 00:05:04,310
‫ものです｡

58
00:05:04,310 --> 00:05:06,740
‫そこで､ この19行目で使っているのが､ これです｡

59
00:05:06,740 --> 00:05:12,020
‫それは､ 私のベクトルの値を私のXに代入している演算子です｡

60
00:05:12,230 --> 00:05:18,850
‫そして､ もうひとつ､ DOTオペレータを知る必要があります｡

61
00:05:18,860 --> 00:05:23,360
‫構造体やクラスの中から何かを取得する演算子です｡

62
00:05:23,360 --> 00:05:27,260
‫そこで､ 私のベクトルの中からXを取得したいと思います｡

63
00:05:27,260 --> 00:05:34,040
‫そこで､ ドット演算子を使って､ xをドットで表現します｡ ここでは､ myベクトルとxの間にスペースを入れません｡

64
00:05:34,040 --> 00:05:42,200
‫空白を入れるのは必ずしもエラーではないのですが､ 私たちは通常､ このような方法で空白を残しています｡

65
00:05:42,200 --> 00:05:51,560
‫つまり､ 私のベクトル x はベクトルの x 値を取得して､ 私の x 浮動小数点に入れる必要があります｡

66
00:05:51,560 --> 00:05:57,500
‫そこで行末にセミコロンを付け､ いつものように赤いスクイッグは無視しています｡ 更新に時間がかかったり､

67
00:05:57,500 --> 00:06:00,530
‫正しく表示されないことがあるからです｡

68
00:06:00,650 --> 00:06:08,630
‫そして､ ライブコーディングに入り､ 再コンパイルするボタンを押し､ 成功するかどうかだけ確認するのです｡

69
00:06:08,630 --> 00:06:11,120
‫そして､ いや､ ほら､ ビルドに失敗したんだ｡

70
00:06:11,120 --> 00:06:17,390
‫そしてエラーを見ると､ 私のvectorは宣言されていない識別子で､ タイプミスをしたためだと言っているのです｡

71
00:06:17,390 --> 00:06:26,180
‫Fベクターをマイフロートと呼んでしまったので､ 画面に向かって悲鳴を上げていることでしょうが､ 経験豊富なプログラマーでも間違うことがあるということを示すには良いことだと思います｡

72
00:06:26,180 --> 00:06:30,890
‫それをマイベクターと呼びたかったので､ ヘッダーファイルに戻り､

73
00:06:30,890 --> 00:06:35,720
‫マイベクターに名前を変えて､ 脳内の問題を取り除くことにします｡

74
00:06:35,720 --> 00:06:38,900
‫それでは､ もう一度コンパイルボタンをクリックしてみましょう｡

75
00:06:38,900 --> 00:06:44,180
‫そしてそれは､ エラーを起こしたときにコンパイルエラーが発生する､ ということを味わっていただくためのものです｡

76
00:06:44,180 --> 00:06:45,280
‫よくあることなんです｡

77
00:06:45,300 --> 00:06:48,290
‫むしろ､ ミスをしないほうが珍しいくらいです｡

78
00:06:48,290 --> 00:06:56,300
‫最初に何かをしたら､ 次に再生ボタンを押して､ 詳細ペインでどのような値が得られるかを確認します｡

79
00:06:56,300 --> 00:07:05,990
‫ベクトル変数のx成分の値が1であったため､ xが1に設定されたことがわかります｡

80
00:07:06,080 --> 00:07:09,800
‫そこで､ ベクトル値の設定に挑戦してみたいと思います｡

81
00:07:09,830 --> 00:07:11,930
‫ベクトルから値を取得しています｡

82
00:07:11,930 --> 00:07:13,070
‫では､ 実際に設定してみましょう｡

83
00:07:13,070 --> 00:07:17,240
‫基本的にはドット演算子を使って値を設定してみてください｡

84
00:07:17,480 --> 00:07:27,050
‫そのイコールの両辺を反転させて､ 右側に私のX､ 左側に私のベクトルをオーバーさせるようにしてみてください｡

85
00:07:27,050 --> 00:07:30,500
‫また､ YやZに変更した場合はどうでしょうか？

86
00:07:30,530 --> 00:07:32,090
‫そこに違いはあるのでしょうか？

87
00:07:32,120 --> 00:07:33,500
‫ビデオを一時停止して､ 試してみてください｡

88
00:07:36,830 --> 00:07:37,430
‫なるほど｡

89
00:07:37,430 --> 00:07:37,940
‫お帰りなさい｡

90
00:07:37,940 --> 00:07:40,640
‫そこで､ この2つを反転させてみることにします｡

91
00:07:40,640 --> 00:07:49,010
‫C++に移動して､ Begin Playで代わりに､ 私のベクトルdot yは私のxと等しいと言い､

92
00:07:49,010 --> 00:07:52,910
‫そして行の最後にセミコロンを入れましょう｡

93
00:07:52,910 --> 00:07:57,770
‫そして､ このように構造体の中にも値を設定することができるのです｡

94
00:07:57,770 --> 00:08:06,890
‫Unrealに戻り､ 再コンパイルして､ Xに値を設定しましょう｡

95
00:08:06,890 --> 00:08:08,960
‫だから､ ここに5という値を入れておく｡

96
00:08:10,010 --> 00:08:15,650
‫続いて､ 移動するプラットフォームの詳細ペインを再生して見てみます｡

97
00:08:15,650 --> 00:08:24,620
‫そして､ 確かに､ 私のベクトルのyの値は､ 私のxの値によってbegin playで更新されています｡

98
00:08:24,740 --> 00:08:26,060
‫だから､ おめでとうございます｡

99
00:08:26,060 --> 00:08:33,080
‫C++の構造体のような複合型である､ より複雑な型の使い方をみてきました｡

100
00:08:33,080 --> 00:08:34,910
‫それでは､ 次回の講義でお会いしましょう｡

