﻿1
00:00:04,360 --> 00:00:05,860
‫こんにちは､ この講義を歓迎します｡

2
00:00:05,860 --> 00:00:20,050
‫これから､ あるコードを可変回数実行することで､ このエリア（トリガーコンポーネント）内で重なるすべてのオブジェクトをプリントアウトする方法を学びます｡

3
00:00:20,050 --> 00:00:24,400
‫だから､ ここでわかるのは､ 二人でいるとき､ 私は中に立っていて､ ガーゴイルもいるんです｡

4
00:00:24,430 --> 00:00:29,410
‫ガーゴイル名とプレイヤー設計図名の両方が出力されるのですが｡

5
00:00:29,410 --> 00:00:31,360
‫では､ どのように行われるのか､ 潜入してみましょう｡

6
00:00:31,930 --> 00:00:39,220
‫さて､ このコードの問題点は､ アクター配列に含まれるアクターは1つだけではない可能性があることです｡

7
00:00:39,220 --> 00:00:44,380
‫また､ すべてのアクターを重ねて表示したい場合や､ それらのアクターすべてを使って何かをしたい場合は､

8
00:00:44,380 --> 00:00:47,680
‫コードを実行できるようにする必要があります｡

9
00:00:47,680 --> 00:00:58,840
‫2つとか3つとか4つとか5つとか､ そういう場合のためにif文を書くのは非常に非効率的です｡

10
00:00:58,840 --> 00:00:58,840
‫また､

11
00:00:58,840 --> 00:01:00,220
‫ファイルの行数に限りがあるため､ すべてのケースを把握できるわけではありません｡

12
00:01:00,580 --> 00:01:08,230
‫そこで対処法ですが､ あるコードを複数回､ ただしコンパイル時に実際にはわからない回数だけ繰り返したい場合､

13
00:01:08,230 --> 00:01:14,530
‫if文を置き換える必要があります｡

14
00:01:14,770 --> 00:01:20,170
‫If文は本質的に､ このコードを実行すべきか否かを､ このコードを何回も､ 2回､

15
00:01:20,170 --> 00:01:25,300
‫3回､ 4回と実行すべきか否かと言うようなものと一緒に言うのですか？

16
00:01:25,450 --> 00:01:29,440
‫その方法は､ ワイルドステートメントと呼ばれるものです｡

17
00:01:29,440 --> 00:01:32,440
‫これで､ 非常にif文に近い作りになっています｡

18
00:01:32,440 --> 00:01:42,430
‫つまり､ whileは括弧の中にブール値のようなものを入れて､ 中括弧で囲んでいるのです｡

19
00:01:42,430 --> 00:01:54,340
‫そして中括弧の中には､ while文の条件がfalseになるまで何度も何度も実行されるコードのブロックがあります｡

20
00:01:54,340 --> 00:01:55,990
‫だからwhileというわけです｡

21
00:01:55,990 --> 00:01:59,320
‫だから､ このことが真実である間､ このコードを実行する｡

22
00:01:59,320 --> 00:02:04,630
‫しかし､ 一度しか実行できないif文とは異なり､ while文は､

23
00:02:04,630 --> 00:02:14,890
‫このブール値がfalseにならない限り､ 基本的に永遠に実行し続けることができるのです｡

24
00:02:15,460 --> 00:02:22,420
‫では､ int型32を作成してindexと呼び､ それを0からスタートさせることができるのに､ なぜこれが有用なのでしょうか？

25
00:02:22,900 --> 00:02:31,750
‫そして､ このワイルドループの本体を通過するたびに､ そのインデックスに格納されている値を増やしていく｡

26
00:02:31,750 --> 00:02:36,130
‫つまり､ インデックスはインデックスに1を足したものに等しいと言えるのです｡

27
00:02:36,640 --> 00:02:42,520
‫C++では､ このようにindexに1を足すのではなく､ plus plus indexとすることで､

28
00:02:42,520 --> 00:02:49,480
‫index変数に格納されているものに1を足すだけの省略表現があります｡

29
00:02:50,110 --> 00:02:50,360
‫なるほど｡

30
00:02:50,470 --> 00:02:52,090
‫だから､ ゼロからスタートするんです｡

31
00:02:52,120 --> 00:02:54,940
‫私たちは回を重ねるごとに､ 指数を上げています｡

32
00:02:54,940 --> 00:03:05,200
‫そして､ インデックスが配列の範囲内にある間だけ､ このwhileループを回るようにすることができます｡

33
00:03:05,200 --> 00:03:11,440
‫つまり､ インデックスはアクターズドットナンバーより小さくなければならないと言える｡

34
00:03:11,440 --> 00:03:13,210
‫つまり､ これが配列のサイズです｡

35
00:03:13,210 --> 00:03:19,570
‫配列に5つの項目があるとき､ 配列の最後の項目はインデックス4であることを思い出してください｡

36
00:03:19,870 --> 00:03:28,450
‫そして､ インデックスが有効なとき､ インデックス4が5より小さいとき､ これが真となることがわかる｡

37
00:03:28,450 --> 00:03:37,390
‫しかし､ インデックスが配列の最後を過ぎてインデックス5になった時点で､ アクター番号はもうなくなってしまいます｡

38
00:03:37,390 --> 00:03:39,220
‫もはや5が5を下回ることはない｡

39
00:03:39,220 --> 00:03:45,220
‫そのため､ whileループは実行を停止し､ 残りの関数を続行します｡

40
00:03:45,700 --> 00:03:53,110
‫つまり､ 上記のコードを書き直せばいいということです｡

41
00:03:53,290 --> 00:03:58,270
‫これをコピーして､ 切り取って､ このワイルドループに貼り付けましょう｡

42
00:03:58,270 --> 00:04:03,520
‫しかし､ インデックスを増やす前に､ 最も重要なことは､ これから行うことは､ アクターゼロを取得していたこのゼロを､

43
00:04:03,520 --> 00:04:08,560
‫アクターインデックスに置き換えることだからです｡

44
00:04:08,800 --> 00:04:10,210
‫では､ この通りにしてみましょう｡

45
00:04:10,240 --> 00:04:11,950
‫これはどういった仕組みなのでしょうか？

46
00:04:12,580 --> 00:04:15,910
‫ちょっと混乱するので､ if文は削除しましょう｡

47
00:04:15,910 --> 00:04:20,230
‫そこで､ まず変数indexの値を0にします｡

48
00:04:20,530 --> 00:04:23,470
‫ここで､ 物事をシンプルにするために､ 2人のアクターがいるとします｡

49
00:04:23,680 --> 00:04:27,070
‫ゼロは2より小さいのか？

50
00:04:27,100 --> 00:04:27,760
‫はい｡

51
00:04:27,760 --> 00:04:28,570
‫はい､ そうです｡

52
00:04:28,570 --> 00:04:38,680
‫そこで､ アクターゼロを取得し､ その名前を取得してログアウトし､ インデックスの値を1つ増やします｡

53
00:04:38,680 --> 00:04:40,840
‫つまり､ ゼロから1になるわけです｡

54
00:04:41,320 --> 00:04:47,320
‫ここで､ whileループの条件に戻って､ 1が2より小さいかどうかを評価します｡

55
00:04:47,320 --> 00:04:48,190
‫はい､ そうです｡

56
00:04:48,190 --> 00:04:55,540
‫そして､ アクター1を取得し､ その名前を取得し､ その名前を表示することができます｡

57
00:04:55,540 --> 00:05:03,760
‫そして､ 再びインデックスを2まで増やし､ ワイルドループで「2はより小さいか」と再び質問します｡

58
00:05:04,240 --> 00:05:05,890
‫まあ､ その答えはノーなんですけどね｡

59
00:05:05,890 --> 00:05:12,070
‫そこで､ whileループの本体をスキップして､ 残りのコードを実行します｡

60
00:05:12,430 --> 00:05:15,120
‫だから､ 基本的にはそれを実現したいのです｡

61
00:05:15,130 --> 00:05:23,590
‫配列に含まれる各アクターの名前を出力したいのですが､ それを行うのがこのコードの部分です｡

62
00:05:23,620 --> 00:05:26,370
‫さっそくコンパイルして､ 正しいかどうか確認してみましょう｡

63
00:05:26,380 --> 00:05:33,610
‫そのまま再生ボタンを押してボックスに入ると､ ちょうどBPの選手と重なっているのがわかると思います｡

64
00:05:33,730 --> 00:05:36,270
‫ガーゴイルを取りに行くのはどう？

65
00:05:36,280 --> 00:05:41,070
‫それだけをバウンスに貼り付けると､ ガーゴイルに重なってしまうのがわかります｡

66
00:05:41,080 --> 00:05:43,250
‫でも､ もし私が同じように踏み込んだら？

67
00:05:43,270 --> 00:05:50,080
‫これで､ プレイヤーとガーゴイルが同じフレームに重なっていることが印刷されているのがわかると思います｡

68
00:05:50,080 --> 00:05:58,520
‫つまり､ whileループは動作しており､ 配列に複数のアクターがある場合に､ コードの一部を複数回実行します｡

69
00:05:58,540 --> 00:06:04,570
‫さて､ このようにある種のインデックスを持ち､ ループを通過するたびにそれを増やしていくというパターンは非常によくあることなので､

70
00:06:04,570 --> 00:06:09,340
‫実はC++にはこれを表す略記があるのです｡

71
00:06:09,340 --> 00:06:18,310
‫そして､ Visual Studioのコードで4と入力すると､ ここに4ループのスニペットがあり､ これを展開すると､

72
00:06:18,310 --> 00:06:23,890
‫これが一般的な構造であることがわかります｡

73
00:06:23,890 --> 00:06:25,420
‫ここにはTサイズと呼ばれるものが入っています｡

74
00:06:25,420 --> 00:06:29,470
‫目的に合わせてINT32に置き換えればいいのです｡

75
00:06:29,620 --> 00:06:36,390
‫そして､ 本質的には､ forループの括弧の中に3つのステートメントがあることを意味しています｡

76
00:06:36,400 --> 00:06:43,240
‫最初のものは､ whileループの前にindex変数を設定したところと同じです｡

77
00:06:43,780 --> 00:06:49,120
‫2つ目は､ ワイルドループの中に入れた条件に相当するものです｡

78
00:06:49,510 --> 00:06:54,670
‫そして､ カウントをアクターズドットナムに置き換えることができることがおわかりいただけると思います｡

79
00:06:54,670 --> 00:07:01,240
‫そして最後のビットは､ 基本的にプラス・プラスを前に置くか後に置くか､ インデックスはあまり重要ではありませんが､

80
00:07:01,240 --> 00:07:07,240
‫これがインデックスの値を増やしていることがわかります｡

81
00:07:07,240 --> 00:07:11,080
‫つまり､ ワイルドループの最後に入れた行と同じです｡

82
00:07:11,470 --> 00:07:18,910
‫そのため､ ワイルドループで複数に分散していたものを1行にまとめただけです｡

83
00:07:18,910 --> 00:07:20,380
‫そこで､ 簡単なチャレンジをしてみましょう｡

84
00:07:20,380 --> 00:07:23,470
‫野生ループをforループに変換します｡

85
00:07:23,470 --> 00:07:30,220
‫コードの本文をコピーして､ その名前のインデックスをIに変更するんだ｡

86
00:07:30,250 --> 00:07:38,020
‫我々は通常､ 私はちょうどインデックス本当にとコンパイルとテストポーズビデオの略語のループのために使用します｡

87
00:07:38,020 --> 00:07:38,800
‫さあ､ やってみましょう｡

88
00:07:41,860 --> 00:07:42,180
‫なるほど｡

89
00:07:42,190 --> 00:07:42,760
‫お帰りなさい｡

90
00:07:42,760 --> 00:07:44,710
‫だから､ これはかなり簡単なことだと思います｡

91
00:07:44,710 --> 00:07:47,050
‫インデックス・プラス・プラスはここにはいらない｡

92
00:07:47,050 --> 00:07:54,370
‫そこで､ 残りの部分をカットして､ index変数でactor配列にインデックスを付けるところにチャンネルを変更します｡

93
00:07:54,370 --> 00:07:58,450
‫このforループの中だけで使える変数をIEに変更するのです｡

94
00:07:58,450 --> 00:08:04,750
‫ところで､ フルループ構文のもう一つの利点は､ IE変数はforループの中だけで利用できることです｡

95
00:08:04,990 --> 00:08:10,210
‫一方､ Yループの中で宣言すると､ 外部で利用できるようになり､ 後で利用できるインデックスを汚染するので､

96
00:08:10,210 --> 00:08:16,990
‫ワイルドループを削除できます｡

97
00:08:16,990 --> 00:08:25,390
‫そして､ forループがより凝縮され､ その少し奇妙な構文に慣れることができるのがおわかりいただけると思います｡

98
00:08:25,390 --> 00:08:30,670
‫では､ コンパイルして､ 本当に同じ仕事をするかどうかだけ確認してみましょう｡

99
00:08:30,670 --> 00:08:38,050
‫ガーゴイルを持って､ アクターが重なっているところに行くと､ アルコーブで2人が重なっているときに､

100
00:08:38,050 --> 00:08:42,100
‫両方のアクターが印刷されていることがわかります｡

101
00:08:42,130 --> 00:08:42,850
‫素晴らしい内容です｡

102
00:08:42,850 --> 00:08:53,230
‫この講義では､ 新しいプログラミングのアイデアであるループのアイデア､ 特にwhileループとforループに出会いました｡

103
00:08:53,230 --> 00:08:54,910
‫それでは､ 次回の講義でお会いしましょう｡

