Unity3D实现相机跟随控制

 更新时间:2020年11月3日 15:20  点击:1830

本文实例为大家分享了Unity3D实现相机跟随控制的具体代码,供大家参考,具体内容如下

跟随算法

要实现3D摄像机的控制第一步就是先实现摄像机跟随物体移动。
要想让相机跟随物体移动,就要明白在一定角度下相机与物体的位置关系。

首先设置相机与物体之间的距离distance,相机与xz平面的角度为roll
所以根据三角关系可以求得映射在xz平面的距离d为distancecos(rool),相机高度为distancesin(roll)。
如下图

现在就可以确定相机的高度了即y轴的坐标相机的y轴坐标应该为 Camera.Main.y=物体.y+height

在xz平面中,设相机与物体的距离为d(就是上面说的那个d,distance映射在xz平面的长度),相机的旋转角度为rot。根据下图可以看到,相机与物体的连线与x轴的角度为rot-180.根据三角函数,既可以得出x轴的位移为d*sin(rot) ,z轴的位移为d*cos(rot)

所以说开始的时候指定distance和rot和roll就可以实现跟随了。实现跟随的代码如下

public class CameraFollow : MonoBehaviour
{
 //距离
 public float distance = 15;
 //横向角度
 public float rot = 0;
 //纵向角度 30d度
 public float roll = 30f * Mathf.PI * 2 / 360;
 //目标物体
 public GameObject target;
 
 private void Start()
 {
 target = GameObject.Find("Black Track");
 }
 
 private void LateUpdate()
 {
 if (target == null)
  return;
 if (Camera.main == null)
  return;
  
 //目标的坐标
 Vector3 targetPos = target.transform.position;
 //用三角函数计算相机的位置
 Vector3 cameraPos;
 float d = distance * Mathf.Cos(roll);
 float height = distance * Mathf.Sin(roll);
 cameraPos.x = targetPos.x + d * Mathf.Cos(rot);
 cameraPos.z = targetPos.z + d * Mathf.Sin(rot);
 cameraPos.y = targetPos.y + height;
 Camera.main.transform.position = cameraPos;
 Camera.main.transform.LookAt(target.transform);
 }
}

在跟随的时候我们可以在要跟随的物体下放置一个子物体命名为cameraPoint使相机对准这个子物体从而方便的更改摄像机的视角。
所以在物体下添加一个cameraPoint的子物体

并且添加代码

//设置目标
 public void SetTarget(GameObject target)
 {
 if (target.transform.Find("cameraPoint") != null)
  this.target = target.transform.Find("cameraPoint").gameObject;
 else
  this.target = target;
 }

如果准的物体有名为cameraPoint的子物体,那么相机对准cameraPoint子物体。

横向与纵向旋转摄像机

当鼠标向左移动时,相机随之左转,当鼠标向右移动时,相机随之右转。
Unity的输入轴Mouse X 和 Mouse Y 代表着鼠标的移动增量,也就是说当鼠标向左移动时,Input.GetAxis(“Mouse X”)的值会增大,向右则减少。只要让旋转角度rot与Mouse X成正比关系,便能通过鼠标控制摄像机的角度。
代码如下

//横向旋转速度
public float rotSpeed=0.1f;
//横向旋转
public void Rotate()
 {
 float w = Input.GetAxis("Mouse X") * rotSpeed;
 rot -= w;
 }

同理对于纵向旋转我们需要设定一个范围 所以代码如下

//纵向旋转角度
public float maxRoll = 70f * Mathf.PI * 2 / 360;
public float minRoll = 0f * Mathf.PI * 2 / 360;
//纵向旋转速度
private float rollSpeed = 0.1f;
//纵向旋转
public void Roll()
 {
 float w = Input.GetAxis("Mouse Y") * rollSpeed;
 roll -= w;
 if (roll > maxRoll)
  roll = maxRoll;
 if (roll < minRoll)
  roll = minRoll;
 }

滚轮调节距离

通过鼠标滚轮调整相机与物体之间的距离
代码如下

//距离范围
public float maxDistance = 22f;
public float minDistance = 5f;
//距离变化速度
public float zoomSpeed = 0.2f;
//调整距离
public void Zoom()
 {
 if(Input.GetAxis("Mouse ScrollWheel") >0)
 {
  if (distance > minDistance)
  distance -= zoomSpeed;
 }
 else if (Input.GetAxis("Mouse ScrollWheel") < 0)
 {
  if (distance < maxDistance)
  distance += zoomSpeed;
 }
 }

全部代码

public class CameraFollow : MonoBehaviour
{
 //距离
 public float distance = 15;
 //横向角度
 public float rot = 0;
 //纵向角度 30d度
 public float roll = 30f * Mathf.PI * 2 / 360;
 
 //目标物体
 public GameObject target;
 
 //横向旋转速度
 public float rotSpeed=0.1f;
 
 //纵向旋转角度
 public float maxRoll = 70f * Mathf.PI * 2 / 360;
 public float minRoll = 0f * Mathf.PI * 2 / 360;
 //纵向旋转速度
 private float rollSpeed = 0.1f;
 
 //距离范围
 public float maxDistance = 22f;
 public float minDistance = 5f;
 //距离变化速度
 public float zoomSpeed = 0.2f;
 
 private void Start()
 {
 target = GameObject.Find("Black Track");
 SetTarget(target);
 }
 
 private void LateUpdate()
 {
 if (target == null)
  return;
 if (Camera.main == null)
  return;
 //横向旋转
 Rotate();
 //纵向旋转
 Roll();
 //缩放
 Zoom();
 //目标的坐标
 Vector3 targetPos = target.transform.position;
 //用三角函数计算相机的位置
 Vector3 cameraPos;
 float d = distance * Mathf.Cos(roll);
 float height = distance * Mathf.Sin(roll);
 cameraPos.x = targetPos.x + d * Mathf.Cos(rot);
 cameraPos.z = targetPos.z + d * Mathf.Sin(rot);
 cameraPos.y = targetPos.y + height;
 Camera.main.transform.position = cameraPos;
 Camera.main.transform.LookAt(target.transform);
 }
 
 //设置目标
 public void SetTarget(GameObject target)
 {
 if (target.transform.Find("cameraPoint") != null)
  this.target = target.transform.Find("cameraPoint").gameObject;
 else
  this.target = target;
 }
 
 //横向旋转
 public void Rotate()
 {
 float w = Input.GetAxis("Mouse X") * rotSpeed;
 rot -= w;
 }
 
 //纵向旋转
 public void Roll()
 {
 float w = Input.GetAxis("Mouse Y") * rollSpeed;
 roll -= w;
 if (roll > maxRoll)
  roll = maxRoll;
 if (roll < minRoll)
  roll = minRoll;
 }
 
 //调整距离
 public void Zoom()
 {
 if(Input.GetAxis("Mouse ScrollWheel") >0)
 {
  if (distance > minDistance)
  distance -= zoomSpeed;
 }
 else if (Input.GetAxis("Mouse ScrollWheel") < 0)
 {
  if (distance < maxDistance)
  distance += zoomSpeed;
 }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • Unity3D UGUI实现翻书特效

    这篇文章主要为大家详细介绍了Unity3D UGUI实现翻书特效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D使用GL实现图案解锁功能

    这篇文章主要为大家详细介绍了Unity3D使用GL实现图案解锁功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D实现飞机大战游戏(1)

    这篇文章主要为大家详细介绍了Unity3D实现飞机大战游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-03
  • Unity3D游戏开发数据持久化PlayerPrefs的用法详解

    在本篇文章里小编给大家整理了关于Unity3D游戏开发之数据持久化PlayerPrefs的使用的相关知识点内容,需要的朋友们参考下。...2020-06-25
  • Unity3D基于OnGUI实时显示FPS

    这篇文章主要介绍了Unity3D基于OnGUI实时显示FPS,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D仿写Button面板事件绑定功能

    这篇文章主要为大家详细介绍了Unity3D仿写Button面板事件绑定功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • unity3D实现三维物体跟随鼠标

    这篇文章主要为大家详细介绍了unity3D实现三维物体跟随鼠标,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • unity3d调用手机或电脑摄像头

    这个是在网上看到的,经测试可以在电脑上运行,确实调用了本地摄像头。有需要的小伙伴可以参考下。...2020-06-25
  • Unity3D Shader实现镜子效果

    这篇文章主要为大家详细介绍了Unity3D Shader实现镜子效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D实现待机状态图片循环淡入淡出

    这篇文章主要为大家详细介绍了Unity3D实现待机状态图片循环淡入淡出,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D Shader实现动态屏幕遮罩

    这篇文章主要为大家详细介绍了Unity3D Shader实现动态屏幕遮罩效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D使用UGUI开发原生虚拟摇杆

    这篇文章主要为大家详细介绍了Unity3D使用UGUI开发原生虚拟摇杆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D UGUI特效之Image高斯模糊效果

    这篇文章主要为大家详细介绍了Unity3D UGUI特效之Image高斯模糊效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D实现物体闪烁效果

    这篇文章主要为大家详细介绍了Unity3D实现物体闪烁效果,类似霓虹灯、跑马灯、LED灯效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D利用DoTween实现卡牌翻转效果

    这篇文章主要为大家详细介绍了Unity3D利用DoTween实现卡牌翻转效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D实现分页系统

    这篇文章主要为大家详细介绍了Unity3D实现分页系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D实现鼠标控制视角转动

    这篇文章主要为大家详细介绍了Unity3D实现鼠标控制视角转动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D生成一段隧道网格的方法

    这篇文章主要为大家详细介绍了Unity3D生成一段隧道网格的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-18
  • Unity3d获取系统时间

    本文通过一段代码给大家详解unity3d获取系统时间,代码简单易懂,小伙伴们快来看看吧...2020-06-25
  • Unity3D动态对象优化代码分享

    这篇文章主要介绍了Unity3D动态对象优化代码分享的相关资料,需要的朋友可以参考下...2020-06-25