Unity3D 相機(jī)繞著物體旋轉(zhuǎn)

最近在做虛擬仿真教學(xué),用到了相機(jī)繞著物體旋轉(zhuǎn)縮放埂材,本著省事在網(wǎng)上找到很多旋轉(zhuǎn)的腳本,都不符合這個(gè)項(xiàng)目需求恤浪,之后決定還是自己寫一個(gè)畅哑。這個(gè)腳本包含了設(shè)定刷新的角度和距離,限定旋轉(zhuǎn)角度水由,限定縮放距離等功能

//
// 清歌與濁酒
//
// 2017-3
using UnityEngine;
using System.Collections;


[AddComponentMenu("Camera-Control/CameraControl")]
public class CameraControl : MonoBehaviour
{
    public Transform target;
    public Transform targetTO;
    public Vector3 targetOffset;
    public float distance = 5.0f;
    public float maxDistance = 20;//縮放
    public float minDistance = .6f;//縮放
    public float xSpeed = 200.0f;//速度
    public float ySpeed = 200.0f;
    public int yMinLimit = -80;//限定角度
    public int yMaxLimit = 80;
    public int zoomRate = 40;
    public float zoomDampening = 5.0f;
    public float xDeg = 0.0f;//自身的角度記錄
    public float yDeg = 0.0f;//自身的角度
    public float currentDistance;//縮放記錄
    public float desiredDistance;//縮放
    private Quaternion currentRotation;
    private Quaternion desiredRotation;
    public Quaternion rotation;
    private Vector3 position;

    public float X;//初始化角度X軸
    public float Y;//初始化角度Y軸
    /// <summary>
    /// 初始化距離
    /// </summary>
    public float CameDistance;
    void Start()
    {
        Init();
        desiredDistance = CameDistance;
        yDeg = X;
        xDeg = Y;
    }
    void OnEnable()
    {
        Init();
        desiredDistance = CameDistance;
        yDeg = X;
        xDeg = Y;

    }

    public void Init()
    {
       
        if (!target)
        {
            GameObject go = new GameObject("Cam Target");
            go.transform.position = transform.position + (transform.forward * distance);
            target = go.transform;
        }

        distance = Vector3.Distance(transform.position, target.position);
        currentDistance = distance;
        desiredDistance = distance;

       
        position = transform.position;
        rotation = transform.rotation;
        currentRotation = transform.rotation;
        desiredRotation = transform.rotation;

        xDeg = Vector3.Angle(Vector3.right, transform.right);
        yDeg = Vector3.Angle(Vector3.up, transform.up);
    }


    void LateUpdate()
    {

        if (Input.GetMouseButton(1))
        {
            xDeg += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
            yDeg -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
        }
        yDeg = ClampAngle(yDeg, yMinLimit, yMaxLimit);
        // 設(shè)置相機(jī)旋轉(zhuǎn)

        desiredRotation = Quaternion.Euler(yDeg, xDeg, 0);
        currentRotation = transform.rotation;


        rotation = Quaternion.Lerp(currentRotation, desiredRotation, Time.deltaTime * zoomDampening);
        transform.rotation = rotation;



        // 影響scrollwheel變焦距離
        desiredDistance -= Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime * zoomRate * Mathf.Abs(desiredDistance);
        //變焦最小/最大
        desiredDistance = Mathf.Clamp(desiredDistance, minDistance, maxDistance);
        //平滑變焦
        currentDistance = Mathf.Lerp(currentDistance, desiredDistance, Time.deltaTime * zoomDampening);

     
        target.position = Vector3.Lerp(target.position, targetTO.position, Time.deltaTime * 5);

 
        position = target.position - (rotation * Vector3.forward * currentDistance + targetOffset);
        transform.position = position;
    }

    private 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);
    }
}

把要圍繞這哪個(gè)物體旋轉(zhuǎn)拖動到Traget和TragetTo中荠呐,大功告成!I翱汀D嗾拧!鞭盟!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末圾结,一起剝皮案震驚了整個(gè)濱河市瑰剃,隨后出現(xiàn)的幾起案子齿诉,更是在濱河造成了極大的恐慌,老刑警劉巖晌姚,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粤剧,死亡現(xiàn)場離奇詭異,居然都是意外死亡挥唠,警方通過查閱死者的電腦和手機(jī)抵恋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宝磨,“玉大人弧关,你說我怎么就攤上這事』斤保” “怎么了世囊?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窿祥。 經(jīng)常有香客問我株憾,道長,這世上最難降的妖魔是什么晒衩? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任嗤瞎,我火速辦了婚禮,結(jié)果婚禮上听系,老公的妹妹穿的比我還像新娘贝奇。我一直安慰自己,他們只是感情好靠胜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布掉瞳。 她就那樣靜靜地躺著届惋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪菠赚。 梳的紋絲不亂的頭發(fā)上脑豹,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天,我揣著相機(jī)與錄音衡查,去河邊找鬼瘩欺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拌牲,可吹牛的內(nèi)容都是我干的俱饿。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼塌忽,長吁一口氣:“原來是場噩夢啊……” “哼拍埠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起土居,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤枣购,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后擦耀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棉圈,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年眷蜓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了分瘾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,697評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吁系,死狀恐怖德召,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情汽纤,我是刑警寧澤上岗,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站冒版,受9級特大地震影響液茎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辞嗡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一捆等、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧续室,春花似錦栋烤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽买窟。三九已至,卻和暖如春薯定,著一層夾襖步出監(jiān)牢的瞬間始绍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工话侄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亏推,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓年堆,卻偏偏與公主長得像吞杭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子变丧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評論 2 350

推薦閱讀更多精彩內(nèi)容