どうも、チャーさんです。
あなたはunityでカメラの追従をさせたい、
こう思ってませんか?
この記事ではオブジェクトをカメラで追従させる、
(カメラが追いかけてくれる)をできるようにする、
コードを説明してます。
なので、この記事の通りにやれば、
あなたもunityでカメラの追従ができるようになります。
またコードを単純に写すのでもいいですが、
カメラ追従の記述の仕組みも説明してるので、
コードの仕組みを知りたい場合も合わせて読んでみてください。
Unityでカメラを追従させる方法の動画バージョンはこちら
unityでカメラを追従させるコードと方法
で早速ですが、結論からいいます。
unityでカメラの追従をしたいなら、
カメラにスクリプトをつけて、
以下の記述を書けばOKです。
(*スクリプトはc#です)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class followCamera : MonoBehaviour {
public Transform target;
public Vector3 offset;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
transform.position = target.position + offset;
}
}
そして、カメラを選択しインスペクタの画面の
この下から3番目のTargetのNoneのとこに、
あなたがカメラで追従したいオブジェクトを、
ヒエラルキーからドラッグ&ドロップしましょう。
ちなみにこれをする理由は記述だけ書いても、
この上の作業をしないとカメラで追従してくれないからです。
で、これだけでカメラは追従してくれるのですが、
ここからはなぜ上記の記述にすれば追従してくれるのか、
コードの仕組みを1から詳しく説明します。
unityでカメラで追従させるコードの理論の説明
それでは説明に入ります。
カメラで追従するターゲットの位置情報が必要
まずカメラで追従するには、
追従するターゲットの位置情報が必要になります。
(追従するターゲットの位置情報がないと
カメラはどこに行けばいいか、
わからなくなりますよね)
なので、ターゲットの位置情報を格納する、
変数が必要になるのです。
位置情報の取得のために変数を用意
でその位置情報の役割を果たすのが最初に宣言してる、
public Transform target;
になります。
これを使うことで、追従したいターゲットの
位置情報がゲットできるわけです。
ちなみに少し補足ですが、
Transformというデータ型は、
オブジェクトの位置情報を代入します。
(オブジェクトが動いてもその動いた位置の位置情報を代入)
そしてオブジェクトはプレイヤーとかを想定すると、
確実に動き回るので、Transformのデータ型で、
その位置情報を取得するわけです。
カメラの追従にはカメラの位置を動かす記述が必要
で、話を戻しまして追従したいターゲットの位置情報が、
手に入ったのはokですが、
次はカメラに移動を指示しないと行けません。
なぜならオブジェクトが動いたと同時に、
カメラも移動してくれなければ、
追従できませんよね。
なのでカメラ(というオブジェクト)の、
位置を変える記述が必要になるわけです。
そしてそのためのコードが、
void Update () {
transform.position = target.position;
}
の、transform.position = target.position;
の部分になるわけです。
で transform.position という記述は、
位置情報を変えるという指示になります。
これをカメラにつけてるスクリプトに書くので、
カメラを移動させ追従させれるわけです。
カメラの追従先情報を指定する
とはいえ、この記述でカメラの位置を変えると言っても、
どの場所に?移動させるのか?となりますよね。
それも記述してあげないといけません。
で、それを示すのが、
= target.position; (ターゲットの位置に)
になるわけです。
targetには最初の変数宣言で、
追従したいターゲット(オブジェクト)の、
位置情報が入ります。
で、そのtargetのposition(位置)と指定してやることで、
カメラが常にtarget(追従したいターゲット)の位置まで、
動くわけです。
transform.position = target.position;
位置情報更新 ターゲットの位置に
という指示を出してるわけですね。
update関数の中に書く必要がある
でカメラで追従するためには、
フレーム毎に常に位置情報を更新する必要があります。
なぜならターゲットとするオブジェクトが、
動いた場合、カメラも合わせて位置情報を動かす必要が、
あるからです。
そのため以下のUpdateの関数の中に、
処理を入れることで、常にカメラがターゲットを、
追従してくれるわけです。
void Update () {
transform.position = target.position;
}
Updateはフレームが更新される毎に、
{}中括弧の中の処理を行う。
と言う関数です。
ちなみにフレームとはパラパラ漫画の感じで、
1枚1枚画面が高速で動いてる感じです。
で、これで完成かと思いきや、
そうでもありません。
確かにここまでのコードでちゃんと
カメラで追従してくれます。
しかし、この記述ですと、
ターゲットにしてるオブジェクトのど真ん中に
居座り、1人称視点のようなカメラの追従になります。
3人称視点でカメラを追従させるために
なので、少し後ろからターゲットをみて、
追いかけたい(3人称視点のような)場合、
カメラとターゲットの間に距離をあけてやる必要があります。
で、その距離をあけるためには、
x、y、zそれぞれにどれだけの値をたすか(距離をとる)
という情報が必要になります。
で、それを取得するために、
public Vector3 offset;
をかくわけです。
Vector3というデータ型は、x、y、z、
それぞれの数値を変数に代入できます。
なのでこの記述でoffsetという変数に、
x,y,zの値を代入しておけば、
その分だけターゲットから距離をとれると言うわけです。
つまり3人称視点が完成するわけです。
で、それを加味すると実際の記述が、
void Update () {
transform.position = target.position + offset;
}
}
になるわけです。
ターゲットの位置情報+距離の場所に移動せよ。
という記述ですね。
こうすることでゲームでよく見るような、
3人称型のカメラ追従をしてくれます。
(*ちなみにoffsetにはx,y,zに数値を代入する必要があります。
なのでインスペクタから入力しましょう。)
と言うわけでコードの仕組み説明を
しましたが、unityの知識がないと、
難しいですよね。
この説明が理解できなくても、
単純にスクリプトをコピペで動くので、
それをすればすぐカメラで追従できますよ!
unityでカメラで追従するまでの手順・ステップ
で、コードとコードの仕組みは説明したのですが、
一応カメラ追従までの全ての手順を載せておきます。
unityをつける
まずは当たり前ですが、
Unityを起動させましょう。
カメラとオブジェクトの用意
で次に、
カメラと追従したいオブジェクトを用意しましょう。
カメラは最初からあるので、オブジェクトですね。
オブジェクトは、
create>3D object
で作れますよ。
カメラにスクリプトをつける
で、次はカメラにスクリプトを追加しましょう。
(言語はc#です)
スクリプトを追加するにはカメラを選択した状態で、
インスペクター(デフォルトだと画面右)の下にある、
Add componentをクリックしましょう。
(この真上にあるAdd Component)
そしてその中にあるnew scriptをクリックしましょう。
スクロールすると一番下にあります。
でその後スクリプト名をつけることになりますが、
なんでもokです。
(一応補足するとわかりやすい名前がいいです)
スクリプトに記述をしよう
で待ってると、スクリプトのエディタが
立ち上がります。
macだとmono developというテキストエディターが、
たち上がるはずです。
で、立ち上がったら、
そこに記事冒頭のコードを記述しましょう。
一応再度載せます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class followCamera : MonoBehaviour {
public Transform target;
public Vector3 offset;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
transform.position = target.position + offset;
}
}
オブジェクトをドラッグ&ドロップしよう
で記述が終わったら、
メイン画面に戻って、
カメラを選択しインスペクターを見ましょう。
すると、しばし待つとAdd componentの上に、
Targetと、Offsetという項目が現れます。
このTargetのとこに、ドラッグ&ドロップで、
追従したいオブジェクトをこのNoneとなってるとこに、
画面左のヒエラルキーのとこから引っ張ってきましょう。
こうすることで、
その選んだオブジェクトの位置情報を取得できます。
(ちなみにこれをしないとカメラで追従できないので、
注意!)
offsetの値を入力しよう
さてこれでカメラの追従はされますが、
このままでは1人称視点になります。
1人称視点とはマイクラのような感じです。
なので3人称視点にするには、
offsetの値を入力しましょう。
下から2つ目のOffsetのとこです。
ここのx,y,zにそれぞれ値を入れるとその値の分だけ、
カメラの位置が変わります。
ちなみにこれは追従したいオブジェクトから、
その入力したい値の分だけ離れる。
という動きをするので、色々数字を入力して、
いいカメラの位置やアングルを見つけてみてください。
再生ボタンを押してテストしよう
で、それをしたら、
画面中央上にある再生ボタンをクリックしましょう。
そしてゲーム画面でカメラの位置が変われば成功です。
まとめ
unityでカメラの追従をしたいなら、
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class followCamera : MonoBehaviour {
public Transform target;
public Vector3 offset;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
transform.position = target.position + offset;
}
}
のコードを記述して、
targetの変数のとこに、
インスペクタでオブジェクトを代入することです。
そうすれば、ちゃんとカメラで追従してくれるので、
やってみてください。
また理論の説明もしましたが、
記述の仕組みを知りたい人向けに書いたので、
参考にしてみてください。
それでは、読んでもらってありがとうございました。
チャーさん
カメラ関連記事はこちら