﻿1
00:00:04,310 --> 00:00:05,270
‫こんにちは､ ようこそ｡

2
00:00:05,270 --> 00:00:12,020
‫この講義では､ ローカル変数（与えられた関数の中でのみ存在する変数）の概念について調べます｡

3
00:00:12,020 --> 00:00:21,560
‫そして､ これを利用して､ マイベクターに格納されている値とは異なる値を位置情報に設定する方法を見ていきます｡

4
00:00:21,590 --> 00:00:22,460
‫潜入してみよう｡

5
00:00:22,640 --> 00:00:28,520
‫さて､ ここまでは､ クラスに属する変数を扱ってきました｡

6
00:00:28,520 --> 00:00:31,760
‫これまでBlueprintでやっていたことを､ 今度はC++でやってみました｡

7
00:00:31,760 --> 00:00:37,190
‫そしてこれは､ クラスのインスタンスがある限り､ 変数が生きていることを意味します｡

8
00:00:37,190 --> 00:00:43,970
‫各インスタンスは変数のコピーを取得しますが､ クラスインスタンスが生きている間は､ 変数は2つです｡

9
00:00:43,970 --> 00:00:47,690
‫さて､ 今お話したこのコンセプトには､ 実は名前がついています｡

10
00:00:47,690 --> 00:00:49,130
‫それが「スコープ」です｡

11
00:00:49,460 --> 00:00:52,640
‫どういうことかというと､ その変数がどのくらい生きるか､ ということです｡

12
00:00:52,640 --> 00:01:00,710
‫今､ インスタンス変数について説明しましたが､ これはあるクラスの特定のインスタンスが存在する限り､ 生き続ける変数です｡

13
00:01:00,860 --> 00:01:03,890
‫さて､ 変数には他のタイプもあります｡

14
00:01:03,890 --> 00:01:07,490
‫関数と同じだけ生きている変数がある｡

15
00:01:07,490 --> 00:01:14,960
‫基本的に特定の関数を呼び出すと､ その関数が実行され､ 関数が終了すると同時に､ その変数は死んでしまうのです｡

16
00:01:15,050 --> 00:01:23,660
‫つまり､ C++では一般的に､ 構文上､ 中括弧の間で有効なものが変数となります｡

17
00:01:23,660 --> 00:01:25,520
‫だから､ 目安になるんです｡

18
00:01:25,520 --> 00:01:31,520
‫必ずしも正確ではありませんが､ 例えばtick関数の場合､ ここに中括弧がありますが､

19
00:01:31,520 --> 00:01:39,740
‫このtick関数の中で変数を宣言すると､ その変数は1回だけしか存在しないことになります｡

20
00:01:39,740 --> 00:01:44,120
‫tick関数が呼び出され､ 次回は新たに作成されることになる｡

21
00:01:44,390 --> 00:01:46,070
‫動くプラットフォーム｡

22
00:01:46,370 --> 00:01:48,650
‫それは､ ムービングプラットフォームを見てもらえばわかると思います｡

23
00:01:48,980 --> 00:01:56,300
‫H ベクターが中括弧の中で宣言されているのがわかりますが､ これはクラスの定義に属するもので､ そのため､

24
00:01:56,300 --> 00:02:02,390
‫これらの変数はクラスのインスタンスが存在する限り生き続けるのです｡

25
00:02:02,390 --> 00:02:04,610
‫だから､ それを証明したいんです｡

26
00:02:04,610 --> 00:02:11,210
‫そこで､ ムービングプラットフォームDHCPに入り､ この中にローカル変数を作ってみましょう｡

27
00:02:11,210 --> 00:02:15,050
‫そこで､ 先ほどと全く同じ方法で作成します｡

28
00:02:15,050 --> 00:02:23,090
‫ヘッダーファイルでエラー宣言をするときに､ Fベクター､ それからベクターの名前､ 私はローカルベクターと呼ぶことにしているんだ｡

29
00:02:23,720 --> 00:02:28,130
‫そして､ 作成時にこの値を設定することができます｡

30
00:02:28,130 --> 00:02:32,960
‫Fベクトルのコンストラクタを使うこともできますし､ 関数に変数を渡すのと同じように､

31
00:02:32,960 --> 00:02:35,540
‫別の変数から渡すこともできます｡

32
00:02:35,540 --> 00:02:38,870
‫そこで､ まずコンストラクタのメソッドを利用します｡

33
00:02:38,870 --> 00:02:46,040
‫そこで､ Fのベクトルを用意し､ 1〜3まで与えて､ 行末にセミコロンをつけることにします｡

34
00:02:46,040 --> 00:02:48,230
‫つまり､ 今はローカル変数になっているのです｡

35
00:02:48,230 --> 00:02:55,070
‫この関数の中だけに存在し､ この関数が呼ばれるたびにリセットされます｡

36
00:02:55,070 --> 00:03:01,010
‫このように､ 29行目で私のベクトルを更新するようなことをすると､

37
00:03:01,010 --> 00:03:12,740
‫ローカルベクトル､ ローカルベクトルzはローカルベクトルdot zに1を足したものに等しくなります｡

38
00:03:12,920 --> 00:03:22,100
‫そして､ そのローカルベクトルに自分の位置を設定すれば､ リセットして同じ位置からスタートするので､

39
00:03:22,100 --> 00:03:26,240
‫毎フレーム同じ位置になります｡

40
00:03:26,240 --> 00:03:28,940
‫1､ 2､ 3､ いちいちチック機能｡

41
00:03:28,940 --> 00:03:31,640
‫だから､ この機能は本当にローカルにしか存在しない｡

42
00:03:31,640 --> 00:03:38,840
‫そこで､ マイベクターからローカルベクターを設定するための課題として､ ちょっとした実験をしてみてほしい｡

43
00:03:38,840 --> 00:03:46,010
‫つまり､ コンストラクタから設定するのではなく､ 現在私のベクターにある値から設定するというのが基本的なやり方です｡

44
00:03:46,040 --> 00:03:50,210
‫そのベクターのコピーをローカルベクターに取り込むのです｡

45
00:03:50,510 --> 00:03:54,530
‫そして､ ローカルベクトルを使ってロケーションにセットしてほしい｡

46
00:03:54,530 --> 00:04:00,380
‫そして､ そのローカルベクトルを毎フレーム更新しようとしているため､ どのような効果があるのか見てみましょう｡

47
00:04:00,380 --> 00:04:01,610
‫プラットフォームは動きますか？

48
00:04:01,610 --> 00:04:07,490
‫それを期待して､ 実際に行ってみて､ コードをコンパイルして､ 実際に動くかどうかを確認するのでしょうか｡

49
00:04:07,490 --> 00:04:09,140
‫ビデオを一時停止して､ 試してみてください｡

50
00:04:12,040 --> 00:04:12,640
‫なるほど｡

51
00:04:12,640 --> 00:04:13,630
‫お帰りなさい｡

52
00:04:13,630 --> 00:04:21,100
‫そこで､ このコンストラクタを使ってローカルベクターを設定するのではなく､ 代わりに自分のベクターを設定することにします｡

53
00:04:21,100 --> 00:04:28,540
‫つまり､ 現在マイベクターに格納されている値をローカルベクターに取り込み､

54
00:04:28,810 --> 00:04:32,830
‫ローカルベクターを更新しているのです｡

55
00:04:32,830 --> 00:04:39,700
‫そして､ アクターの位置を私のベクトルから設定するのではなく､

56
00:04:39,700 --> 00:04:45,070
‫ローカルベクトルから設定したいと思います｡

57
00:04:45,460 --> 00:04:48,940
‫さて､ この場合どうなるのでしょうか？

58
00:04:48,940 --> 00:04:51,010
‫さっそく調べてみましょう｡

59
00:04:51,010 --> 00:04:56,620
‫コンパイルボタンを押してから再生ボタンを押すと､ プラットフォームはまだ右側に移動していますが､

60
00:04:56,620 --> 00:05:03,160
‫Z方向には上昇していないことがわかります｡

61
00:05:03,160 --> 00:05:09,700
‫つまり､ ローカルベクタの増加は､ フレームごとに私のベクタの現在の値からリセットされるため､

62
00:05:09,700 --> 00:05:14,680
‫実際には影響を及ぼしていないことがわかります｡

63
00:05:14,680 --> 00:05:17,350
‫しかし､ 私のベクターはまだ更新中です｡

64
00:05:17,350 --> 00:05:19,840
‫毎フレーム､ y値が増加している｡

65
00:05:19,840 --> 00:05:22,840
‫だから､ 右傾化が進んでいるのです｡

66
00:05:22,840 --> 00:05:33,820
‫そこで､ このローカルベクトルの変化が単なるローカルなものであることを確認する一つの方法が､ この値を1から100程度に増やすことです｡

67
00:05:33,820 --> 00:05:38,560
‫つまり､ ローカルベクトルの値に100を足しているわけです｡

68
00:05:38,770 --> 00:05:42,550
‫コンパイルしてから再生ボタンを押せばいいんです｡

69
00:05:42,760 --> 00:05:47,710
‫そして､ これからご覧いただくのは､ プラットフォームが実際に100ユニット分空中に高くなったということです｡

70
00:05:47,740 --> 00:05:55,450
‫ここでちょっと時間をとって､ F8でイジェクトして､ メインツールバーのポーズボタンでゲームを一時停止して､

71
00:05:55,450 --> 00:06:01,780
‫移動プラットフォームを選択して､ 詳細ペインで見てみましょう｡

72
00:06:01,780 --> 00:06:05,410
‫そのためには､ なぜか実際にビューポートでクリックする必要があるんです｡

73
00:06:05,410 --> 00:06:07,540
‫アウトラインでクリックしただけではうまくいかないことがあります｡

74
00:06:08,410 --> 00:06:21,970
‫そして､ 私のベクトルの中の値､ 私のベクトルの中のZ値は､ トランスフォームのZ位置より100単位小さいことを指摘しておきたいと思います｡

75
00:06:21,970 --> 00:06:27,010
‫つまり､ そのローカルなベクトルに加えることで効果が出ていることがわかります｡

76
00:06:27,010 --> 00:06:34,150
‫マイベクターの位置より100単位高い位置を取得しました｡

77
00:06:34,150 --> 00:06:41,500
‫そして､ ローカル変数が本当に素晴らしいのは､ 関数が特定の実行を終了すると､ クリアされてリセットされることです｡

78
00:06:41,500 --> 00:06:44,440
‫だから､ ローカル変数で常に何が起こるか知ることができるのです｡

79
00:06:44,440 --> 00:06:52,720
‫他の関数からいつでも更新できるクラス変数とは異なり､ どのような値が入るかは常に分かっています｡

80
00:06:52,720 --> 00:06:57,190
‫このローカル変数については､ 数回に分けて講義を行う予定です｡

81
00:06:57,190 --> 00:06:58,630
‫飛び込んでみよう｡

