该功能的设计之初是为了可以通过摄像头的移动与旋转监测Unity3D中的物体。设计主要分为两个部分设计而成,第一是摄像头的移动,该部分主要使用3D object完成;第二是摄像头的移动,该部分主要使用摄像机进行完成。
实现效果:
视角跟随
设计思路:使用一个3D object作为父节点实现移动,同时摄像机作为子节点进行旋转。两个部分共同实现了视角跟随。结构如下图所示:
代码实现:该部分主要分为两个部分,第一是控制MyCamerain进行移动,第二是控制Camerin进行旋转。
MyCamerain:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float moveSpeed = 40f; // 移动速度
void Update()
{
// 获取水平和垂直输入
float horizontalInput = Input.GetAxis("Horizontal");
float verticalInput = Input.GetAxis("Vertical");
// 计算移动方向
Vector3 moveDirection = new Vector3(horizontalInput, 0f, verticalInput);
// 移动物体
transform.Translate(moveDirection * moveSpeed * Time.deltaTime);
}
}
Camerain:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class CameraController : MonoBehaviour
{
public Transform MyCamerain;
private float mouseX, mouseY; // 获取鼠标移动的值
public float mouseSensitivity; // 鼠标灵敏度
public float xRotation;
private bool isCursorVisible = false; // 记录鼠标指针是否可见
private void Start()
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
private void Update()
{
mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;
xRotation -= mouseY;
xRotation = Mathf.Clamp(xRotation, -70f, 70f);
// 绕 Y 轴旋转摄像头
MyCamerain.Rotate(Vector3.up * mouseX);
// 绕 X 轴旋转摄像头
transform.localRotation = Quaternion.Euler(xRotation, 0, 0);
// 处理鼠标点击事件
if (Input.GetMouseButtonDown(0)) // 0 表示左键点击
{
if (!EventSystem.current.IsPointerOverGameObject())
{
isCursorVisible = !isCursorVisible; // 切换鼠标指针可见状态
if (isCursorVisible)
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
else
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
}
}
}
}
使用步骤:先创建一个一个物体与摄像机,将起始位置都设置为同一个位置,分别将脚本挂入即可实现。其中可调移动与旋转的速度。
如有不足,欢迎交流!!!