1. 程式人生 > >Unity3D中攝像機跟隨方法

Unity3D中攝像機跟隨方法

using UnityEngine;
using System.Collections;
/// <summary>
/// Camera move.
/// 掛載物件:攝像機
/// 作用:攝像機跟隨人物
/// </summary>
public class CameraMove : MonoBehaviour
{
//攝像機的移動速度
public float moveSpeed = 3f;
//攝像機的旋轉速度
public  float turnSpeed = 10f;
//定義私有玩家
private Transform m_Player;
//攝像機與玩家之間的初始偏移量
private Vector3 offset;
//射線的碰撞資訊
private RaycastHit hit;
//攝像機與玩家之間的距離
private float distance;
//攝像機的觀察點
private Vector3[] currentPoints;
//通過Awake拿到自身的元件
void Awake ()
{
//通過tag找到人物元件
m_Player = GameObject.FindWithTag (TagsScript.Player).transform;
//定義一個v3型別的陣列,裡面有5個元素
currentPoints = new Vector3[5];
}
//初始化遊戲物件
void Start ()
{
//遊戲開始時攝像機與玩家之間的距離
distance = Vector3.Distance (transform.position, m_Player.position);
//攝像機指向玩家
//玩家與攝像機之間的偏移量
offset = m_Player.position - transform.position;
}


//物理引擎相關的放到FixedUpdate中
//LateUpdate可以避免卡頓
void LateUpdate ()
{
//攝像機觀察的第一個點
Vector3 startPosition = m_Player.position - offset;
//攝像機的最後一個點
Vector3 endPosition = m_Player.position + Vector3.up * distance;
//把攝像機的五個觀察點放到陣列中,並且1,2,3三個觀察點使用線性插值讓攝像機平滑移動Slerp
currentPoints [1] = Vector3.Slerp (startPosition, endPosition, 0.25f);
currentPoints [2] = Vector3.Slerp (startPosition, endPosition, 0.5f);
currentPoints [3] = Vector3.Slerp (startPosition, endPosition, 0.75f);
currentPoints [0] = startPosition;
currentPoints [4] = endPosition;
//定義一個變數用來儲存固定幀可以看到玩家的觀察點
//viewposition = currentPoints [0]
Vector3 viewposition = currentPoints [0];
//for迴圈遍歷這些點,如果找到最合適的點就把那個當前點賦值給可以看到玩家的觀察點CheckView檢測某個點能否看到玩家
for (int i = 0; i < currentPoints.Length; i++) {
//如果檢測到某個點可以看到玩家
if (CheckView (currentPoints [i])) {
//把這個當前點賦值給viewposition
viewposition = currentPoints [i];
//之後返回不在繼續遍歷
break;
}
}
//把攝像機移動到觀察點
transform.position = Vector3.Lerp (transform.position, viewposition, Time.deltaTime * moveSpeed);
//呼叫攝像機旋轉方法
SmoothRotate ();
}
/// <summary>
/// Checks the view.
/// 檢測某個點是否可以看到玩家
/// </summary>
/// <returns><c>true</c>, if view was checked, <c>false</c> otherwise.</returns>
/// <param name="pos">Position.</param>
//檢測某個點能否看到玩家的方法bool型別
bool CheckView (Vector3 pos)
{
//定義玩家與觀察點之間的方向向量
Vector3 dir = m_Player.position - pos;
//發射射線
if (Physics.Raycast (pos, dir, out hit)) {
//如果射線打到玩家
if (hit.collider.tag == TagsScript.Player) {
//返回true
return true;
}
}
//不然返回false
return false;
}
/// <summary>
/// Smooths the rotate.
/// 攝像機旋轉的方法
/// </summary>
/// 攝像機旋轉的方法
void SmoothRotate ()
{
//指向起始位置
//攝像機到玩家的向量
Vector3 m_Dir = m_Player.position - transform.position;
//要旋轉的角度
Quaternion qua = Quaternion.LookRotation (m_Dir);
transform.rotation = Quaternion.Lerp (transform.rotation, qua, Time.deltaTime * turnSpeed);
//把攝像機x,y軸鎖死
transform.eulerAngles = new Vector3 (transform.eulerAngles.x, 0, 0);

}
}

相關推薦

Unity3D攝像機跟隨方法

using UnityEngine; using System.Collections; /// <summary> /// Camera move. /// 掛載物件:攝像機 /// 作用:攝像機跟隨人物 /// </summary> public class CameraMove

unity3d使用不同方法獲得position對應的座標系統

inspector面板 通過inspector面板上獲得的transform屬性均屬於本地座標系。 注意:inspector面板上的rotation是尤拉角。 使用程式碼得到 使用transform.position系列方法得到的座標屬於世界座標系。 注意:transform

在C++呼叫Unity3D的託管方法

假設我們要呼叫一個C#中的靜態方法,如Debug.Log方法 public static void DebugCallback(int mode, string text) { UnityEngine.Debug.Log(text); } public delegate void

unity攝像機跟隨主角,攝像機穿牆,射線碰撞檢測,攝像機穿牆跟隨

這個問題,攝像機拍攝主角,當主角被牆遮蔽了視野,那麼就用正上方的點和當前相機所在位置的店為起始點和終點,從二者之間再找出三個關鍵點進行射線檢測,能看到主角的店即可作為攝像機的transform.position Vec

Unity3D UGUI攝像機跟隨主角(簡明易懂)NGUI下也可以參考使用

我在這裡寫兩個方法,一種鏡頭是跟隨主角,但不隨著主角旋轉而旋轉。另一種是鏡頭是跟隨主角,並且隨著主角旋轉而旋轉。兩個方法都會用不同的方式寫。 第一種,指令碼掛在Camera下 public class CameraFollow : MonoBehavio

unity3d平滑跟隨的功能實現!!!!

今天開始看一個js的遊戲範例,這裡結合上次學習的mathf.smooth函式功能做了點修改,同樣改寫成c#貼在這裡,說明一下這裡沒有做更多功能的封裝,適合於第三人稱的一個視角操作哈,大家喜歡可以拿去改改(地址:http://www.kuaipan.cn/file/

Unity3D2DUI跟隨場景3D物體

平面UI跟隨場景中的3D物體類似於血條的跟隨效果。 經過幾種方案的對比發現把3D物體的座標轉化為平面座標的方案是最行之有效的方法。 下面直接上程式碼 public class FollwScript

unity3d攝像機跟隨人物平滑移動的一個簡單方法

一,場景中建立一個cube,繫結一個cube的移動方法的指令碼CubeMove,程式碼如下: void Update ()     {         //使用虛擬軸移動         float h = Input.GetAxis ("Horizontal");

(轉)Unity3D移動物體位置的幾種方法

多種方式 移動 2.4 包括 簡介 調用 在外 blank targe 1. 簡介 在unity3d中,有多種方式可以改變物體的坐標,實現移動的目的,其本質是每幀修改物體的position。 2. 通過Transform組件移動物體 Transform 組件

自學Unity3D 之 貪吃蛇 添加攝像機跟隨

自學 offset 一個 sta 浮點 處理 做的 限制 unity 3d 在Unity的世界中, 物體的位置都是由向量構成的。 今天所需要做的就是讓攝像機保持跟蛇頭的相對距離。 首先 設蛇頭的位置在A 點 , 攝像機的位置在B 點 則 我們可以知道 他們的offs

Unity3D 攝像機跟隨旋轉的方案

Intro 主要想探討的是如何令攝像機隨滑鼠操作進行旋轉和移動,攝像機跟隨的指令碼官方就有Example。 方案:獨立的角度變數 主要的特點是使用獨立的角度變數,每次處理滑鼠移動操作都會建立一個新的Quaternion用於計算。 先看Demo。 public class Play

Unity3D移動物體位置的幾種方法

1. 簡介     在unity3d中,有多種方式可以改變物體的座標,實現移動的目的,其本質是每幀修改物體的position。 2. 通過Transform元件移動物體     Transform 元件用於描述物體在空間中的狀態,它包括

Unity3D攝像機跟隨物體移動的程式碼控制

攝像機跟隨物體方法一是把攝像機設定為物體Player的子物體,給Player新增移動腳步就可以攝像機跟隨Player移動。移動的簡單腳步using UnityEngine; using System.

Unity3D克隆一個現有元件的方法

如果在United中已經有一個控制元件,如下文字框:如果在程式執行過程中,希望再複製一個出來,方法如下所示:            //通過外掛名稱,找到該控制元件對應的GameObject            GameObject gameobjtxt = GameObj

Unity3D 滑塊、下拉選框、單選框的傳值方法

我們在遊戲的設定介面經常會新增一些控制遊戲內容的按鈕 以三類按鈕和設定為例:滑塊、下拉選框、單選框 分別實現遊戲中的聲音大小調節、遊戲難度選擇、是否全屏選擇,大概介面如下 沒有什麼素材,簡單傳神一下- 。- (靈魂畫師) 這些按鈕都是可以通過NGUI來直接使用的,主要說一下

Unity3D載入外部圖片的兩種方法

  各位朋友大家好,我是秦元培,歡迎大家關注我的部落格。最近在做專案的過程中遇到這樣的一個需求:玩家可以在遊戲過程中進行實時存檔,在存檔過程中會儲存當前遊戲進度,同時會擷取當前遊戲畫面並載入到遊戲存檔介面中。當下一次進入遊戲的時候,將讀取本地存檔圖片並載入到

Unity3D三種呼叫其他指令碼函式的方法

第一種,被呼叫指令碼函式為static型別,呼叫時直接用  指令碼名.函式名()。很不實用…… 第二種,GameObject.Find("指令碼所在物體名").SendMessage("函式名");  此種方法可以呼叫public和private型別函式 第三種,Ga

Unity3DAnimation的常見屬性及方法

Unity3D中Animation的常見屬性及方法如下: Animation.Play播放 function Play (mode : PlayMode = PlayMode.StopSameLayer) : bool function Play (animation : string, mode :

Unity3D通用改變Text文字顏色與還原方法

一、建立一個通用的改變文字顏色與還原指令碼using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace Globa

unity3d,數字轉換成字串的方法

ruby_cheng.name = ruby_name.ToString(); 其中ToString 就是數字轉換成字串的方法。 在網頁Js中,toString就可以。但在Unity3d中,區分大小寫的厲害~~T差一點就不行啦!!!