1. 程式人生 > >Unity3D【指令碼】滑鼠對攝像機的控制

Unity3D【指令碼】滑鼠對攝像機的控制

第一次發控制攝像機旋轉程式碼是幾個月前。

好幾個月不做Unity了,突然有個小專案用到了這個指令碼,順手就把以前寫的程式碼找來用了,可看到寫的程式碼……好爛!!!重新整理了一遍。

using UnityEngine;
using System.Collections;

/**
 * 指令碼主要功能:使攝像機圍繞一個物體旋轉
 * 
 * @作者 <a target=_blank href="mailto:[email protected]">[email protected]</a>
 * @時間 2014-12-10
 */
public class MoveCameraByMouse : MonoBehaviour
{

    // 圍繞旋轉的目標物體
    public Transform target;

    // 設定旋轉角度
    public float x = 0f, y = 0f, z = 0f;
    public bool xFlag = false, yFlag = false;

    // 旋轉速度值
    public float xSpeed = 100, ySpeed = 100, mSpeed = 50;

    // y軸角度限制,設定成一樣則該軸不旋轉
    public float yMinLimit = -365, yMaxLimit = 365;

    // x軸角度限制,同上
    public float leftMax = -365, rightMax = 365;

    // 距離限制,同上
    public float distance = 3f, minDistance = 1f, maxDistance = 6f;

    // 阻尼設定
    public bool needDamping = true;
    public float damping = 3f;

    // 改變中心目標物體
    public void SetTarget(GameObject go)
    {
        target = go.transform;
    }

    // Use this for initialization
    void Start()
    {
        //Vector3 angles = transform.eulerAngles;
        //x = angles.y;
        //y = angles.x;
        pers();
    }

    /**
     * Update is called once per frame
     * 
     * 中心物體不為空,則開始執行指令碼;
     * 
     * 當有滑鼠點選事件後,改變x、y的值;
     * 當有滑鼠滾輪事件後,改變distance的值;
     * 
     * 最後,計算角度和座標等,移動攝像機到該位置
     * 
     */
    void LateUpdate()
    {
        if (target)
        {
            if (Input.GetMouseButton(1))
            {
                // 判斷是否需要反向旋轉
                if ((y > 90f && y < 270f) || (y < -90 && y > -270f))
                {
                    x -= Input.GetAxis("Mouse X") * xSpeed * 0.02f;
                } else 
                {
                    x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
                }
                y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;

                x = ClampAngle(x, leftMax, rightMax);
                y = ClampAngle(y, yMinLimit, yMaxLimit);
            }

            distance -= Input.GetAxis("Mouse ScrollWheel") * mSpeed;
            distance = Mathf.Clamp(distance, minDistance, maxDistance);

            Quaternion rotation = Quaternion.Euler(y, x, z);
            Vector3 disVector = new Vector3(0.0f, 0.0f, -distance);
            Vector3 position = rotation * disVector + target.position;

            // 阻尼感
            if (needDamping)
            {
                transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * damping);
                transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * damping);
            }
            else
            {
                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);
    }

    // 初始
    public void pers()
    {
        this.x = 35f;
        this.y = 35f;
    }

    // 正檢視
    public void front()
    {
        this.x = 0f;
        this.y = 0f;
    }

    // 後檢視
    public void back()
    {
        this.x = 180f;
        this.y = 0f;
    }

    // 左檢視
    public void left()
    {
        this.x = 90f;
        this.y = 0f;
    }

    // 右檢視
    public void right()
    {
        this.x = 270f;
        this.y = 0f;
    }

    // 俯檢視
    public void top()
    {
        this.x = 0f;
        this.y = 90f;
    }

    // 仰檢視
    public void bottom()
    {
        this.x = 0f;
        this.y = -90f;
    }

}

相關推薦

Unity3D指令碼滑鼠攝像機控制

第一次發控制攝像機旋轉程式碼是幾個月前。 好幾個月不做Unity了,突然有個小專案用到了這個指令碼,順手就把以前寫的程式碼找來用了,可看到寫的程式碼……好爛!!!重新整理了一遍。 using UnityEngine; using System.Collections;

Unity3D指令碼 按鍵盤Esc彈出退出面板 確定退出遊戲 取消關閉面板

按鍵盤Esc彈出退出面板,確定退出遊戲,取消關閉面板。效果圖: 指令碼: using UnityEngine; using System.Collections; public class Exit : MonoBehaviour { public GameObj

Unity3D - API檢測滑鼠的點選與鍵盤按鍵的按下

  呼叫Input類中的GetButtonDown()或GetButtonUp()函式; 呼叫Input類中的GetKeyDown()或GetKeyUp()函式; ****************************************************

Unity 3D學習滑鼠點選控制人物移動到目標位置

一、第一種情況,不帶自動尋路功能。 Vector3 targetPoint = Vector3.zero; //滑鼠點選的位置 CharacterController controller; void Start () { targetPoint =

php面向象(一)

打電話 成員方法 駝峰命名 bject 內部 自動 正在 自己 div 1. 學習面向對象的目標:  a) 語法的學習:  b) 編程思想的學習:    i. 過程化:    ii. 面向對象:2. 比較(有對象和沒對象的區別)  a) 沒對象:    i. 我餓了 自己

php面向象(五)

row 操作類 面向對象 ssa getline var pre span 錯誤信息 一、 類型約束:  a) 約束函數可傳入的參數類型二、 類的遍歷  a) Foreach  b) 可以將類當中的所有成員屬性遍歷出來三、 關於操作類與對象的一些函數:  a) 判斷函數  

php面向象(三)

lamp1 變量 步驟 efi 第一個 面向對象 我們 ati 單例 知識點關鍵詞:FSCICATS一、 f => final:  a) 是一個修飾符,用來修飾類和成員方法  b) 使用final修飾符修飾的類不能被繼承,使用final修飾符修飾的成員方法,不能被重寫

原創Python 象創建過程中元類, __new__, __call__, __init__ 的處理

diff regular luci 自定義 weight ica 一般來說 att ray 原始type: type是最原始的元類,其__call__方法是在你使用" t_class = type(classname_string, base_classes_tuple,

IEIEline-height 失效的的解決方案

microsoft san htm round ffffff eight overflow 解決方案 ack 微軟的IE9 + Extjs3.1 確實頭疼。在使用了line-height:20px 的Tree的樣式,可是一直沒有生效, 以下給出3中解決方式: 方案1、

Python面向象--類的特殊成員方法

運行 turn 中一 new 返回值 析構 school pytho comm 類的特殊成員方法 1. __doc__  表示類的描述信息 class Func(object): ‘‘‘__doc__方法是用來打印類的描述信息‘‘‘ def te

BZOJ4675遊戲 樹分治+期望

三人 hellip 小數 tro 統計 int 多少 microsoft 題解 【BZOJ4675】點對遊戲 Description 桑尼、露娜和斯塔在玩點對遊戲,這個遊戲在一棵節點數為n的樹上進行。 桑尼、露娜和斯塔三人輪流從樹上所有未被占有的節點中選取一點,歸

HTML瀏覽器內核控制meta name="renderer" 說明文檔

ica code 功能 head 建議 ans idt rda adc 背景介紹 由於眾所周知的情況,國內的主流瀏覽器都是雙核瀏覽器:基於Webkit內核用於常用網站的高速瀏覽。基於IE的內核用於兼容網銀、舊版網站。以360的幾款瀏覽器為例,我們優先通過Webkit

LoadRunner如何GIS服務器進行性能測試

scrip open admin 空間查詢 ror reg 集群 測試經驗 orm 1、需求了解   首先確定對gis服務器壓測的測試範圍,形成具體的測試用例,gis平臺都是通過網頁端的javascript api調用的gis集群服務接口,通過LR錄制上一步中的業務操作,找

Python心得基礎篇7面向象相關

相關 sin 輸入 foo exc 其他 span iss input 其他相關 一、isinstance(obj, cls) 檢查是否obj是否是類 cls 的對象 1 class Foo(object): 2 pass 3 4 obj = Foo() 5

轉載面向象編程

經驗 同時 引用 getname 內存 idt wid 又一 構造 原文鏈接:https://blog.csdn.net/sunshine940326/article/details/72872386 什麽是面向對象編程 面向對象的思想主要是以對象為主,將一個問題抽象出具體

Fragment用戶可見的判斷實踐,親測有效

有一個 跳轉 orm from defaults 才會 over als class 概述 相信很多使用過 Fragment 的朋友都對判斷 Fragment 是否對用戶可見有此疑問,網上有很多文章也介紹得比較片面,只覆蓋到了其中一種情況。我在項目中也有遇到這樣的

模板.bat

evel txt data mil goto 數據 c++ clas RR 對拍是個很有用的東西,比如在驗證貪心策略是否正確時,可以寫上個暴力然後和貪心程序對拍上幾個小時. 在c++裏用system寫對拍總是會出現一些莫名其妙的問題.. 比如my.out明明是1 fc的時候

心得面向象_1

等於 str 復制 內存 靜態全局變量 失效 變量 成員函數 鏈接錯誤 構造函數 類自帶兩種構造函數:拷貝構造函數與無參構造函數。 類有3種構造函數:一般構造函數,復制構造函數,轉換構造函數。 自己寫的任何一個構造函數都會讓類自帶的對應種類的構造函數失效。 構造函數的其他

python入門指南:控制語句

pan else pre 循環 clas python continue break for 條件控制 if,if-else,if-elseif-else #!/bin/python a = ‘test‘ if a == ‘test‘: print

181028VC++ 遠端桌面控制、抓圖原始碼

vc++ 編寫的一套遠端桌面控制、抓圖源程式。主程式分為服務端和客戶端,測試前請先執行服務端,當客戶端啟動後,可以抓取遠端主機的桌面資訊,當然也可以是當前視窗的資訊。源程式在vc++6.0下順利編譯。程式有一個需要完善的地方就是,客戶端的截圖視窗不能最小化或支援快捷鍵,當抓圖的時候會連同客戶端一