unity腳本中的camera相關(guān)代碼
Camera相關(guān)代碼共有兩個腳本,包括CameraContral和Sample_move_Camera
CameraContral全部代碼展示
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraContral : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
這是一個簡單的 Unity 腳本,名為 `CameraContral`,用于控制攝像機的行為。當前的代碼中,`Start` 方法和 `Update` 方法均為空,沒有具體的實現(xiàn)。
在 `Start` 方法中,你可以進行一次性的初始化,例如設(shè)置攝像機的初始位置、旋轉(zhuǎn)、或者獲取其他對象的引用。
在 `Update` 方法中,你可以編寫代碼以處理每一幀的邏輯。這可能包括玩家輸入的響應(yīng)、對象的移動、碰撞檢測等等。
Sample_move_Camera全部代碼展示
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class Sample_move_Camera : MonoBehaviour
{
public Camera mainCamera;
public Transform mainCamerLocation;
public float moveSpeed = 15f;
public float zoomSpeed = 5f;
private bool isDragging = false;
private Vector3 initialMousePosition;
private Vector3 initialCameraPosition;
// Start is called before the first frame update
void Start()
{
mainCamera.transform.position = mainCamerLocation.position;
mainCamera.transform.rotation = mainCamerLocation.rotation;
DOTween.Init();
}
// Update is called once per frame
void Update()
{
SampleMoveControl();
SampleScrollWheel();
MouseDragWin();
}
void SampleMoveControl()
{
if (Input.GetKey(KeyCode.W) | Input.GetKey(KeyCode.UpArrow)) //前
{
this.transform.Translate(Vector3.up * moveSpeed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.S) | Input.GetKey(KeyCode.DownArrow)) //后
{
this.transform.Translate(Vector3.up * -moveSpeed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.A) | Input.GetKey(KeyCode.LeftArrow)) //左
{
this.transform.Translate(Vector3.right * -moveSpeed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.D) | Input.GetKey(KeyCode.RightArrow)) //右
{
this.transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
}
}
void SampleScrollWheel()
{
if (mainCamera.orthographic == true)
{
mainCamera.orthographicSize -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
}
else
{
mainCamera.fieldOfView -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
}
}
void MouseDragWin()
{
if (Input.GetMouseButtonDown(2)) // 鼠標中鍵按下
{
isDragging = true;
initialMousePosition = Input.mousePosition;
initialCameraPosition = transform.position;
}
else if (Input.GetMouseButtonUp(2)) // 鼠標中鍵釋放
{
isDragging = false;
}
if (isDragging)
{
Debug.Log("is Dragging");
Vector3 currentMousePosition = Input.mousePosition;
Vector3 displacement = Camera.main.ScreenToWorldPoint(currentMousePosition)
- Camera.main.ScreenToWorldPoint(initialMousePosition);
transform.position = initialCameraPosition - displacement;
}
}
public void MoveTo (GameObject target)
{
Vector3 targetPosition = target.transform.position + new Vector3(0,2250,0);
this.transform.DOMove(targetPosition,0.25f);
}
}
上述代碼是一個用于控制相機移動和交互的 Unity 腳本。以下是對代碼邏輯的簡要說明:
1. 初始化設(shè)置:
? ?- 在 `Start` 方法中,設(shè)置主相機的位置和旋轉(zhuǎn)為預(yù)定義的 `mainCamerLocation` 的位置和旋轉(zhuǎn)。
? ?- 初始化 DoTween 插件,用于實現(xiàn)平滑的物體移動效果。
2. 輸入檢測與相機移動:
? ?- 在 `Update` 方法中,每幀檢測用戶輸入和鼠標操作,包括鍵盤上的"WASD"和箭頭鍵控制相機的前后左右移動。
? ?- 如果用戶按下鼠標中鍵(中軸滾輪),則啟用拖拽模式,記錄初始鼠標位置和相機位置,并在拖拽時更新相機位置,實現(xiàn)鼠標中鍵拖拽相機的效果。
3. 滾輪縮放:
? ?- 在 `SampleScrollWheel` 方法中,根據(jù)相機是正交還是透視投影,使用鼠標滾輪的輸入調(diào)整相機的正交大小或透視視野,實現(xiàn)縮放效果。
4. 相機移動到目標位置:
? ?- 提供一個公共方法 `MoveTo`,用于將相機移動到指定的目標對象上方一定距離,使用 DoTween 插件實現(xiàn)平滑移動。
總體而言,這個腳本允許用戶通過鍵盤控制相機的移動,通過鼠標中鍵實現(xiàn)拖拽相機的功能,并通過鼠標滾輪實現(xiàn)相機的縮放。同時,提供了一個方法可以將相機移動到指定目標的上方,提供了平滑移動效果。
重點代碼段解釋:
代碼段一?
if (Input.GetKey(KeyCode.W) | Input.GetKey(KeyCode.UpArrow)) //前
{this.transform.Translate(Vector3.up * moveSpeed * Time.deltaTime);}
問:這里的input是什么意思
答:在這段代碼中,Input.GetKey(KeyCode.W)
和 Input.GetKey(KeyCode.UpArrow)
是用于檢測鍵盤輸入的條件語句。
-
Input.GetKey(KeyCode.W)
表示檢測鍵盤上的"W"鍵是否被按下。 -
Input.GetKey(KeyCode.UpArrow)
表示檢測鍵盤上的上箭頭鍵是否被按下。
這兩個條件使用 |
運算符進行邏輯或操作,即只要其中一個條件為真,整個條件表達式就為真。所以,這段代碼的意思是:如果鍵盤上的"W"鍵或上箭頭鍵被按下,就執(zhí)行花括號中的代碼塊。
在這里,執(zhí)行的代碼是 this.transform.Translate(Vector3.up * moveSpeed * Time.deltaTime);
,它的作用是將當前對象(腳本所附著的對象)沿著世界空間的Y軸方向移動一定距離,移動的距離取決于 moveSpeed
和 Time.deltaTime
。這通常用于實現(xiàn)相機或玩家角色的上移動作。
問:input是類嗎
答:在Unity中,Input
是一個靜態(tài)類,用于處理用戶輸入。它提供了一組靜態(tài)方法和屬性,讓開發(fā)者能夠輕松地獲取用戶的鍵盤、鼠標、觸摸屏等輸入。
具體而言,Input
類包含了一系列用于檢測輸入的靜態(tài)方法,如:
-
Input.GetKey(KeyCode key)
: 檢測鍵盤上的某個按鍵是否被按下。 -
Input.GetKeyDown(KeyCode key)
: 檢測鍵盤上的某個按鍵是否剛剛被按下。 -
Input.GetKeyUp(KeyCode key)
: 檢測鍵盤上的某個按鍵是否剛剛被釋放。 -
Input.GetAxis(string axisName)
: 獲取指定軸的輸入值,通常用于處理輸入設(shè)備的軸,比如鼠標滾輪或手柄搖桿。
這些方法允許開發(fā)者在腳本中根據(jù)用戶的輸入來執(zhí)行相應(yīng)的操作,例如移動、跳躍、攻擊等。 Input
類是 Unity 引擎中用于處理輸入的核心類之一。
問:this.transform.Translate(Vector3.up * moveSpeed * Time.deltaTime);是什么
答:this.transform.Translate
是一個 Unity 中用于移動物體的方法。讓我們分解這個表達式:
-
this
: 表示當前腳本所附著的對象(即擁有這個腳本的對象)。 -
transform
: 是GameObject
類中的一個屬性,表示對象的變換組件。變換組件包含了有關(guān)對象的位置、旋轉(zhuǎn)和縮放的信息。 -
Translate(Vector3 translation)
: 是變換組件的方法,用于在當前對象的坐標系中移動物體。 -
Vector3.up
: 是一個代表世界坐標 Y 軸方向的單位向量。 -
moveSpeed
: 是移動的速度,用于確定移動的距離。 -
Time.deltaTime
: 是上一幀到當前幀的時間間隔,用于使移動在不同幀之間平滑。
所以,這行代碼的效果是在每一幀中將對象沿著 Y 軸方向移動一個距離,使其產(chǎn)生一個平滑的移動效果。
代碼段二
void SampleScrollWheel()
{
if (mainCamera.orthographic == true)
{
mainCamera.orthographicSize -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
}
else
{
mainCamera.fieldOfView -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
}
}
問:解釋以上代碼
答:代碼解釋如下
void SampleScrollWheel()
{
// 檢查主攝像機是否使用正交投影
if (mainCamera.orthographic == true)
{
// 檢查主攝像機是否使用正交投影。如果是正交投影,表示相機的投影方式是平行投影;如果為 false,則相機使用透視投影。
mainCamera.orthographicSize -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
}
else
{
// 如果是透視投影,則調(diào)整視野大小
mainCamera.fieldOfView -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
}
}
這段代碼的效果是根據(jù)鼠標滾輪的滾動來動態(tài)調(diào)整相機的正交投影大小或透視投影視野大小,從而實現(xiàn)縮放效果。
1.mainCamera.orthographic == true: 檢查主攝像機是否使用正交投影。如果是正交投影,表示相機的投影方式是平行投影;如果為 false,則相機使用透視投影。
2.如果相機使用正交投影 (orthographic == true),則通過 Input.GetAxis("Mouse ScrollWheel") 獲取鼠標滾輪的滾動值,并乘以 zoomSpeed,然后用這個值來調(diào)整正交投影的大小 (mainCamera.orthographicSize)。正交投影的大小決定了相機視口的大小。
3.如果相機使用透視投影 (orthographic == false),則同樣通過 Input.GetAxis("Mouse ScrollWheel") 獲取鼠標滾輪的滾動值,并乘以 zoomSpeed,然后用這個值來調(diào)整視野的大小 (mainCamera.fieldOfView)。視野大小影響了相機的可見范圍,即視野角度。
代碼段三
void MouseDragWin()
{
if (Input.GetMouseButtonDown(2)) // 鼠標中鍵按下
{
// 記錄拖拽開始的狀態(tài)和位置
isDragging = true;
initialMousePosition = Input.mousePosition;
initialCameraPosition = transform.position;
}
else if (Input.GetMouseButtonUp(2)) // 鼠標中鍵釋放
{
// 拖拽結(jié)束,重置拖拽狀態(tài)
isDragging = false;
}
if (isDragging)
{
// 如果正在拖拽,執(zhí)行拖拽操作
Debug.Log("is Dragging");
// 獲取當前鼠標位置
Vector3 currentMousePosition = Input.mousePosition;
// 計算鼠標位移
Vector3 displacement = Camera.main.ScreenToWorldPoint(currentMousePosition)
- Camera.main.ScreenToWorldPoint(initialMousePosition);
// 更新相機位置
transform.position = initialCameraPosition - displacement;
}
}
問:簡述上述代碼流程
答:以下是對上述代碼的簡要說明:
1.首先,檢測鼠標中鍵的按下和釋放事件,以確定是否開始或結(jié)束拖拽操作。
2.如果鼠標中鍵按下,則記錄拖拽開始的狀態(tài)和位置,并標記為正在拖拽。
3.如果鼠標中鍵釋放,則重置拖拽狀態(tài)為未拖拽。
4.如果正在拖拽,則獲取當前鼠標位置,并計算鼠標位移向量。
5.最后,根據(jù)鼠標的位移向量更新相機的位置,從而實現(xiàn)拖拽效果。
問:Debug.Log("is Dragging");
答:Debug.Log("is Dragging"); 是一個用于在 Unity 編輯器的控制臺輸出一條調(diào)試信息的語句。
???????Debug 是 Unity 引擎中的一個類,提供了一系列用于調(diào)試的方法。
? ? ? ?Log 是其中的一個方法,用于輸出日志信息。
在這行代碼中,如果鼠標中鍵被按下并且正在拖拽相機(isDragging 為 true),那么會輸出一條日志信息,內(nèi)容是 "is Dragging"。這樣做有助于在開發(fā)過程中追蹤程序的執(zhí)行流程和狀態(tài)。
在 Unity 編輯器中,你可以打開控制臺(Console)來查看這些日志信息。這對于調(diào)試程序、查找錯誤以及理解代碼執(zhí)行流程非常有用。一旦你在代碼中使用了 Debug.Log,你就可以在 Unity 編輯器中的控制臺看到相應(yīng)的輸出。
問:Vector3 currentMousePosition = Input.mousePosition;
答:Input.mousePosition是 Unity 中的一個屬性,用于獲取當前幀中鼠標的屏幕坐標位置。這個屬性返回一個 Vector3
,其中 x
和 y
分別表示鼠標在屏幕上的水平和垂直位置,而 z
通常為 0。
所以,這行代碼的作用是獲取當前幀中鼠標的屏幕坐標位置,并將其存儲在 currentMousePosition
變量中。在鼠標拖拽相機的情境下,這個坐標通常用于計算鼠標的位移,以便更新相機的位置。
問:Vector3 displacement = Camera.main.ScreenToWorldPoint(currentMousePosition) - Camera.main.ScreenToWorldPoint(initialMousePosition);
答:這行代碼的目的是計算鼠標在世界坐標中的位移。讓我逐步解釋:
Vector3 displacement = Camera.main.ScreenToWorldPoint(currentMousePosition) - Camera.main.ScreenToWorldPoint(initialMousePosition);
-
Camera.main
: 這是獲取場景中的主攝像機的快捷方式。如果場景中有多個攝像機,這可能需要根據(jù)具體情況調(diào)整。 -
ScreenToWorldPoint(Vector3 position)
: 這是一個方法,用于將屏幕坐標轉(zhuǎn)換為世界坐標。它接受一個Vector3
參數(shù),其中的x
和y
表示屏幕上的點的水平和垂直位置,而z
通常是攝像機到目標的距離。在這里,我們使用currentMousePosition
和initialMousePosition
作為輸入,分別表示鼠標當前位置和初始位置。這行代碼計算了兩個Vector3
向量之間的差值,即Camera.main.ScreenToWorldPoint(currentMousePosition)
減去Camera.main.ScreenToWorldPoint(initialMousePosition)
。這個操作的結(jié)果是一個新的Vector3
向量,表示了從初始鼠標位置到當前鼠標位置的位移向量。每個分量(x、y、z)都分別相減,得到了相應(yīng)的差值。 -
displacement
: 這是一個Vector3
變量,表示鼠標從初始位置移動到當前位置的位移。通過將當前鼠標位置的世界坐標減去初始鼠標位置的世界坐標,我們得到一個向量,該向量指示了鼠標的位移方向和大小。文章來源:http://www.zghlxwxcb.cn/news/detail-849835.html
這個 displacement
向量在拖拽相機時非常有用,因為它表示了鼠標在世界空間中的移動量,可以用來更新相機的位置,以實現(xiàn)拖拽效果。文章來源地址http://www.zghlxwxcb.cn/news/detail-849835.html
到了這里,關(guān)于unity腳本中的camera相關(guān)代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!