﻿1
00:00:04,290 --> 00:00:05,490
‫こんにちは､ ようこそ｡

2
00:00:05,490 --> 00:00:12,810
‫この講義では､ コンポーネントの所有アクターへのポインターを取得する方法について学びます｡

3
00:00:12,810 --> 00:00:19,740
‫ポインタとは何か､ メモリ上のアドレスは何か､ そしてそれらをログメッセージにも出力してみます｡

4
00:00:19,740 --> 00:00:20,640
‫潜入してみよう｡

5
00:00:21,090 --> 00:00:29,130
‫そこで､ 変数アドレスについて､ プログラミング全般で行われていることの核心的な考え方を少し理解しておきましょう｡

6
00:00:29,130 --> 00:00:30,810
‫変数のアドレスとは何ですか？

7
00:00:30,810 --> 00:00:43,920
‫さて､ 私たちはすべての変数をコンピュータのこのラムチップ内のメモリに保存しています｡ 変数はそのデータを保存するためにメモリを必要とします｡

8
00:00:43,920 --> 00:00:52,740
‫つまり､ 浮動小数点数には32ビットのデータか､ 2倍整数なら64ビットのデータが必要で､ 一定のメモリ量が必要なのです｡

9
00:00:52,740 --> 00:00:58,440
‫また､ 構造体が大きくなればなるほど､ あるいはクラスが大きくなればなるほど､ たとえばアクタは非常に大きく､

10
00:00:58,440 --> 00:01:04,230
‫多くのデータを包含しているため､ アクタごとに数キロバイトのメモリが必要になるかもしれません｡

11
00:01:04,590 --> 00:01:12,510
‫その記憶は､ あなたのメモリバンクという空のデータの大きなフィールドのどこかで生きているはずです｡

12
00:01:12,660 --> 00:01:16,410
‫そして､ その場所を住所と呼びます｡

13
00:01:16,410 --> 00:01:18,420
‫では､ 実際にはどうなのでしょうか｡

14
00:01:18,420 --> 00:01:21,870
‫さて､ 0と1の大きなフィールドがあるとします｡

15
00:01:21,870 --> 00:01:25,140
‫それが､ あなたのラムのデータです｡

16
00:01:25,320 --> 00:01:37,110
‫さて､ そうなるとMy actorという変数とアクター変数が､ アクターのデータを格納するために割り当てられたそのメモリ内のある場所が必要になってきますね｡

17
00:01:37,110 --> 00:01:42,300
‫この赤い部分は､ ある特定の俳優のデータを保存している場所かもしれません｡

18
00:01:42,300 --> 00:01:50,610
‫そして､ 通常は2進数または16進数で示されるアドレスを持っており､ これは本質的に単なる場所です｡

19
00:01:50,610 --> 00:01:59,220
‫もしここで､ すべてのバイト､ すべての1と0を数え始めたら､ 実は個々の1と0を数えることはありません｡

20
00:01:59,220 --> 00:02:03,360
‫8刻みで数えますが､ それはあまり重要ではありません｡

21
00:02:03,360 --> 00:02:04,410
‫バイトを数えるのです｡

22
00:02:04,620 --> 00:02:08,070
‫本来はそこがスタート地点のアドレスです｡

23
00:02:08,810 --> 00:02:14,180
‫私たちの俳優の話をすると､ それぞれのタイプに一定の大きさがあります｡

24
00:02:14,180 --> 00:02:18,020
‫つまり､ アクターは何バイトのデータを必要とするかがわかるわけです｡

25
00:02:18,020 --> 00:02:23,240
‫このように､ 特定の俳優に関するデータがどこにあるかがわかります｡

26
00:02:23,360 --> 00:02:24,880
‫では､ なぜこれが重要なのでしょうか｡

27
00:02:24,890 --> 00:02:30,680
‫では､ アクターへのテイクを作りたくなるようなシチュエーションを見てみましょう｡

28
00:02:30,680 --> 00:02:34,340
‫同じデータを参照する変数を2つ用意したい｡

29
00:02:34,520 --> 00:02:38,240
‫さて､ 素朴なケースでは､ 単にこれをコピーするだけである｡

30
00:02:38,240 --> 00:02:44,360
‫つまり､ マイ・アクター変数に割り当てられたメモリのチャンクを手に入れたというわけです｡

31
00:02:44,510 --> 00:02:52,280
‫もうひとつ､ Your Actorという空の変数に割り当てられたメモリがありますが､ これにはまだ何も割り当てられていません｡

32
00:02:52,550 --> 00:02:59,690
‫そして､ 同じデータを含むようにしたいので､ 一方を他方に割り当てます｡

33
00:02:59,690 --> 00:03:10,400
‫その結果､ 私のアクターの中にあったすべてのデータのビットをコピーして､ あなたのアクターを構成するすべてのビットに入れるだけでいいんです｡

34
00:03:10,730 --> 00:03:17,990
‫そのため､ CPUが元のメモリを一つ一つ評価して新しい場所に入れる必要があり､ 時間がかかるため､

35
00:03:17,990 --> 00:03:22,680
‫かなりコストのかかる手順となります｡

36
00:03:22,700 --> 00:03:25,760
‫さて､ これを回避するために､ ポインタというものを使う方法があります｡

37
00:03:25,760 --> 00:03:38,840
‫つまりここでは､ マイ・アクター全体を格納するのではなく､ マイ・アクターやアクター・アクターのポインターという変数が用意されているのです｡

38
00:03:38,840 --> 00:03:42,170
‫アクトを見つけることができるアドレスを保存するだけです｡

39
00:03:42,170 --> 00:03:46,580
‫そのため､ アドレスを格納するために使用するメモリがかなり少なくなっていることがおわかりいただけると思います｡

40
00:03:46,580 --> 00:03:54,140
‫そして､ あなたのアクターには､ 私のアクターのアドレスを格納して､ データをコピーするのではなく､

41
00:03:54,140 --> 00:03:59,090
‫元のアクターを指すようにします｡

42
00:03:59,240 --> 00:04:01,880
‫さて､ これはC++の実際の構文ではありません｡

43
00:04:01,880 --> 00:04:04,430
‫C++では､ 構文がより凝縮されています｡

44
00:04:04,640 --> 00:04:09,650
‫ポインターの場合は､ 型の後に星印をつけるとポインターであることがわかります｡

45
00:04:09,650 --> 00:04:25,250
‫つまり､ アクタースターはアクターポインターを意味し､ 変数のアドレスを得るにはアンパサンドを使用します｡

46
00:04:25,250 --> 00:04:31,160
‫だから､ 当面はポインターを作るのではなく､ その使い方を知っていればいいのです｡

47
00:04:31,640 --> 00:04:40,070
‫そこで､ シーン内の他のオブジェクトにアクセスするための関数の1つが､ get ownerです｡

48
00:04:40,070 --> 00:04:46,460
‫では､ なぜコンポーネントがあるときに､ それがアクターの所有物である場合に適用されるのでしょうか｡

49
00:04:46,460 --> 00:04:58,400
‫つまり､ このコンポーネントがアクターと対話し､ その位置を取得したり､ 位置を設定したりするためには､ そのアクターへのポインターを取得できるようにする必要があるのです｡

50
00:04:58,400 --> 00:05:00,040
‫コピーでは困るのです｡

51
00:05:00,050 --> 00:05:03,350
‫実は､ 役者を変えているつもりなので､ コピーは取りたくないんです｡

52
00:05:03,350 --> 00:05:07,160
‫コピーに変更を加えても､ 実際にはシーンに表示されないのです｡

53
00:05:07,280 --> 00:05:13,850
‫そこで､ アクターへのポインターである変数を格納できるようにする必要があります｡

54
00:05:14,330 --> 00:05:19,760
‫その方法は､ 先ほどのスライドで見たように､ Aというアクタータイプを持つことです｡

55
00:05:19,760 --> 00:05:28,880
‫しかし､ 最後に星印をつけることで､ これはここに格納されているアクターではなく､ 単に格納されているアクターのアドレスであることを示します｡

56
00:05:29,150 --> 00:05:39,140
‫つまり､ アクターからownerと呼び､ get ownerを呼び出した結果と等しい値を設定します｡

57
00:05:39,140 --> 00:05:46,970
‫つまり､ get ownerは､ オーナーポインタを取得することができるアクターコンポーネントの関数である｡

58
00:05:46,970 --> 00:05:53,690
‫オーナーを指すアクターポインターを取得し､ その行の最後にセミコロンを置く｡

59
00:05:53,690 --> 00:06:01,670
‫そして､ ここにあるのは､ この特定のコンポーネントを所有するアクターのアドレスを格納する変数です｡

60
00:06:01,670 --> 00:06:07,580
‫そこで､ この変数のアドレスを表示することで､ 何かに挑戦してみたいと思います｡

61
00:06:07,580 --> 00:06:14,690
‫だから､ アクター変数を使用して､ あなたがフォーマットするパーセントを使用し､ ログに指定します｡

62
00:06:14,690 --> 00:06:19,550
‫つまり､ パーセント・ユーは本質的に符号なし整数を使用していることを意味します｡

63
00:06:19,550 --> 00:06:25,250
‫というのは､ メモリがどこにあるかという話をするときに､

64
00:06:25,730 --> 00:06:33,980
‫アドレスが負になることはありえないからです｡

65
00:06:34,250 --> 00:06:38,000
‫プレイを中断し､ 再びプレイを開始した場合､ 異なるプレイ間で変化するのでしょうか？

66
00:06:38,000 --> 00:06:41,900
‫また､ ムーバーが複数の役者に出ている場合はどうでしょうか｡

67
00:06:41,900 --> 00:06:45,680
‫コンソールに複数の異なるアドレスが出力されていませんか？

68
00:06:45,710 --> 00:06:48,620
‫ビデオを一時停止して､ 少し調べてみてください｡

69
00:06:52,030 --> 00:06:52,390
‫なるほど｡

70
00:06:52,390 --> 00:06:53,410
‫お帰りなさい｡

71
00:06:53,440 --> 00:07:04,380
‫そこで､ このユールログに移動して､ ムーバーオーナー､ 住所､ コロンパーセント､ あなた､ と入力します｡

72
00:07:04,510 --> 00:07:07,540
‫そこで､ ポインターの値を置くことになる｡

73
00:07:07,930 --> 00:07:10,210
‫そして､ 実際のポインターを置くことになります｡

74
00:07:10,210 --> 00:07:12,430
‫そこで､ ここにオーナー様をお迎えすることになりました｡

75
00:07:12,940 --> 00:07:16,360
‫つまり､ 持ち主の住所がプリントアウトされるんですね｡

76
00:07:16,450 --> 00:07:19,150
‫アンリアルを超えてみよう｡

77
00:07:19,180 --> 00:07:21,910
‫control alt f を押す 11.

78
00:07:21,910 --> 00:07:24,610
‫そして､ コンパイルが終わったら､ 再生ボタンを押してみましょう｡

79
00:07:24,610 --> 00:07:32,300
‫そして､ ログメッセージのムーバーオーナーのアドレスが表示され､ このアドレスの非常に大きな数字が表示されていることがわかります｡

80
00:07:32,320 --> 00:07:36,460
‫ちょっとだけプレイをやめて､ またプレイしたらどうでしょう？

81
00:07:36,460 --> 00:07:42,250
‫これは､ 再生ボタンを押すたびに､ Unreal がシーン内にまったく新しいアクタのセットを作成し､

82
00:07:42,250 --> 00:07:51,850
‫基本的にゼロからプレイできるようにしているからです｡

83
00:07:51,850 --> 00:07:57,220
‫だから､ 再生ボタンを押すたびに､ 新しいアドレスの場所が表示されるわけです｡

84
00:07:57,220 --> 00:08:08,020
‫例えば､ この柱に行き､ 同様に柱にムーバーコンポーネントを追加し､ 再生を押してログの下までスクロールするとどうなるでしょうか｡

85
00:08:08,020 --> 00:08:20,890
‫ここでは､ 2つの異なるアドレスがそれぞれプリントアウトされていることがわかります｡ これは､ メモリの2つの異なる場所に格納されている2つの異なるアクターが存在するためです｡

86
00:08:20,890 --> 00:08:25,990
‫この 2 つのアドレスの間には､ 実際には数メガバイトの差があることがわかります｡

87
00:08:25,990 --> 00:08:38,290
‫これは､ Unreal によってメモリに保存される情報量がいかに多いか､ また､ コピーを取り過ぎないように効率化することがなぜ重要であるかを物語っています｡

88
00:08:38,290 --> 00:08:39,700
‫今回の講義は以上です｡

89
00:08:39,700 --> 00:08:43,570
‫次回は､ ポインターを使ったもっと楽しいことをやるので､ またお会いしましょう｡

