記事ディレクトリ
実行結果
カメラ操作による効果は以下の通りです。
プレイヤーキャラクター
まず利用可能なプレイヤー キャラクターを作成し、動作ロジックを作成します。Unity ストアで購入したリソースを使用する場合は、[ウィンドウ] メニュー バー > [パッケージ マネージャー] オプションをクリックして、以下に示すように [パッケージ マネージャー] ウィンドウを開き、ダウンロードします。必要なリソース。
脚本
FollowCamera という名前の新しいスクリプトを作成し、そのスクリプトをカメラにマウントします。
分野
作成したい追従カメラにはスムーズな動きの機能があるため、追従オブジェクトを表すフィールドとカメラの動きの滑らかさを表すフィールドの 2 つのフィールドを作成する必要があります。
カメラが追跡するターゲット オブジェクトを指定するために使用される Transform クラス変数 target を宣言します。エディターでターゲット オブジェクトを変数に割り当てることができるように、public として宣言する必要があることに注意してください。
フォローの滑らかさを指定するために使用される float 型の変数ダンピングを宣言します。値が大きいほど、フォローは滑らかになります。デフォルト値は 1 です。
public Transform target; // 跟随的目标物体
public float damping = 1; // 跟随的平滑程度
論理に従う
各フレームの最後に呼び出される LateUpdate() メソッドに次のロジック コードを実装します。
private void LateUpdate()
{
}
LateUpdate() メソッドでは、まず対象オブジェクトが存在するかどうか (対象変数に代入されているかどうか) を確認し、対象オブジェクトが存在しない場合は、エラーの報告を避けるために操作は実行されません。
if (target != null)
{
}
次に、カメラが移動するベクトルを計算します。
// 计算目标位置在屏幕上的坐标
Vector3 targetPosition = Camera.main.WorldToViewportPoint(target.position);
// 计算摄像机应该移动的向量
Vector3 delta = target.position - Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, targetPosition.z));
まず、Camera.main.WorldToViewportPoint() メソッドを使用して、ターゲット オブジェクトの位置をビューポート座標 (カメラの画面ビュー スケールを基準としたもの) に変換します。
そして、デルタベクトルを計算することにより、ビューポート座標系における対象オブジェクトの中心位置と画面の中心位置とのオフセットが求められる。Camera.main.ViewportToWorldPoint() メソッドを使用して、オフセットをワールド座標系のオフセットに変換します。
次に目標位置を計算してカメラを移動します。
// 计算摄像机的目标位置
Vector3 destination = transform.position + delta;
// 使用平滑阻尼移动摄像机
transform.position = Vector3.Lerp(transform.position, destination, damping * Time.deltaTime);
計算されたカメラのターゲット位置に基づいて、Vector3.Lerp() メソッドを使用して、滑らかな減衰方法でカメラをターゲット位置に移動します。
これでスクリプトが作成されました。カメラが対象物をスムーズに追従し、対象物をカメラの中心に保つことができます。ダンピング変数の値を調整することで、以下の滑らかさを制御することもできます。
完全なコード
using UnityEngine;
public class FollowCamera: MonoBehaviour
{
public Transform target; // 跟随的目标物体
public float damping = 1; // 跟随的平滑程度
private void LateUpdate()
{
if (target != null)
{
// 计算目标位置在屏幕上的坐标
Vector3 targetPosition = Camera.main.WorldToViewportPoint(target.position);
// 计算摄像机应该移动的向量
Vector3 delta = target.position - Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, targetPosition.z));
// 计算摄像机的目标位置
Vector3 destination = transform.position + delta;
// 使用平滑阻尼移动摄像机
transform.position = Vector3.Lerp(transform.position, destination, damping * Time.deltaTime);
}
}
}