
Japanese: 
このレッスンでは、カメラを移動したり
カメラにプレイヤーを追わせたりします
現在、カメラは固定されています
Camera を Player ゲームオブジェクトに
連携させる必要があります
それを行うには
Camera を Player ゲームオブジェクトの子にします
Hierarchy の Camera を
Player の上にドラッグします
簡単に言えば、親子関係は
一方通行の関係で、子を親に
連携させていると考えられます
もし親が動くと、子も動き
親に対する関係を維持します
一方、子が動いても
親は動きません
Camera を Player の子にするのは
かなり典型的な設定です
プレイヤーをエディターで動かすと
グレイの枠で示されたカメラの視界が
プレイヤーとともに動くのが
わかります

English: 
In this lesson we're going to get the
camera moving and following the player.
Currently the camera is stationary.
We need to tie the camera to
the Player game object.
We can do this by making our camera
a child of the Player game object.
Drag the Camera in the hierarchy
on to the Player.
In simply terms we can think of the parent/child
relationship as attaching the child to the parent
in a one way connection.
If the parent moves the child will move
and maintain it's relationship to the parent.
If the child moves however the
parent will not be moved.
This is a fairly typical setup with the
camera as a child of the Player.
If we move the Player in the editor
we can see that the camera's field of view
represented by the grey box,
moves with it.

Japanese: 
プレイヤーの Rotation の値を変えると
カメラも回転します
プレイモードでテストしてみましょう
プレイモードにし
再生を押すと動きます
UFO が壁にぶつかると
スピンを始め、妙な状態になります
何が起こったのでしょうか
Camera は Player の子なので
カメラそのものは動いていなくても
プレイヤーのゲームオブジェクトと連動します
プレイヤーのゲームオブジェクトが回転すると
カメラの視点もそれと一緒に回転します
これでは、私たちも、オーディエンスも疲れてしまいます
この設定は、このゲームには
適切でないのは明らかです
一般的な設定で、Camera は
Player ゲームオブジェクトの子として
常にその直接の親に対して
相対的な位置をとっています
そして、この位置は
ゲーム内での親の位置であり

English: 
If we change the Player's rotation the
camera rotates as well.
Let's test this in play mode.
We enter play mode and use the
arrow keys to move.
But when we hit the wall the UFO
begins to spin and things go a little crazy.
What's happening here?
Well, with the camera as a child of the player,
even though the camera is not moving at all
relative to the Player's game object.
The Player's game object is rotating
so the camera's point of view rotates with it.
This may make us, or our audience, queazy.
This is clearly not an ideal
setup for this particular game.
In a typical setup the camera,
as a child of the Player game object,
will always be in a position
relative to it's immediate parent,
and this position will be the parent's
position in the game,

English: 
modified or offset by any
values in the child's transform.
In our case we can't have the camera
as a child of the Player,
so let's detach it by dragging it
above the Player in the hierarchy.
Our offset value will
be the difference between the Player game object
and the camera.
Now we need to associate
the camera with the Player game object
not as a child but with a script.
With the main camera still highlighted
let's use the Add Component button
to add a new script.
And let's name the script CameraController.
If we type the name of a component in
the search box and it's not found
it will prompt us with the New Script button.
This is a shortcut which allows us to
quickly create scripts by typing their name
and clicking New Script.
Click Create and Add,

Japanese: 
子の Transform の値に
修正やオフセットを行います
ここでは
Camera を Player の子にすべきではないので
Hierarchy で Camera をPlayer の上にドラッグして
切り離します
私たちが使うオフセット値は
Player ゲームオブジェクトと camera の
差です
ここでは、子としてではなくスクリプトで
Camera をPlayer ゲームオブジェクトに
関連づける必要があります
Main camera をハイライトしたままで
Add Component ボタンを使って
新しいスクリプトを加え
スクリプト名を CameraController としましょう
検索フィールドにコンポーネント名を入れ
見つからないときは
New Script ボタンが表示されます
これでスクリプトを手早く作成できます
名前を入力して 
New Script ボタンをクリックするだけです
Create and Add をクリックするか

Japanese: 
エンターキーを押して
選択を確定します
以前にも見たように
このようにスクリプトを作成すると
Project ビューのルートか
最上レベルに作成されます
CameraController を
Script フォルダーに入れてから
開いて編集しましょう
ここでは、2 つの変数が必要です
Player を参照するパブリックなゲームオブジェクトと
オフセット値を記憶する
プライベートの vector3 です
public GameObject player と入力します
次に private vector3 offset 
Offset はプライベートです
なぜなら、このスクリプト内で
値を設定するからです
オフセット値は
Camera の現在のTransform 位置から
Player の Transform 位置を

English: 
or simply the return
or enter key to confirm our selection.
As we saw earlier,
this way of creating a script will create
that script asset on the root
or top level of our project view.
Let's put CameraController in the
Scripts folder and then
open it for editing.
We need two variables here.
A public game object reference to the Player,
and a private vector3
to hold our offset value.
Type public GameObject player.
Then type private vector3 offset.
Offset is private because
we can set that value here
in the script.
For our offset value we will
take the current transform position
of the camera and

Japanese: 
差し引き
2 者の違いを
求めます
これがoffset 値になります
それでまず offset を
Transform 位置から
Player の Transform 位置を
差し引いた値にします
Type offset = transform.position - player.transform.position　と入力します
このように入力するとき
この transform はスクリプトが
アタッチされているゲームオブジェクトの
Transform を参照しています
覚えておくといいのは
このスクリプトが camera コンポーネントと同じゲームオブジェクトに
アタッチされているということです
このスクリプトと camera コンポーネントは
同じオブジェクトにアタッチされているので
transform.position は
Camera の Transform の位置を参照します
Update で、
Camera のTransform 位置を

English: 
subtract the transform position
of the Player to find
the difference between the two.
This will be the offset value.
So in Start we can make
offset equal to our
transform position
minus the Player's transform position.
Type offset = transform.position - player.transform.position
When written like this
transform references the transform
of the game object that this
script is attached to.
It's worth noting that as this
script is attached to the same game object
as the camera component
transform.position references the
transform's position for the camera
as they are both attached
to the same game object.
In Update we'll set the
transform position of our camera

Japanese: 
Player の Transform 位置プラス
Offset に設定します
Update 内に置くため
これはすべてのフレームで起こります
transform.position = player.transform.position + offset　と入力します
つまり、キーボードで制御して 
Player を移動するので
各フレームで、カメラに写るものを
表示する前に
カメラはまるでそのオブジェクトの子であるかのように
プレイヤーと並んで
新しい位置へ移動します
ただし、ゲームボードの周りを
親オブジェクトがするように
スピンしたりはしませんが
ただし、Update はこのコードに最適ではありません
確かに Update は
すべてのフレームで実行されるため
Update でPlayer の
ゲームオブジェクトの位置を追跡し
カメラの位置を設定できます

English: 
to our Player's transform position
plus the offset.
This will happen every frame
because it's in Update.
Type transform.position = player.transform.position + offset
This means as we move our
Player with the controls on the keyboard
that each frame before
displaying what the camera can see
the camera is moved in to a
new position align with the Player object,
just as if it were a child of that
object except that it will not
be spinning around the game board
as the parent object spins.
However, Update is not the best place for this code.
It is true that Update runs
every frame and in Update
each frame we can track the
position of the Player's game object
and set the position of the camera.

Japanese: 
ただし、フォローパン、
プロシージャルアニメーション、最終ステートの取得には
LateUpdate が最適です
Update を LateUpdate に変えてみましょう
LateUpdate はUpdate と同じように
すべてのフレームで実行されますが、
Update ですべてが処理された後に
はじめて実行されます
そのため、カメラの位置を設定するときに
確実にPlayer はそのフレームで
すでに作動しています。
では、テストしてみましょう。スクリプトを保存して
Unity に戻ります
最初にPlayer ゲームオブジェクトへの参照を
作成する必要があります
Player ゲームオブジェクトをドラッグして
CameraController コンポーネントの 
Player スロットに移動します
プレイモードにします
思った通りのビヘイビアになりました
カメラは、衝突しても

English: 
However for follow cameras,
procedural animation and gathering last known states
it's best to use LateUpdate.
Let's change Update to LateUpdate.
LateUpdate runs every frame,
just like Update, but it is
guaranteed to run after all
items have been processed in Update.
So when we set the position of the camera
we know absolutely that the Player
has already moved for that frame.
So let's test this, let's save our scene
and return to Unity.
First we need to create a reference
to the Player game object by
dragging the Player game object
on to the Player slot
in the CameraController's component.
Enter play mode.
And now we get the behaviour we want.
The camera follows the UFO,

Japanese: 
スピンすることなく UFO を追います
次回は、このゲームのアイテムを
作成し配置して
基本のプレイエリアを終了させます

English: 
without rotating when we collide.
In the next assignment we'll finish the
basic play area by creating
and placing our special pickup objects.
Subtitles by the Amara.org community
