1. 程式人生 > >Unity的攝像機拉近拉遠和旋轉指令碼實現

Unity的攝像機拉近拉遠和旋轉指令碼實現

攝像機是Unity3d裡面一定要用到的。所以熟悉攝像機的使用也是能掌握unity3d的基礎。

這裡詳細介紹一個攝像機指令碼,指令碼的功能類似與魔獸爭霸的滑鼠滾輪拉近拉遠以及按住右鍵移動滑鼠旋轉視野。

涉及到部分Unity部分原生函式,所以很多時候,想實現的功能也許在原生函式就已經有了。只是還不知道不會想到取用。

學習Unity很重要的是把Unity的基礎知識掌握好,以後進階時會覺得自己遊刃有餘。

寫這篇文章方便以後用到。

下面是程式碼:

using UnityEngine;
using System.Collections;



    public class FollowPlayer : MonoBehaviour
    {
        private Vector3 offsetPosition;//位置偏移
        private Transform player;
        public float distance = 0;
        public float scrollspeed = 10;//滑鼠滾輪拉近拉遠的速度
        private bool isRotating = false;
        public float rotateSpeed = 2F;//攝像機繞著角色旋轉時的旋轉速度



        // Use this for initialization
        void Start()
        {
            player = GameObject.FindGameObjectWithTag("Player").transform;
            transform.LookAt(player);
            offsetPosition = transform.position - player.position;
        }

        // Update is called once per frame
        void Update()
        {
            transform.position = offsetPosition + player.position;

            //處理視野的旋轉
            RotateView();
            //處理視野的拉近和拉遠效果
            ScrollView();//這裡的RotateView呼叫要放在SCrollView()前面,如果要放置在後面,則ScrollSpeed要設定很大,因為ScrollView和RotateView都在Update函式中,相對於一幀的時間,這兩個函式的執行時間間隔小很多,在SCrollView的重置offsetPosition語句offsetPosition = offsetPosition.normalized * distance;執行後,很快就輪到RotateView的offsetPosition = transform.position - player.position,這句話取消了ScrollView的效果,使得我們有效的滑鼠滑輪滑動時間變得很短,所以如果要將函式ScrollView放前面,則將ScrollSpeed設定很大。



        }


        void ScrollView()
        {
            //滑輪向前滑動(用於拉近視野)返回正值,向後滑動(用於拉遠視野)返回負值
            distance = offsetPosition.magnitude;
            distance -= Input.GetAxis("Mouse ScrollWheel") * scrollspeed;
            distance = Mathf.Clamp(distance, 5, 18);//Clamp函式控制distance的距離在5到18之間
            offsetPosition = offsetPosition.normalized * distance;
        }


        void RotateView()
        {
            //Input.GetAxis("Mouse X");//得到滑鼠在水平方向的滑動,向左時返回負數,向右返回正數
            //Input.GetAxis("Mouse Y");//得到滑鼠在垂直方向的滑動,向下時返回負數,向上返回正數


            if (Input.GetMouseButtonDown(1))//你需要在Update方法中呼叫這個方法,此後每一幀重置狀態時,它將不會返回true除非使用者釋放這個滑鼠按鈕然後重 	//新按下它。按鈕值設定為 0對應左鍵 , 1對應右鍵 , 2對應中鍵。
            {
                isRotating = true;
            }
            if (Input.GetMouseButtonUp(1))
            {
                isRotating = false;
            }


            if (isRotating)
            {                           //某位置           //某軸            //旋轉度數
                transform.RotateAround(player.position, transform.up, rotateSpeed * Input.GetAxis("Mouse X"));//簡單的說,在世界座標的某位置的某軸按照旋轉度數旋轉呼叫這個函式的物體。
                Vector3 originalPos = transform.position; Quaternion originalRotation = transform.rotation;
                transform.RotateAround(player.position, transform.right, -rotateSpeed * Input.GetAxis("Mouse Y"));//影響本物體transform的屬性有兩個,一個是position 一個是rotation
                float x = transform.eulerAngles.x;
                if (x < 10 || x > 80)//垂直方向角度限制:不論怎麼旋轉都限制在10到80度之間
                {
                    transform.position = originalPos;
                    transform.rotation = originalRotation;
                } x = Mathf.Clamp(x, 10, 80);//限制x的值在10和80之間, 如果x小於10,返回10。 如果x大於80,返回80,否則返回value 
               transform.eulerAngles = new Vector3(x, transform.eulerAngles.y, transform.eulerAngles.z);//測試過之後發現上面兩句的沒什麼影響,可能是因為有了下面transform.LookAt(player);這句的存在
            }
            offsetPosition = transform.position - player.position;//因為旋轉後相對位置變了,要保持相對位置,原來的offsetposition已經不適用
            transform.LookAt(player);//保證不論怎麼旋轉都是角色在攝像機視野的正中心,如果去掉則會出現角色不在正中心的現象
        }
    }


 transform.RotateAround(player.position, transform.right, -rotateSpeed * Input.GetAxis("Mouse Y"));

這裡第二個引數設定為transform.right要注意一下,而不是設定成目標物體的transform.right,如果不懂就設定目標物體的transform.right,對比一下你就明白了。

但是

transform.RotateAround(player.position, transform.up, rotateSpeed * Input.GetAxis("Mouse X"));

這句話也能完美執行我就不是很懂了

最後,將指令碼拖到攝像機,根據程式碼,將要關注的物體的Tag設定為"Player"就可以了

相關推薦

Unity攝像機拉近旋轉指令碼實現

攝像機是Unity3d裡面一定要用到的。所以熟悉攝像機的使用也是能掌握unity3d的基礎。 這裡詳細介紹一個攝像機指令碼,指令碼的功能類似與魔獸爭霸的滑鼠滾輪拉近拉遠以及按住右鍵移動滑鼠旋轉視野。 涉及到部分Unity部分原生函式,所以很多時候,想實現的功能也許在原生

Unity 實現簡單的相機跟隨滑鼠滾輪拉近視野

1.指令碼掛載在Main Camera 上 ,相機跟隨的實現主要是讓相機的位置和玩家的位置的差值始終保持不變。2.實現滑鼠滾輪拉近拉遠視野,要先測試一下自己滑鼠滾輪前滑後滑的正負值,每個滑鼠不一定相同。using System.Collections; using Syste

unity實現鏡頭拉近的方式

首先獲取相機物件: //camera = GetComponent<Camera>(); //指令碼在相機物件上 //GameObject.FindWithTag("MainCamera") //根據Tag查詢 //主相機

Unity攝像機 向指定位置移動旋轉 C#指令碼

using UnityEngine; using System.Collections; public class CameraCtrl : MonoBehaviour {float frameCount = 50.0f; // 希望多少幀內完成場景轉移// 目標位置:寫死

Unity3D——學習分享(十三)滑鼠滾輪控制視野拉近效果

通過滑鼠的滾輪控制攝像機視野的拉近拉遠效果 遊戲中常常見到視野的拉近拉遠效果,比如英雄聯盟中就可以通過滑鼠滾輪進行視野的拉近與拉遠,同時你也會發現在視野進行拉近拉遠到一定程度時,在進行操作就不起作用了,因為視野的拉近拉遠有一定的限制範圍。所以今天分享一個攝像機視野拉近拉遠的程式碼。

關於持續整合打包平臺的Jenkins配置構建指令碼實現細節

在《使用Jenkins搭建iOS/Android持續整合打包平臺》一文中,我對如何使用Jenkins搭建iOS/Android持續整合打包平臺的基礎概念和實施流程進行了介紹。本文作為配套,對搭建持續整合打包平臺中涉及到的執行命令、構建指令碼(build.py),以及Jenkins的配置進行詳細的補充說明。

Windows下通過bat批處理檔案vbs指令碼實現守護程序

set _task=ISMClient.exeset _svr=C:\ISMClient\ISMClient.exeset _des=start1.bat :checkstartSET status=1 (TASKLIST|FIND /I "%_task%"||SET status=0) 2>nul 1

Unity攝像機跟隨 Touch遮蔽UI 觸控控制攝像機旋轉,手勢控制放大縮小 穿牆拉近攝像機

using UnityEngine; using System.Collections; using UnityEngine.EventSystems; using UnityEngine.UI; using UnityEngine.PostProcessing; using

鏡頭變換01_U3D_讓camera上下左右移動拉近

void ScrollScens()//螢幕拉遠拉近 { if ( Mathf.Abs( Input.GetAxis("Mouse ScrollWheel"))>0.01f) { f

Unity攝像機旋轉位移跟隨

public Transform target; public float distance ; public float targetHeight; private float x = 0.0f; private float y = 0.0

Unity釋出安卓進行模型縮放旋轉

using UnityEngine; using System.Collections; public class ScaleAndRotate : MonoBehaviour {     private Touch oldTouch1;  //上次觸控點1(手指1)  

Eigen實現角、四元數旋轉矩陣之間的變換

include相應的標頭檔案 #include <Eigen/Geometry> 旋轉矩陣和旋轉向量的表示和宣告及旋轉 // 3D 旋轉矩陣直接使用 Matrix3d 或 Matrix3f Eigen::Matrix3d rotation_matrix = Eige

Unity 移動 旋轉 [小結]

移動:   Position: 直接修改位置資料     關鍵詞 函式 說明   Position   Tra

java指令碼實現文字框的資料交換

{                                   if(va.value==<%=a%>)                                      str=' <input name="cnum" type="text" id="cnum" value

Unity技巧】四元數(Quaternion)旋轉

四元數介紹旋轉,應該是三種座標變換——縮放、旋轉和平移,中最複雜的一種了。大家應該都聽過,有一種旋轉的表示方法叫四元數。按照我們的習慣,我們更加熟悉的是另外兩種旋轉的表示方法——矩陣旋轉和尤拉旋轉。矩陣

攝像機標定學習筆記(7)關於旋轉矩陣旋轉向量的關係

攝像機標定中的外部引數矩陣,是由旋轉矩陣和平移矩陣構成的,旋轉矩陣是一個3×3的正交矩陣,有3個自由度。處理旋轉矩陣的問題時,通常採用旋轉矩陣的方式來描述,也可以用旋轉向量來表示,兩者之間可以通過羅德

Unity用鍵盤控制物體左右旋轉前後移動的c#指令碼

using System.Collections; using System.Collections.Generic; using UnityEngine; public class CubeScript : MonoBehaviour {void Start () {}v

unity中控制主角的移動旋轉

void Update () {         float h = Input.GetAxis("Horizontal");         float v = Input.GetAxis("Vertical");         rigBody.MovePosition(this.transform.p

unity攝像機環繞物體旋轉

最近做專案的時候遇到一個需求:需要環視某物體做360度展示 開始一直糾結,最終找到一個簡單的解決方法 實現原理: 把攝像機作為一個空物體的子物件,空物體自旋,攝像機也會旋轉,並且視角一直註釋著物體 具體實現: 要環視的物體 新建一個空物件

andbase框架實現載入,下重新整理自定義旋轉動畫的方式

1、今天做列表時,需求上需要做一個下拉重新整理,下拉載入更多的功能,就上網找了一些例子,由於我原來用的就是andbase框架,就還是用它原來寫的了。其中同事給我推薦另一個框架BGARefreshLayout-Android,下載地址https://github.com/bin