Unity3D实现相机跟随控制

作者:c罗天下第一 时间:2021-09-03 08:38:01 

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

跟随算法

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

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

Unity3D实现相机跟随控制

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

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

Unity3D实现相机跟随控制

所以说开始的时候指定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的子物体

Unity3D实现相机跟随控制

并且添加代码


//设置目标
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;
}
}
}

来源:https://blog.csdn.net/qq_44512151/article/details/107102239

标签:Unity3D,相机跟随
0
投稿

猜你喜欢

  • Java实现简单猜数字小游戏

    2023-11-28 08:10:07
  • 面试中遇到的java逃逸分析问题

    2021-12-08 11:58:28
  • Java解析xml文件遇到特殊符号异常的情况(处理方案)

    2023-10-23 17:31:48
  • java抓包后对pcap文件解析示例

    2022-11-23 20:21:53
  • Java虚拟机内存结构及编码实战分享

    2023-11-29 13:47:47
  • ListView 分页加载更新实例分享

    2021-09-05 06:53:11
  • Java读取properties配置文件的8种方式汇总

    2022-05-03 17:11:34
  • My eclipse 端口占用(9360)问题解决办法

    2023-05-19 02:34:32
  • HttpsURLConnection上传文件流(实例讲解)

    2022-03-02 16:54:47
  • Spring Boot2.0中SpringWebContext找不到无法使用的解决方法

    2023-05-26 02:37:01
  • Spring Boot Actuator自定义健康检查教程

    2022-06-12 14:54:59
  • C#模式画刷HatchBrush用法实例

    2021-10-01 08:59:45
  • Java NIO实现聊天系统

    2023-08-08 08:35:36
  • 深入探讨Java多线程中的volatile变量

    2023-08-31 02:32:18
  • C#将PDF转为多种图像文件格式的方法(Png/Bmp/Emf/Tiff)

    2022-06-29 16:13:03
  • Java switch使用原理及实例解析

    2023-10-11 20:44:20
  • 详解java nio中的select和channel

    2021-08-09 19:17:39
  • Jenkins 关闭和重启详细介绍及实现

    2022-09-19 00:57:12
  • Java多线程死锁与资源限制操作

    2023-08-31 05:54:30
  • C#中抽象方法与虚拟方法的区别

    2021-10-30 07:30:15
  • asp之家 软件编程 m.aspxhome.com