Unity中摄像机跟随
一、固定相机跟随,这种相机有一个参考对象,它会保持与该参考对象固定的位置,跟随改参考对象发生移动
public class CameraFlow : MonoBehaviour
{public Transform target;private Vector3 offset;void Start(){//设置相对偏移offset = target.position - this.transform.position;}void FixedUpdate(){this.transform.position = target.position - offset;}
}
二、固定相机跟随,带有角度旋转。这一种相机跟随是对第一种相机跟随的改进,在原有基础上面,添加了跟随角度的控制
public class CameriaTrack : MonoBehaviour
{private Vector3 offset = new Vector3(0,5,4);//相机相对于玩家的位置private Transform target;private Vector3 pos;public float speed = 2;void Start () {target = GameObject.FindGameObjectWithTag("Player").transform;}void FixedUpdate() {pos = target.position + offset;this.transform.position = Vector3.Lerp(this.transform.position, pos, speed*Time.deltaTime);//调整相机与玩家之间的距离Quaternion angel = Quaternion.LookRotation(target.position - this.transform.position);//获取旋转角度this.transform.rotation = Quaternion.Slerp(this.transform.rotation, angel, speed * Time.deltaTime);}
}
三、第三人称相机,这种相机跟随,是第三人称角度看向对象的,也就是一直看向对象的后面,如一直显示玩家的后背
public Transform target;public float distanceUp = 10f;//相机与目标的竖直高度参数public float distanceAway = 10f;//相机与目标的水平距离参数public float smooth = 2f;//位置平滑移动插值参数值public float camDepthSmooth = 20f;void Update(){// 鼠标轴控制相机的远近if ((Input.mouseScrollDelta.y < 0 && Camera.main.fieldOfView >= 3) || Input.mouseScrollDelta.y > 0 && Camera.main.fieldOfView <= 80){Camera.main.fieldOfView += Input.mouseScrollDelta.y * camDepthSmooth * Time.deltaTime;}}void LateUpdate(){//计算出相机的位置Vector3 disPos = target.position + Vector3.up * distanceUp - target.forward * distanceAway;transform.position = Vector3.Lerp(transform.position, disPos, Time.deltaTime * smooth);//相机的角度transform.LookAt(target.position);}
四、相机跟随,鼠标控制移动和缩放。相机与观察对象保持一定距离,可以通过鼠标进行上下左右旋转,通过鼠标滚轮进行放大和缩小操作
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;public class target_control : MonoBehaviour {public Transform _target;public float distance = 50.0f;public float xSpeed = 250.0f;public float ySpeed = 120.0f;public int yMinLimit = -20;public int yMaxLimit = 80;private bool orbit = false;private bool pan = false;private bool zoom = false;private float zoomValue = 0;public float orbitDampX = 0.0f;public float orbitDampY = 0.0f;float panDampX = 0.0f;float panDampY = 0.0f;public float zoomDamp = 0.0f;public float dampingTime = 0.0f;public float x = 180.0f;public float y = 0.0f;public int planFactor = 5;public float zoomFactor = 2.0f;public Vector2 distLimit;public static Quaternion _rotation;public static Vector3 _position;public static target_control _target_control;public float _z_distance;private Vector3 angles;private Vector2 oldPosition1; private Vector2 oldPosition2;public float _target_distance = 5;private float target_x;private float target_y;private Vector3 _target_pos = Vector3.zero;public bool change_distance() {distance = Mathf.Lerp(distance, _target_distance, 0.04f);Debug.Log(distance + "/" + _target_distance);updateCamera();if (Mathf.Abs(distance - _target_distance) < 0.01f)return false;return true;}public bool change_distance(float _dis){distance = Mathf.Lerp(distance, _dis, 0.004f);updateCamera();if (Mathf.Abs(distance - _dis) < 0.01f)return false;return true;}void Start(){_target_distance = distance;_z_distance = distance;angles = transform.eulerAngles;x = angles.y;y = angles.x;// Make the rigid body not change rotationif (GetComponent<Rigidbody>())GetComponent<Rigidbody>().freezeRotation = true;}// Update is called once per framevoid LateUpdate () {if (EventSystem.current.IsPointerOverGameObject()||_target ==null){return;}if (Application.platform == RuntimePlatform.IPhonePlayer){if (Input.touchCount == 1){if (Input.GetTouch(0).phase == TouchPhase.Moved){orbit = true;}else{orbit = false;}}else{orbit = false;}if (Input.touchCount > 1){if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved){var tempPosition1 = Input.GetTouch(0).position;var tempPosition2 = Input.GetTouch(1).position;if (isEnlarge(oldPosition1, oldPosition2, tempPosition1, tempPosition2)){zoomValue = 0.1f;zoom = true;}else{zoomValue = -0.1f;zoom = true;}oldPosition1 = tempPosition1;oldPosition2 = tempPosition2;}else{zoom = false;}}else{zoom = false;}} else if (Application.platform == RuntimePlatform.Android){if (Input.touchCount == 1){if (Input.GetTouch(0).phase == TouchPhase.Moved){orbit = true;}else{orbit = false;}}else{orbit = false;}if (Input.touchCount > 1){if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved){var tempPosition1 = Input.GetTouch(0).position;var tempPosition2 = Input.GetTouch(1).position;if (isEnlarge(oldPosition1, oldPosition2, tempPosition1, tempPosition2)){zoomValue = 0.1f;zoom = true;}else{zoomValue = -0.1f;zoom = true;}oldPosition1 = tempPosition1;oldPosition2 = tempPosition2;}else{zoom = false;}}else{zoom = false;}}else{if (Input.GetMouseButton(1)){orbit = true;}else{orbit = false;}if (Input.GetAxisRaw("Mouse ScrollWheel") != null){zoomValue = Input.GetAxisRaw("Mouse ScrollWheel");zoom = true;}else{zoom = false;}}if (orbit){orbitDampX = Mathf.Lerp(orbitDampX, Input.GetAxis("Mouse X"), dampingTime * Time.deltaTime);orbitDampY = Mathf.Lerp(orbitDampY, Input.GetAxis("Mouse Y"), dampingTime * Time.deltaTime);}else{orbitDampX = Mathf.Lerp(orbitDampX, 0, dampingTime * Time.deltaTime);orbitDampY = Mathf.Lerp(orbitDampY, 0, dampingTime * Time.deltaTime);}if (zoom){zoomDamp = Mathf.Lerp(zoomDamp, zoomValue, dampingTime * Time.deltaTime);}else{zoomDamp = Mathf.Lerp(zoomDamp, 0, dampingTime * Time.deltaTime);}if (!checkLerp(orbitDampX, 0) || !checkLerp(orbitDampY, 0)){doOrbit();}if (!checkLerp(zoomDamp, 0)){doZoom();}}bool isEnlarge(Vector2 oP1,Vector2 oP2 , Vector2 nP1, Vector2 nP2 ) { var leng1 =Mathf.Sqrt((oP1.x-oP2.x)*(oP1.x-oP2.x)+(oP1.y-oP2.y)*(oP1.y-oP2.y)); var leng2 =Mathf.Sqrt((nP1.x-nP2.x)*(nP1.x-nP2.x)+(nP1.y-nP2.y)*(nP1.y-nP2.y)); if(leng1<leng2) { //bigreturn true; }else { //smallreturn false; } }bool checkLerp(float a,float b){if (Mathf.Approximately(a, b)){return true;}return false;}void doOrbit(){if (_target) { x += orbitDampX * xSpeed * 0.02f;y -= orbitDampY * ySpeed * 0.02f;y = ClampAngle(y, yMinLimit, yMaxLimit);updateCamera();}}void doZoom(){distance -= zoomDamp * zoomFactor;distance = Mathf.Clamp(distance, -distLimit.x, distLimit.y);updateCamera();}void updateCamera(){var rotation = Quaternion.Euler(y, x, 0);var position = rotation * new Vector3(0.0f, 0.0f, -distance) + _target.position;transform.rotation = rotation;transform.position = position;}static float ClampAngle (float angle,float min,float max){if (angle < -360)angle += 360;if (angle > 360)angle -= 360;return Mathf.Clamp(angle, min, max);}
}
Unity中摄像机跟随相关推荐
- 【Unity】OpenCV Plus Unity 获取Unity中摄像机并调用opencv使其灰度化实例
前言 OpenCV Plus Unity 有关的教程实在是少之又少,Opencv的有很多,但是在Unity上应用的相关教程很少,比如付费的OpenCV For Unity ,就已经很少了,目前经济有限 ...
- unity中镜头跟随鼠标移动
摄像头移动 在游戏中大家的第一人称 第三人称都是靠摄像头的移动来实现的 ,现在给大家介绍一下摄像头的随着鼠标的旋转以及控制器运动的脚本 在项目中的Main Camera上添加脚本名字随便: 然后就是脚 ...
- Unity中相机跟随人物移动
方法1:将相机拖到人物的游戏对象上,也就是让相机成为角色的子物体,这样相机就会跟随角色移动 但是这样会存在问题,1.相机会随着人物的翻转而翻转,2.相机跟随人物没有缓冲效果,移动比较僵硬 方法2:代码 ...
- Unity 中摄像机跟踪的两种实现
第一种思路,让相机一直与角色保持跟踪 实现方法: 使相机与人物坐标相同 具体: 改变的是镜头的坐标,为镜头创建一个新的脚本来进行实现坐标更新 怎么样获得player参数呢? 那就声明一个变量trans ...
- Unity中摄像机围绕物体旋转的功能
当然啦其实围绕旋转的功能本身并不难: // 拖动摄像机围绕物体旋转 if (Input.GetMouseButton(1)) { ...
- unity中摄像机的控制---调整摄像机,不让他摔倒
摄像机大部分人都会控制,最明显的就是让他旋转,随着鼠标的左右上下移动而旋转,但是总是会遇到一个问题,就是转着转着就仿佛他自己摔倒了似的,其实就是它本身绕着Z轴旋转了 这样就不是我们想要的结果了 要想解 ...
- Unity中如何跟随某个物体运动浅谈
跟随某个物体(具体哪个轴/或完全跟随)运动详解 //跟随某个物体移动 使用方式: 1.如果勾选x轴就只跟随那个物体的x轴移动 2.如果勾选x和y轴就只跟随那个物体的x和y轴移动 3.如果全勾选就跟随那 ...
- unity中3dUI或者模型始终面向摄像机,跟随摄像机视角旋转丨视角跟随丨固定视角
视角跟随 本脚本为一个目标跟随 unity中3dUI或者模型始终面向摄像机,跟随摄像机视角旋转 使用方法超级简单,对于一个资深的Ctrl+cv程序极为友好 不多讲解直接上代码 代码模块 public ...
- Unity中控制摄像机跟随人物主角的移动
首先进入场景中,把摄像机挂载到人物主角的下方,先作为主角的一个子物体存在,然后新建一个脚本CameraFllow,用于控制摄像机跟随,然后把这个脚本挂载摄像机上面,打开脚本,并复制以下的代码: usi ...
最新文章
- zabbix系列之邮件告警(三)
- 关于debug.keystore文件用法以及错误处理
- php批量处理图片大小,word图片怎么批量调整大小
- 得到一个数组里面相同元素的个数
- python开发桌面软件-python适合开发桌面软件吗?
- html网页中显示乱码的问题解决
- 常用Sqlserver中的查询语句
- django.template.exceptions.TemplateDoesNotExist: rest_framework/api.html
- 2017年第八届蓝桥杯 —— 训练题目 —— 考察团组成
- 银行业数据治理之数据资产管理
- 《网站性能监测与优化》一2.4 软件服务应用网站
- 实战 RocketMQ 流量削峰,怎么能错过这一篇!
- python网络爬虫系列教程——Python+PhantomJS +Selenium组合应用
- 个人作业-2016.12.2
- Sublime中使用livereload插件实时预览html文件
- 基于 WinPcap/Npcap 网络桥接与局域网网关
- python求15 17 23 65 97的因数_Python练习题
- 核定征收的个体户,年营业额不超过120万,还需要缴纳个税吗?
- GH4199变形合金
- linux操作系统原理与应用.第2版 陈莉君 pdf
热门文章
- 请帮我查看一下2.19号邢台发往北京高铁的班次,以及各个班次的时间
- 苹果微信换行怎么打_苹果手机微信怎么加密,教你几招快速加密
- 5张图,看懂数据分析体系
- 贴片铝电容识别及型号_TDK贴片电容识别方法及命名规则
- 电脑(PC端)多开两个或多个微信
- 航空工业直升机与泰雷兹签订战略合作备忘录
- Linux运行网易云命令,因环境变量而在Ubuntu 18.04下无法启动网易云音乐的解决
- 两台 Linux 主机之间配置信任关系(以及如何解除)
- JavaScript 图表LightningChart完整指南
- 论文阅读:UER: An Open-Source Toolkit for Pre-training Models