【Unity】注視対象を持つカメラの座標計算

いわば、極座標系でのカメラの座標計算になるんだけど、式自体は「まぁだいたいこんな感じでやればそれっぽくなるよね」という感じで書いているので、お硬い公式を使った場合と挙動が変わるかもしれないので注意。
また、こういうのは完全に数式に則って実装してしまうとゲームの演出的に微妙になる、というのは往々にしてあることで、今回もそれを考慮して書いてます。
まぁ、誰かと議論するための記事じゃないので、実装例の一つとして見ていただければ。

さて、以下のコードによって自分はカメラの座標計算を行っています。

/// <summary>
/// 注視対象に対する自身の座標を設定する
/// </summary>
private void UpdatePosition()
{
        if (this.lookTarget == null) return;

        Vector3 position = Vector3.zero;

        float radX = Mathf.Deg2Rad * this.rotationX;
        float radY = Mathf.Deg2Rad * this.rotationY;

        float distanceZ = Mathf.Cos(radX) * this.distance;
        position.z = Mathf.Cos(radY) * this.distance;
        position.x = Mathf.Sin(radY) * this.distance;

        float distanceY = Mathf.Sin(radX) * this.distance;
        position.y = distanceY;
            
        position += this.lookTarget.transform.position;

        this.transform.position = position;
}

以上の式になります。
これの計算式を公式っぽく、書いたのが以下

RadianX = DegreeX * Mathf.Deg2Rad
RadianY = DegreeY * Mathf.Deg2Red

DistanceZ = Mathf.Cos(RadianX) * Distance
DistanceY = Mathf.Sin(RadianY) * Distance

PositionX = Mathf.Sin(RadianY) * DistanceZ
PositionZ = Mathf.Cos(RadianY) * DistanceZ
PositionY = DistanceY 

流れを説明すると、
① 注視対象をカメラの正面として、そのZ方向の距離を、X軸回転を考慮しつつ算出する。
② ①で算出した距離を元に、Y軸回転を考慮しつつ、X座標とZ座標をそれぞれ算出する。
③ Y方向の距離はX、Zに依存しないようにX軸回転量を考慮しつつ算出する。
という感じです。

また、カメラの座標の基準は絶対に注視対象を基準とするので、カメラ自身の座標を計算する時には注視対象の情報は特に必要ありません。
なので、座標を計算し終わってから、注視対象の座標を足して最終的な座標としています。

なお、一般的にこういった座標を算出する際は、X軸やZ軸方向の座標を決めるときに、Y軸は上方向を基準として計算するみたいですが、この式ではZ方向を基準としています。
別に特に理由はないのですが、コードの書きやすさとかイメージのしやすさで書いているだけですね。