Unity控制相機(jī)旋轉(zhuǎn)、移動、縮放等功能
提示: 該腳本允許你以指定的速度和角度圍繞模型進(jìn)行相機(jī)旋轉(zhuǎn),并可以控制相機(jī)的移動和縮放
操作說明
將該腳本添加到一個游戲?qū)ο笊希⑵渥鳛橹鲾z像機(jī)。
1、在Unity編輯器中,你可以在腳本的參數(shù)變量部分調(diào)整相機(jī)的速度、縮放和移動等設(shè)置。根據(jù)需求,修改各個參數(shù)的值。
2、如果需要使相機(jī)跳轉(zhuǎn)到指定的模型位置,可以使用MoveToMod(string modName)方法。在調(diào)用該方法時,傳入目標(biāo)模型的名稱作為參數(shù)。相機(jī)將會立即跳轉(zhuǎn)到該模型的位置。
3、如果想讓相機(jī)圍繞指定模型以指定速度旋轉(zhuǎn)一定角度,可以使用CameraRotate(string modName, float xAngle, float yAngle, float zAngle, float velocity, bool follow)方法。在調(diào)用該方法時,傳入目標(biāo)模型的名稱、x軸旋轉(zhuǎn)角度、y軸旋轉(zhuǎn)角度、z軸旋轉(zhuǎn)角度、旋轉(zhuǎn)速度和是否跟隨模型旋轉(zhuǎn)的參數(shù)。相機(jī)將會以指定的速度逐漸旋轉(zhuǎn)至目標(biāo)角度。
4、如果需要限制相機(jī)的移動范圍,可以根據(jù)參數(shù)變量部分的移動限制設(shè)置來調(diào)整xMaxMove、xMinMove、yMaxMove、yMinMove、zMaxMove和zMinMove的值。相機(jī)將不能超出這些范圍進(jìn)行移動。
參數(shù)變量
xSpeed和ySpeed:相機(jī)旋轉(zhuǎn)的速度。
wheelSpeed:相機(jī)縮放的速度。
xMoveSpeed和yMoveSpeed:相機(jī)移動的速度。
isUnlimitedScale:是否無限制放大,但仍受移動限制所規(guī)定的范圍影響。
distance:鏡頭與中心點之間的距離,在isUnlimitedScale為true時有效。
isCameraMovementAllowed、isCameraRotationAllowed和isCameraZoomAllowed:是否允許移動、旋轉(zhuǎn)和縮放相機(jī)。
isPositionLimitEnabled:是否開啟位置限制。
maxZoom和minZoom:縮放的最大和最小限制。
xMaxMove、xMinMove、yMaxMove、yMinMove、zMaxMove和zMinMove:移動的限制。
公共方法
MoveToMod(string modName):使相機(jī)跳轉(zhuǎn)到指定模型。
CameraRotate(string modName, float xAngle, float yAngle, float zAngle, float velocity, bool follow):使相機(jī)以指定速度圍繞指定模型旋轉(zhuǎn)一定角度。
私有方法
AnimateCameraRotation(float targetX, float targetY, float targetZ, float velocity, bool follow):執(zhí)行相機(jī)旋轉(zhuǎn)動畫的協(xié)程。
UpdateCameraPosition():更新相機(jī)的位置。
MoveCameraSideways(float mouseX):更新相機(jī)的橫向平移。
MoveCameraUpwards(float mouseY):更新相機(jī)的縱向平移。
UpdateCameraRotation():更新相機(jī)的旋轉(zhuǎn)。
UpdateCameraZoom():更新相機(jī)的縮放。
Unity回調(diào)方法
Start():在腳本開始時獲取當(dāng)前物體的Transform作為中心點物體。
Update():每幀更新相機(jī)的位置、旋轉(zhuǎn)和縮放。文章來源:http://www.zghlxwxcb.cn/news/detail-761805.html
操作:
按住鼠標(biāo)右鍵并拖動鼠標(biāo)來旋轉(zhuǎn)相機(jī)。
按住鼠標(biāo)中鍵并拖動鼠標(biāo)來移動相機(jī)。
使用鼠標(biāo)滾輪來縮放相機(jī)。
長按shift鏡頭上移
長按ctrl鏡頭下移文章來源地址http://www.zghlxwxcb.cn/news/detail-761805.html
using UnityEngine;
public class Rotation : MonoBehaviour
{
// ----- 參數(shù)變量 -----
[Header("旋轉(zhuǎn)速度")]
public float xSpeed = 125.0f;
public float ySpeed = 60.0f;
[Header("縮放速度")]
public float wheelSpeed = 50;
[Header("移動速度")]
public float xMoveSpeed = 200;
public float yMoveSpeed = 200;
[Header("是否無限制放大,但仍舊會受移動限制所規(guī)定的范圍")]
public bool isUnlimitedScale = true;
[Header("鏡頭與中心點距離,在 isUnlimitedScale 變量為 true 時有效")]
public float distance = 30;
[Header("是否允許移動相機(jī)")]
public bool isCameraMovementAllowed = true;
[Header("是否允許旋轉(zhuǎn)相機(jī)")]
public bool isCameraRotationAllowed = true;
[Header("是否允許縮放相機(jī)")]
public bool isCameraZoomAllowed = true;
[Header("是否開啟位置限制")]
public bool isPositionLimitEnabled = true;
[Header("縮放限制,最大,最小")]
public float maxZoom = 300;
public float minZoom = 8;
[Header("移動限制")]
public float xMaxMove = 94;
public float xMinMove = -94;
public float yMaxMove = 58;
public float yMinMove = 1;
public float zMaxMove = 44;
public float zMinMove = -44;
// ----- 內(nèi)部變量 -----
private Transform tanks; // 中心點物體
private Quaternion rotation; // 角度控制
// ----- 公共方法 -----
// 使相機(jī)跳轉(zhuǎn)到模型
public bool MoveToMod(string modName)
{
if (string.IsNullOrEmpty(modName))
return false;
Transform newTransform = GameObject.Find(modName)?.transform;
if (newTransform != null)
{
tanks.position = newTransform.position;
return true;
}
else
{
return false;
}
}
// 使相機(jī)以指定速度圍繞指定模型旋轉(zhuǎn)一定角度
public void CameraRotate(string modName, float xAngle, float yAngle, float zAngle, float velocity, bool follow)
{
MoveToMod(modName);
// 設(shè)置旋轉(zhuǎn)角度
float targetX = transform.eulerAngles.x + xAngle;
float targetY = transform.eulerAngles.y + yAngle;
float targetZ = transform.eulerAngles.z + zAngle;
// 開啟協(xié)程執(zhí)行動畫
StartCoroutine(AnimateCameraRotation(targetX, targetY, targetZ, velocity, follow));
}
// ----- 私有方法 -----
// 協(xié)程,執(zhí)行相機(jī)旋轉(zhuǎn)動畫
private System.Collections.IEnumerator AnimateCameraRotation(float targetX, float targetY, float targetZ, float velocity, bool follow)
{
float animationSpeed = velocity;
while (true)
{
float step = animationSpeed * Time.deltaTime;
// 逐漸旋轉(zhuǎn)至目標(biāo)角度
transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(targetX, targetY, targetZ), step);
if (follow)
tanks.rotation = transform.rotation;
yield return null;
}
}
// 更新相機(jī)的位置
private void UpdateCameraPosition()
{
if (!isCameraMovementAllowed || !Input.GetMouseButton(2))
return;
float mouseX = Input.GetAxis("Mouse X");
float mouseY = Input.GetAxis("Mouse Y");
// 橫向平移
MoveCameraSideways(mouseX);
// 縱向平移,若相機(jī)垂直地面則向前平移
MoveCameraUpwards(mouseY);
}
// 更新相機(jī)的橫向平移
private void MoveCameraSideways(float mouseX)
{
transform.Translate(Vector3.right * xMoveSpeed * Time.deltaTime * -mouseX);
tanks.Translate(Vector3.right * xMoveSpeed * Time.deltaTime * -mouseX);
}
// 更新相機(jī)的縱向平移
private void MoveCameraUpwards(float mouseY)
{
transform.Translate(Vector3.up * yMoveSpeed * Time.deltaTime * -mouseY);
tanks.Translate(Vector3.up * yMoveSpeed * Time.deltaTime * -mouseY);
}
// 更新相機(jī)的旋轉(zhuǎn)
private void UpdateCameraRotation()
{
if (!isCameraRotationAllowed || !Input.GetMouseButton(1))
return;
float mouseX = Input.GetAxis("Mouse X");
float mouseY = Input.GetAxis("Mouse Y");
// 設(shè)置橫向旋轉(zhuǎn)距離
float x = transform.eulerAngles.x + mouseY * xSpeed * 0.02f;
// 設(shè)置縱向旋轉(zhuǎn)距離
float y = transform.eulerAngles.y + mouseX * ySpeed * 0.02f;
rotation = Quaternion.Euler(y, x, transform.eulerAngles.z);
transform.rotation = rotation;
}
// 更新相機(jī)的縮放
private void UpdateCameraZoom()
{
if (!isCameraZoomAllowed)
return;
if (isUnlimitedScale)
{
float scrollDelta = Input.GetAxis("Mouse ScrollWheel");
// 方塊與相機(jī)保持相應(yīng)距離
distance += scrollDelta * wheelSpeed;
}
else
{
float scrollDelta = Input.GetAxis("Mouse ScrollWheel");
if ((scrollDelta < 0 || distance > minZoom) && (scrollDelta > 0 || distance < maxZoom) || !isPositionLimitEnabled)
{
distance += scrollDelta * wheelSpeed;
}
}
rotation = Quaternion.Euler(transform.eulerAngles.x, transform.eulerAngles.y, 0);
transform.position = rotation * new Vector3(0.0f, 0.0f, -distance) + tanks.position;
}
// ----- Unity 回調(diào)方法 -----
private void Start()
{
tanks = transform; // 使用當(dāng)前物體的 Transform,而不是尋找名為 "Main Camera" 的對象
}
private void Update()
{
UpdateCameraPosition();
UpdateCameraRotation();
UpdateCameraZoom();
}
}
到了這里,關(guān)于Unity控制相機(jī)旋轉(zhuǎn)、移動、縮放等功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!