﻿1
00:00:04,750 --> 00:00:05,980
‫こんにちは､ ようこそ｡

2
00:00:05,980 --> 00:00:12,010
‫この講義では､ C++で関数から出力を得る方法について学びます｡

3
00:00:12,010 --> 00:00:19,870
‫そして､ これを使ってコードを大幅に簡略化し､ これまで書いた疑似コードの実装を開始するのです｡

4
00:00:19,870 --> 00:00:20,800
‫潜入してみよう｡

5
00:00:20,980 --> 00:00:26,350
‫そこで､ 関数からの戻り値を理解しようとする前に､ 少し回り道をして理解しておこう｡

6
00:00:26,350 --> 00:00:29,290
‫ここでは､ 2つの概念を用語集に追加しています｡

7
00:00:29,590 --> 00:00:37,060
‫つまり､ 最初のものは式であり､ 式は値を生成するコードの断片である｡

8
00:00:37,060 --> 00:00:43,180
‫そして､ 実行されるアクションであるコードの断片であるステートメントがあります｡

9
00:00:43,570 --> 00:00:51,130
‫この2つは実は関係があって､ 式はほとんどの場合､ コードの断片の値を計算するために､

10
00:00:51,130 --> 00:00:57,100
‫実行されるべきアクションを必要とするステートメントなのです｡

11
00:00:57,100 --> 00:01:01,030
‫しかし､ その逆もまた真なりとは限りません｡

12
00:01:01,030 --> 00:01:04,780
‫声明は必ずしも価値を与えてくれるとは限りません｡

13
00:01:04,840 --> 00:01:10,960
‫では､ 式の例と､ すでに書いたコードからではないものをいくつか見てみましょう｡

14
00:01:11,170 --> 00:01:20,410
‫つまり､ C++にmy vectorを入力すると､ my vector変数内に格納されているものの値を持つので､

15
00:01:20,410 --> 00:01:22,510
‫これは式となる｡

16
00:01:22,510 --> 00:01:24,730
‫ローカルベクトルも同様です｡

17
00:01:24,730 --> 00:01:33,850
‫そして実際､ ローカルベクトルプラスzがあれば､ それ自体が式となり､ ローカルベクトルドットzプラス100となる｡

18
00:01:33,850 --> 00:01:41,620
‫ローカルベクトルzがZメンバの中の値を与えたので､ それ自体も式となります｡

19
00:01:41,620 --> 00:01:46,960
‫そして､ 100を足すと､ 100を足した新しい値が得られるのです｡

20
00:01:46,960 --> 00:01:48,700
‫つまり､ これらはすべて表現なのです｡

21
00:01:48,940 --> 00:01:55,360
‫しかし､ 式ではないものは､ ローカルベクターを宣言したときに､ F vector, local vector equals

22
00:01:55,360 --> 00:01:58,870
‫my vector と言って､ 行末にセミコロンをつけています｡

23
00:01:58,870 --> 00:02:01,000
‫それを使って値を求めることはできない｡

24
00:02:01,000 --> 00:02:02,590
‫そこに価値はない｡

25
00:02:02,590 --> 00:02:06,370
‫これは､ C++に「あなたが実行すべきアクションはこれです」と伝えているだけなのです｡

26
00:02:06,370 --> 00:02:09,310
‫新しいローカルベクターを作成してほしい｡

27
00:02:09,310 --> 00:02:11,980
‫だから､ それは表現ではない｡

28
00:02:12,310 --> 00:02:17,020
‫ただし､ 表現であるものは､ アクターロケーションを取得します｡

29
00:02:17,020 --> 00:02:20,950
‫最後に括弧があるので､ 関数を呼び出しているのです｡

30
00:02:20,950 --> 00:02:22,720
‫実は､ ここでは何の議論もないんです｡

31
00:02:22,720 --> 00:02:26,290
‫これは空の引数リストですが､ 何かを呼び出しているのです｡

32
00:02:26,290 --> 00:02:37,810
‫この関数には戻り値があるので､ 実際のコードは､ 関数から返された値を受け取る式になります｡

33
00:02:37,810 --> 00:02:44,350
‫そして､ これは以前Blueprintで見た出力ピンと本質的に同じです｡

34
00:02:44,350 --> 00:02:50,800
‫ただし､ Blueprintとは異なり､ 関数の出力値は1つだけです｡

35
00:02:50,800 --> 00:02:52,600
‫戻り値は1つだけです｡

36
00:02:52,600 --> 00:02:59,830
‫現在地を取得する､ という擬似的なコードを書いたところで､ これを利用することができます｡

37
00:02:59,830 --> 00:03:02,440
‫そこで､ それを実現するのです｡

38
00:03:02,440 --> 00:03:08,410
‫get active locationを使って位置情報を取得することにします｡

39
00:03:08,410 --> 00:03:11,320
‫では､ ここに新しいローカル変数を作ってみましょう｡

40
00:03:11,320 --> 00:03:14,650
‫Fベクトル型のFという新しいローカル変数を用意します｡

41
00:03:14,650 --> 00:03:20,350
‫タイプFのベクトルでなければならないのは､ アクティブな場所を取得したときに返されるタイプだからです｡

42
00:03:20,440 --> 00:03:29,470
‫そして､ これを現在地と呼び､ これを結果または式get actor locationと等しく設定し､

43
00:03:29,470 --> 00:03:37,540
‫それに一致する括弧を1セット､ そしてセミコロンで行を終了させます｡

44
00:03:37,540 --> 00:03:49,990
‫この行を少し分解してみると､ アクターの位置の取得と括弧は､ アクターの現在の位置である値を取得している式であることがわかります｡

45
00:03:50,290 --> 00:03:57,040
‫そして､ 現在地への代入を行っていますが､ これもここで宣言されています｡

46
00:03:57,040 --> 00:04:00,550
‫だから､ この線上では､ この線全体が表現になっていない｡

47
00:04:00,550 --> 00:04:03,220
‫そこに価値はなく､ 発言である｡

48
00:04:03,220 --> 00:04:09,880
‫そして通常､ C++では文はセミコロンで終わるので､ 見分けることができます｡

49
00:04:09,880 --> 00:04:29,470
‫つまり､ アクターの位置からローカル変数（現在の位置）を更新するだけでよいのです｡

50
00:04:29,470 --> 00:04:34,390
‫これから行うのは､ さらにこの下にある､ 場所を設定するというコメントです｡

51
00:04:34,390 --> 00:04:45,430
‫そのコメント行の後に､ 現在の位置という表現を使ってアクターの位置を設定します｡ これは､ その変数の値を使うだけです｡ そして､

52
00:04:45,430 --> 00:04:51,460
‫行の最後にセミコロンを付けて､ この全体が文であることを示します｡

53
00:04:51,460 --> 00:05:04,120
‫ある場所に設定されたアクションを実行させたいのですが､ コメントにはインデントをつけていますが､ 通常はコードを一致させるためにインデントはつけないことにしています｡

54
00:05:04,630 --> 00:05:09,130
‫関数内で一段インデントされるコード｡

55
00:05:09,670 --> 00:05:15,490
‫さて､ ここでできることは､ 以前あったローカルベクターに関わるすべてのコードを削除することです｡

56
00:05:15,490 --> 00:05:18,430
‫マイベクターは､ ローカルベクターを使用して位置を設定します｡

57
00:05:18,430 --> 00:05:23,830
‫それをすべて削除して､ コメントの周りのものだけにすることができます｡

58
00:05:24,040 --> 00:05:27,100
‫そして､ ヘッダーファイルの中に入って､ ここを少しきれいにしておきます｡

59
00:05:27,100 --> 00:05:31,420
‫my vectorもmy x newプロパティも不要になりました｡

60
00:05:31,420 --> 00:05:34,440
‫だから､ これらも削除することにします｡

61
00:05:34,450 --> 00:05:40,000
‫現在アクティブな位置を取得し､ それを再び設定するため､

62
00:05:40,000 --> 00:05:44,680
‫基本的に何の効果もありません｡

63
00:05:44,680 --> 00:05:52,870
‫そこで､ そのティック機能で移動台の現在位置を更新してみることに挑戦してほしいのです｡

64
00:05:52,990 --> 00:05:56,530
‫だから､ XやYのメンバーは適当に使ってください｡

65
00:05:56,530 --> 00:06:03,820
‫1つのXで前に､ Yで右に移動し､ それに追加して､ 以前から行っているように､ メンバーに割り当てて､

66
00:06:03,820 --> 00:06:08,770
‫移動プラットフォームの位置を更新することができます｡

67
00:06:08,770 --> 00:06:15,940
‫プラットフォームの移動速度に応じて1または2を追加し､ プラットフォームを開始位置に移動します｡

68
00:06:15,940 --> 00:06:23,920
‫これは､ 開始位置を指定するメンバ変数がないためで､ 実際には現在の位置を使用しています｡

69
00:06:23,920 --> 00:06:28,960
‫だから､ そのプラットフォームをどこに置いても､ そこが起点になるのです｡

70
00:06:29,200 --> 00:06:35,380
‫そして､ そのコードをコンパイルしてテストし､ 期待通りに動くかどうか確認してほしい｡

71
00:06:35,410 --> 00:06:37,240
‫ビデオを一時停止して､ 試してみてください｡

72
00:06:40,030 --> 00:06:40,360
‫なるほど｡

73
00:06:40,360 --> 00:06:41,240
‫お帰りなさい｡

74
00:06:41,260 --> 00:06:49,210
‫そこで､ このコードの行を､ それについて述べているコメントのすぐ下に配置することにします｡ その場所にvectorを追加します｡

75
00:06:49,600 --> 00:06:52,900
‫そして､ ここに載せるのは､ 順番の関係です｡

76
00:06:52,900 --> 00:06:56,830
‫現在地を取得し､ 更新した上で､ 設定したい｡

77
00:06:56,860 --> 00:06:59,710
‫そこでは､ 秩序を乱すようなことが起きてはならない｡

78
00:07:00,070 --> 00:07:04,790
‫もし､ 変数を作る前に更新していたら､ まあ､ その変数は存在しないでしょう｡

79
00:07:04,810 --> 00:07:06,490
‫ローカル変数であることを忘れないでください｡

80
00:07:06,520 --> 00:07:11,110
‫この関数の特定の呼び出しの中で作成した場合にのみ存在します｡

81
00:07:11,110 --> 00:07:16,750
‫また､ アクターの位置を設定した後に再度アクターの位置を設定すると､ 関数の閉じ括弧のところで､

82
00:07:16,750 --> 00:07:20,210
‫その修正がチャックされてしまうのです｡

83
00:07:20,260 --> 00:07:29,410
‫そこで､ 現在位置ドットxを設定するのですが､ 現在位置と等しいドットxプラス1を使って､

84
00:07:29,410 --> 00:07:34,180
‫行末にセミコロンを入れています｡

85
00:07:34,180 --> 00:07:40,180
‫そして､ Unrealに戻り､ コンパイルボタンを押すのです｡

86
00:07:40,180 --> 00:07:45,640
‫そして､ 先ほど申し上げたように､ この移動台をスタート地点に移動させに行く必要があります｡

87
00:07:45,640 --> 00:07:51,490
‫三人称視点のキャラクターをクリックして､ その位置を右クリックしてコピーし､ 移動するプラットフォームに行って､

88
00:07:51,490 --> 00:07:56,770
‫その位置を右クリックして貼り付けをクリックします｡

89
00:07:56,770 --> 00:08:01,510
‫そのため､ プラットフォームがプレーヤーの中に入ってしまうのですが､ 実はこれは私たちが望んでいることではありません｡

90
00:08:01,510 --> 00:08:09,790
‫そこで､ このようにプレーヤーの右側に少しずらして､ 高さが適切かどうかを確認します｡

91
00:08:09,790 --> 00:08:15,400
‫もう少し下の方に作ろうと思います｡ これは､ ロケーション変数ではなく現在地を使うことの利点のひとつですが､

92
00:08:15,400 --> 00:08:20,560
‫このプラットフォームが世界のどこにあるのかが実際に分かるということです｡

93
00:08:20,800 --> 00:08:31,510
‫では､ 再生ボタンを押してみると､ プラットフォームがX方向にうまく移動しているのがわかりますね｡

94
00:08:31,510 --> 00:08:32,450
‫素晴らしい内容です｡

95
00:08:32,470 --> 00:08:36,490
‫さて､ ここまでで関数から返り値がどのように機能するかを学びました｡

96
00:08:36,490 --> 00:08:43,160
‫C++の世界では､ 設計図から多くの概念を理解することが本当にできるようになりました｡

97
00:08:43,180 --> 00:08:44,890
‫それでは､ 次回の講義でお会いしましょう｡

