先直接看示範影片吧~~

我讓Camera環繞著Unity Chan移動

 

基本上就是靠著三角函數的算法去達成的

此範例我是從上面俯瞰,所以使用X和Z軸來講解

由直角坐標(笛卡爾座標)可知四個象限其座標的正負值如下

  • 三角函數sin在一二象限為正、三四為負
  • 三角函數cos在一四象限為正、二三為負

以上兩個三角函數,剛好能滿足一~四象限的正負需求

至於兩個三角函數數值誰給x、誰給z都沒差,只是順時針逆時針的差別而已(千萬不能兩個座標軸都使用相同的三角函數,否則就變成單純的斜向來回移動)

 

 

新增一個專案,然後引入Unity Chan(或者想拿其他物件代替也可以,反正只是為了明顯看相機有在環狀移動),接著新增一個C# script

 

將unitychan和Main Camera移動到自己喜歡的位置和角度

 

接著開始編寫程式碼~


using UnityEngine;

public class CameraCircularMovement : MonoBehaviour
{
    [SerializeField]private GameObject target;//Camera要面向的物件
    [SerializeField]private float speed;//相機環繞移動的速度
    private Vector3 cameraPosition;//相機要移動的位置
    private float number;
    private float radius;//移動的半徑

    private void Start ()
    {
        //由於我這個範例是x和z軸的移動,而y軸不會改變,所以要先設定好y軸的初始位置
        cameraPosition.y = transform.position.y;
        transform.position = cameraPosition;

        //計算當前攝影機和目標物件的半徑
        radius = Vector3.Distance(target.transform.position, transform.position);
    }


    private void Update ()
    {
        //使用Time.deltaTime,使得移動時更加平滑
        //將速度進行一定比例縮放,方便控制速度(縮放多少都隨意,自己覺得數值修改方便就好)

        number += Time.deltaTime * speed * 0.1f;

        //計算並設定新的x和y軸位置
        //負數是順時針旋轉,正數是逆時針旋轉

        cameraPosition.x = radius * Mathf.Cos(-number);
        cameraPosition.z = radius * Mathf.Sin(-number);
        transform.position = cameraPosition;

        //使相機永遠面對著目標物件
        transform.LookAt(target.transform.position);
    }
}


 

然後將此腳本放到Main Camera上並設定目標和速度,按下執行後即可看到相機在環狀移動,同時面對著目標

arrow
arrow
    全站熱搜

    Yang 發表在 痞客邦 留言(0) 人氣()