2017年07月07日
【unity5】カメラ移動・回転 : ClampAngle関数の解説
前書き
今回で最後の解説編になりますね。
解説が終わったら、
全体の処理の流れを確認して終わりにします。
次からは
「プレイヤーの移動」
をやる、と言ったと思います。
......あれ、言いましたよね?
まぁそれはともかく、
解説していきますね。
スポンサードリンク
ClampAngle () : 解説
static float ClampAngle (float angle, float min, float max) {
if (angle < -360) { angle += 360; }
if (angle > 360) { angle -= 360; }
return Mathf.Clamp(angle, min, max);
}
これが、今回説明する
ソースコードになります。
まず関数から見ていきましょう。
static とあります。
これを付ける事によって、
何処からでも呼び出せるようになる、
ということだと思います。
(そうであって欲しいです…)
その次はというと……
float とありますよね?
関数なのに少数型のfloat……。
どういう事でしょうね?
少し、関数の最後の方を見て下さい。
そこに、「return」とあります。
これは値を返すという意味で、
いつもの「void」部分にはというと、
返す値の型を void の代わりに記述します。
これをしないとエラーが出ますよ。
以上の事から、
void → float になっているんですね。
ClampAngle (・・・・・・
には、処理が決まっていません。
StartやUpdateのように
呼ばれるタイミングが決まっていない、
と言うことですね。
なので、呼ばないと実行されません!
そこで、前回の未説明部分がでてきますね。
y = ClampAngle(y, yMinLimit, yMaxLimit);
これです。
ここで、呼んでますよね?
そして何やら y だとか yMinLimit だとか、
良く分からないものがあります。
これらが、引数となります。
引数が何か、というのはこちらの
引数を使ってみよう!
をご覧下さい。
話を戻しますが、
現在のカメラの角度を「y」、
それぞれ「縦の角度限界(上、下)」
これらを引数にしています。
受け取りは順に、
y = angle
MinLimit = min
MaxLimit = max
となっています。
この関数でやっている処理は、
簡単に言えば
「縦の角度が360°を超えたら
0に戻す」
というのをやっているだけです。
これをしないと、
500とか800までいきますからねー。
角度が -360 より下回れば360を足し、
360を上回れば 360 を引いています。
ただただ、それだけです。
そして、
Mathf.Clamp(値, 最小値, 最大値);
これで、最小と最大の間で値を制御出来ます。
今回ではカメラの角度が「値」の部分に
入っているので上下の限界角度として
制限できる、という訳です。
それを返して、yに代入しているんです。
ここまでで、一旦全部ですかね?
スポンサードリンク
全解説まとめ
簡単に今までやってきた部分を
解説していきます。
それでは、順に流していきましょう。
//使うシステムの宣言(?)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//クラス
public class CameraController : MonoBehaviour {
public Transform target;
public float distance = 12.0f;
public float xSpeed = 250.0f;
public float ySpeed = 120.0f;
public float yMinLimit = -45f;
public float yMaxLimit = 85f;
private float x = 0.0f;
private float y = 0.0f;
void Start () {
var angles = transform.eulerAngles;
x = angles.y;
y = angles.x;
}
void Update () {
if (target) {
x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
y = ClampAngle(y, yMinLimit, yMaxLimit);
var rotation = Quaternion.Euler(y, x, 0);
var position = rotation * new Vector3(0.0f, 0.0f, -distance) + target.position;
transform.rotation = rotation;
transform.position = position;
}
}
static float ClampAngle (float angle, float min, float max) {
if (angle < -360) { angle += 360; }
if (angle > 360) { angle -= 360; }
return Mathf.Clamp(angle, min, max);
}
}
システム宣言は、
「今からこの機能を使いますよ」
と、コンピュータに知らせます。
クラスはプログラムの設計図
みたいな存在ですね。
この中にコードを書きます。
変数宣言です。
- カメラの中心となるターゲット
- ターゲットからのカメラの距離
- カメラの横移動の速さ
- カメラの縦移動の速さ
- カメラの限界角度(上)
- カメラの限界角度(下)
- 横の入力 など
- 縦の入力 など
Start関数
初期角度として
x. y に代入しています。
Update関数
target が設定されていれば
マウス入力によって
カメラのx, y に反映
y には
上記の処理 + 上限までの制限
カメラの角度・位置を
予め作っておき、
その後にゲーム内に反映させています。
最後の関数は、
y = ・・・ の所で
実行しています。
限界角度を維持するのと、
カメラの角度が360から抜けない
ようにする為ですね。
終わりに
最後の方、結構走ってしまいましたが…。
分かって頂けたでしょうか?
分かって頂けたのなら幸いです……。
次回からは宣言通り、
「プレイヤーの移動」
をやっていきますね。
ではでは、また次回!
もう少しで夏休み……!
課題地獄です。
スポンサードリンク
【このカテゴリーの最新記事】
-
no image
-
no image
この記事へのトラックバックURL
https://fanblogs.jp/tb/6446797
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック
※ ブログに表示されるのは、主の承認が必要なので時間がかかります!
コメントに気づかない場合もありますので、返信が遅れる場合も...