Unity3D实现相机跟随控制

本文实例为大家分享了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;
 }
 }
}

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

(0)

相关推荐

  • Unity实现截屏以及根据相机画面截图

    在游戏开发和软件开发中,经常需要截图的功能,分带UI的截图和不带UI的截图功能.代码如下: using System.Collections; using System.Collections.Generic; using UnityEngine; public static class ScreenShotForCamera{ public static void CaptureScreen(string _path = null) { if (_path == null) _path = "

  • Unity3D基于陀螺仪实现VR相机功能

    Unity自带陀螺仪功能,今天就利用陀螺仪实现一个VR相机功能.步骤如下: 1.打开Unity,创建一个新的C#脚本GyroController.cs,并挂在MainCamera游戏对象上,如图: 代码如下: using UnityEngine; using System.Collections; public class GyroController : MonoBehaviour { // Fields private readonly Quaternion baseIdentity = Q

  • Unity实现相机截图功能

    最近做项目的时候需要在游戏里截一张高清截图,研究了一下写成脚本,方便以后使用. 脚本可以自定义分辨率,用相机截高清截图.可以用代码动态截图,也可以在编辑模式下截图. 注意截图宽高比要正确,宽高比不正确时可能会出问题. 截图效果: 脚本: CameraCapture.cs using UnityEngine; using System.IO; /// <summary> /// 相机截图 /// <para>ZhangYu 2018-07-06</para> /// &l

  • Unity相机移动之屏幕边缘检测

    本文实例为大家分享了Unity相机移动之屏幕边缘检测的具体代码,供大家参考,具体内容如下 功能: 类似LOL 红警 相机移动方式. 鼠标移动到屏幕边缘,相机随之移动. 当然还有可以加亿一点点细节,比如鼠标指针变化,滚轮推进拉远视野,中键平移视野等.(没做). 效果图: 这里做了可视化数据(可以看到限定的屏幕距离),线框内为检测的距离. 代码: 复制脚本,直接挂载相机上就可以用. using UnityEngine; /// <summary> /// 相机边缘移动 /// </summa

  • Unity3D实现相机跟随控制

    本文实例为大家分享了Unity3D实现相机跟随控制的具体代码,供大家参考,具体内容如下 跟随算法 要实现3D摄像机的控制第一步就是先实现摄像机跟随物体移动. 要想让相机跟随物体移动,就要明白在一定角度下相机与物体的位置关系. 首先设置相机与物体之间的距离distance,相机与xz平面的角度为roll 所以根据三角关系可以求得映射在xz平面的距离d为distancecos(rool),相机高度为distancesin(roll). 如下图 现在就可以确定相机的高度了即y轴的坐标相机的y轴坐标应该

  • unity3D实现三维物体跟随鼠标

    本文实例为大家分享了unity3D实现三维物体跟随鼠标的具体代码,供大家参考,具体内容如下 效果图: 1.创建一个三维物体Cylinder圆柱体 Target 2.创建词汇表Yellow材质球 3.将材质球挂载到Target物体上 4.创建脚本MouseMove.cs MouseMove.cs代码 using UnityEngine; /* 让物体完全跟随鼠标 */ public class MouseMove : MonoBehaviour { [Header("主相机")] [To

  • Unity3D控件Easytouch控制主角移动

    本文实例为大家分享了Unity3D控件Easytouch控制主角移动的具体代码,供大家参考,具体内容如下 开发步骤: 1.导入Charactor Controller资源包: 2.导入Easy Touch 3.1.0的资源包: 3.创建一个人物模型: 4.新建一个Plane作为地板. 5.新建一个joystick,添加步骤如下图所示: 6.设置摇杆的相关属性: 注:如图中属性一定要设置好,不然的话会出现摇杆没有反应的情况!!! 7.为主角(即需要Easytouch摇杆控制移动的模型)新建一个脚本

  • Unity3D实现虚拟按钮控制人物移动效果

    本文为大家分享了Unity3D实现虚拟按钮控制人物移动的具体代码,供大家参考,具体内容如下 创建Image的UI组件,在Image下新建一个Button按钮.在Image 和Button上拖进Sprite图片 在Button按钮上挂载该脚本 using System.Collections; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class MyJoystick : Mono

  • Unity3D使用鼠标旋转缩放平移视角

    Unity使用鼠标旋转缩放平移视角,供大家参考,具体内容如下 用代码在Game界面完美实现Scene界面的操作方法. 使用方法:把脚本挂在相机上,把跟踪的target拖到脚本上. 视角跟踪的是一个空物体,当然如果你是做RPG游戏需要跟踪某一角色的视角,那就不需要中键平移功能,把空物体换成角色就行. 代码主要是分三部分功能进行实现. 1.右键拖动控制视角的旋转: 2.滚轮旋转控制视角的缩放: 3.中键拖动控制视角的平移. 右键拖动控制旋转主要是用GetAxis获得鼠标在x方向与y方向平移的距离,相

  • 详解CocosCreator游戏之鱼群算法

    前言 最近想学一下CocosCreator,于是,编辑器下载,启动. 众所周知,边写边学才是最快的学习方法,得写个Demo练练手,那么写什么呢?听说现在<墨虾探蝌>挺火的,那就抄(学习的事怎么能叫抄呢?)写一个类似的小游戏吧! (在<墨虾探蝌>中,鱼的位置固定,到达一定数量后玩家会升级,不会出现一大群鱼的情况,本项目其实和它不同,没有升级进化,是会有一大群鱼的,每条鱼也不是固定位置,而是有自己的运动逻辑,其实和另一个游戏更像,不过我不知道叫什么...) 效果展示: 正文 首先整一个

  • 微信小程序调用摄像头隐藏式拍照功能

    微信小程序最近非常火热,小编最近做了一个新项目,使用小程序开发考试系统,在使用App参加考试的时候调用摄像头抓拍用户是否作弊,在开发过程中遇到点问题,下面小编把问题描述和解决方法分享给大家,具体内容如下: 问题 今天小编遇到了这么个问题,就是在用户使用App参加考试的时候调用摄像头抓拍用户是否作弊,其实这也没什么,关键在于不能打扰用户考试,不能被用户发现什么时候抓拍的,也不能给用户查看图片,只有考完是后才能查看.这系统相当于考驾照时的上机答题部分.开始经理的要求是调用小程序外部的手机拍摄功能,这

  • Unity3D使用陀螺仪控制节点旋转

    本文实例为大家分享了Unity3D陀螺仪控制节点旋转的具体代码,供大家参考,具体内容如下 /******************************************************************** Desc: 陀螺仪对相机的逻辑类. *********************************************************************/ using System; using System.Collections; using

  • 原生JS控制多个滚动条同步跟随滚动效果

    在一些支持用 markdown 写文章的网站,后台写作页面,一般都是支持 markdown 即时预览的,也就是将整个页面分成两部分,左半部分是你输入的 markdown 文字,右半部分则即时输出对应的预览页面,例如下面就是 CSDN 后台写作页面的 markdown 即时预览效果: 本文不是阐述如何从 0 实现这种效果的(后续 很可能 会单出文章,),抛开其他,单看页面主体中左右两个容器元素,即 markdown 输入框元素和预览显示框元素 本文要探讨的是,当这两个容器元素的内容都超出了容器高度

  • Unity3D实现旋钮控制灯光效果

    本文实例为大家分享了Unity3D实现旋钮控制灯光效果的具体代码,供大家参考,具体内容如下 前言 实际上使用的是非常简单的方式,通过开启以及关闭带有灯光效果物体的渲染以模拟出的灯光切换效果. 正确方式应当为物体切换不同的Material实现效果. 所用函数 public void RotateAround(Vector3 point, Vector3 axis, float angle); //通过给定一个世界坐标.轴向以及一个角度,使物体以该角度旋转绕世界坐标点的轴向的变换 public T

随机推荐