ゾンビとUnityとUE4

ゾンビネタとUnity/UE4でのゲーム制作についてつづるブログです。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Unity キャラの正面をとらえるカメラ

※Unity 5以上では未検証。

カメラ演出でよくある、カッコイイポーズ()を決めているキャラクターを、正面から映したい場合のカメラの位置と角度の設定方法。
キモになる処理は2つ。

1. キャラが向いている方向にカメラを移動させる。
2. キャラの正面にカメラを向ける。

これさえ分かれば、カメラが下からぐいっとパンしてタイトルロゴがどーん!なことだってできるはずなんだ。

この学習用のゆにてぃプロジェクトを作るために、ゆにてぃちゃんを使ってみよう。
ついでに、テレインを使ってみよう。
ついでにスカイボックスも使ってみよう。

unitychan_front_camera.png

できた。

ゆにてぃちゃんかわいいよゆにてぃちゃん

1. 公式からゆにてぃちゃんデータを落とす(unitypackageのヤツ)。
2. New Projedt (3D)
3. Project > Assets に、ゆにてぃちゃんデータをドラッグ&ドロップ。
4. Assets > UnityChan > Prefabs > unitychan を Hierarchy にドラッグ&ドロップ。
5. Assets > UnityChan > Prefabs > Directional light for UnityChan を Hierarchy にドラッグ&ドロップ。
6. Hierarchy > unitychan > Inspector > Animator > Controller を UnityChanActionCheck に変更。
6. GameObject > Create Other > Terrain
7. Assets > Import Package > Skyboxes
8. Assets > Import Package > Terrain Assets
9. Hierarchy > Terrain > Transform > Position を X = -500 Y = 0 Z = -500 に変更。
10. Main Camera に Component > Rendering > Skybox を追加。
11. Main Camera に新規でスクリプト(NewBehaviourScript)を追加。
12. 11で追加したスクリプトに以下のコードを貼り付ける(最初のコードは全て消す)。

using UnityEngine;
public class NewBehaviourScript : MonoBehaviour {

public float distance; //ゆにてぃちゃんからカメラまでの直線距離
public float height; //地面からカメラまでの垂直方向の距離
public bool auto_rotate; //ゆにてぃちゃんを自動回転させるならtrue
public float rotate_speed; //回転スピード(マイナスを指定すると逆回転)

//ゆにてぃちゃんのポーズ切り替えで使う
private float wait = 5;
private float past = 0;
private bool state = true;

// Use this for initialization
void Start () {
//ゆにてぃちゃんの最初のポーズ
GameObject.Find("unitychan").GetComponent<Animator>().Play("WAIT03");
}

// Update is called once per frame
void Update () {
//ゆにてぃちゃんのポーズ切り替え
this.past += Time.deltaTime;
if (this.past >= this.wait) {
if (this.state) {
GameObject.Find("unitychan").GetComponent().CrossFade("WAIT02", 0.5f);
this.wait = 10;
this.state = false;
} else {
GameObject.Find("unitychan").GetComponent().CrossFade("WAIT03", 0.1f);
this.wait = 5;
this.state = true;
}
this.past = 0;
}

if (this.auto_rotate) {
//ゆにてぃちゃんが自動Y軸回転
float y = GameObject.Find("unitychan").transform.rotation.eulerAngles.y;
GameObject.Find("unitychan").transform.rotation = Quaternion.Euler(0, y + this.rotate_speed, 0);
} else {
//左か右を入力するとゆにてぃちゃんがY軸回転
float h = Input.GetAxisRaw("Horizontal") * this.rotate_speed;
GameObject.Find("unitychan").transform.Rotate(0, h, 0);
}

//カメラをゆにてぃちゃんの正面に移動して、ゆにてぃちゃんの正面を映す角度に変更
{
float face = GameObject.Find("unitychan").transform.rotation.eulerAngles.y;
float angle = 360 - face + 90;
float x = Mathf.Cos(angle * Mathf.Deg2Rad) * this.distance;
float y = Mathf.Sin(angle * Mathf.Deg2Rad) * this.distance;
Vector3 position = GameObject.Find("unitychan").transform.position;
this.transform.position = new Vector3(position.x + x, this.height, position.z + y);
this.transform.rotation = Quaternion.Euler(0, face + 180, 0);
}
}
}

※ゆにてぃちゃんロゴの処理は関係ないので除外。
※Skyboxes と Terrain Assets は Unity のインストール時に公式のパッケージをインストールする?みたいな設定があり、インストールする設定になっていれば Import Package できる。インストールしない設定にした場合は別途インストールが必要。
※Terrain と Skybox の設定は適当にやる。使い方が分からなければ公式を見たりグーグル先生に聞く。

【カメラ位置の計算】
1. カメラから見たゆにてぃちゃんの方向に角度を変換(360 - ゆにてぃちゃんの向き)。理由は不明。
2. ゆにてぃちゃんのY軸の角度が0度のとき、ゆにてぃちゃんのモデルは90度方向を向いているので、1.で変換した角度に90を足して修正。これをしないと当然のようにカメラの位置が-90度分ズれる。
3. 高校生の時に習ったサイン・コサインで位置を計算。

【カメラ角度の計算】
1. ゆにてぃちゃんが向いている方向と反対方向を向けば、カメラはゆにてぃちゃんと対面できるので、ゆにてぃちゃんのY軸の角度に180度を足す。

Game View では背景がメリーゴーランドのように回って見えるのですが、実際に回っているのはゆにてぃちゃんで、カメラが常にゆにてぃちゃんを正面から映しているので、背景が回っているように見えます。
Scene View で見るとその様子がよく分かります。

unitychan_front_camera_scene_view.png

今回作ったプロジェクトのファイル一式 ダウンロード(7z圧縮51.4M)
※メッシュやらテクスチャやらがこんもり入ってるので重いです。


ユニティちゃんライセンス

このアセットは、『ユニティちゃんライセンス』で提供されています。
このアセットをご利用される場合は、『キャラクター利用のガイドライン』も併せてご確認ください。


 
スポンサーサイト

- 0 Comments

Add your comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。