下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选文档,供参考!在以前的仿真项目中用到了第三人称视角的移动,W、S、A、D控制角色的前后左右移动,摄像机跟随角色移动,并且摄像机做了缓冲处理。鼠标右键长按旋转控制镜头旋转,中键滑轮控制镜头拉进拉远。分为两个脚本,CharacterThirdControl挂在角色身上, CameraThirdControl挂在跟随摄像机身上。角色的标签设置为Player 。跟随摄像机为主摄像机(可以根据自己需求改变)。下面直接贴代码,代码中已有注释:using UnityEngine; using System.Collections; RequireComponent(typeof(CharacterCon
2、troller) public classCharacterThirdControl : MonoBehaviour Transform myCamera; /跟随摄像机private CharacterController cc; Vector3 playerDirect; /角色的目标方向Vector3 correctDirect; /为了矫正计算方向向量的误差float perError = 0.2f; /误差与摄像机缓冲存在关系float speed = 0.1f; /速度与 Update的帧数有关,同样数据帧数越多,速度越快Vector3 front; /前Vector3 back;
3、 /后Vector3 left; /左Vector3 right; /右/ Use this for initializationvoid Start() myCamera = Camera.main.transform; /将主摄像机设置为跟随摄像机front = Vector3.zero; back = Vector3.zero; left = Vector3.zero; right = Vector3.zero; correctDirect = Vector3.zero; cc = transform.GetComponent(); void LateUpdate() PlayerCon
4、trol(); / / 计算方向向量函数/ private void CalculateDirection() Vector3 temp = transform.position - myCamera.position; temp = new Vector3(temp.x, 0, temp.z); front = temp; if (correctDirect!=Vector3.zero & Mathf.Abs(correctDirect.x-front.x) perError & Mathf.Abs(correctDirect.z - front.z) perError) /
5、判断是否在误差范围内 front = correctDirect; back = -front; left =newVector3(-front.z, 0, front.x); right = -left; correctDirect = front; 精选文档,供参考!/ / 控制角色移动/ private void PlayerControl() playerDirect = new Vector3(0, 0, 0); CalculateDirection(); /计算角色的方向if (Input.GetAxis( Horizontal ) 0) /右 playerDirect = rig
6、ht; if (Input.GetAxis( Vertical ) 0) if (Input.GetAxis( Horizontal ) 0) /前右 playerDirect = front + right; else playerDirect = front; /前 if (Input.GetAxis( Vertical ) 0) if (Input.GetAxis( Horizontal ) 0) /后右 playerDirect = back + right; else playerDirect = back; /后 if (playerDirect != Vector3.zero)
7、playerDirect += transform.position; MoveSpeed(playerDirect); / / 调整角色方向,控制角色移动精选文档,供参考!/ private void MoveSpeed(Vector3 direct) transform.LookAt( new Vector3(direct.x, transform.position.y, direct.z); cc.Move(transform.forward * speed); using UnityEngine; using System.Collections; public classCamera
8、ThirdControl : MonoBehaviour Range(0, 1) SerializeField float target_offsety = 0.6f; /高度差Range(0, 90) SerializeField float initRotate = 15f; /摄像机角度Range(2, 10) SerializeField float DISTANCE_DEAFULT = 3.2f; /设置摄像机与物体之间的距离Transform target; /摄像机跟随的角色private float distance; private Vector3 playerTarget;
9、 private float lastRotate; / Use this for initializationvoid Start() lastRotate = initRotate; distance = DISTANCE_DEAFULT; /设置摄像机与角色的距离target = GameObject.FindGameObjectWithTag(Player).transform; /找到角色playerTarget = new Vector3(target.position.x, target.position.y + target_offsety, target.position.z
10、); /设置摄像机对着角色的位置Quaternion cr = Quaternion.Euler(initRotate, transform.eulerAngles.y, 0); /设置摄像机与角色之间的角度/计算摄像机的位置Vector3 positon = playerTarget; positon += cr * Vector3.back * distance; transform.position = positon; transform.rotation = target.rotation; transform.LookAt(playerTarget); / Update is ca
11、lled once per framevoid Update() /鼠标右键控制镜头转动if (Input.GetMouseButton(1) 精选文档,供参考!transform.RotateAround(playerTarget, Vector3.up, Input.GetAxis( Mouse X )*3f); /更新摄像机的位置角度等信息void LateUpdate() playerTarget = new Vector3(target.position.x, target.position.y + target_offsety, target.position.z); Quater
12、nion cr = Quaternion.Euler(initRotate, transform.eulerAngles.y, 0); Vector3 positon = playerTarget + (cr * Vector3.back * distance); RaycastHit hits = Physics.RaycastAll( new Ray(playerTarget, (positon - playerTarget).normalized); distance = DISTANCE_DEAFULT; if (hits.Length 0) RaycastHit stand = ne
13、w RaycastHit(); float maxDistance = float.MaxValue; foreach (RaycastHit hit in hits) if (!hit.collider.isTrigger & != & hit.distance DISTANCE_DEAFULT) distance = DISTANCE_DEAFULT; positon = playerTarget + (cr * Vector3.back * distance); transform.position = Vector3.Lerp(transform.position, positon, 0.5f); /用于摄像机的缓冲, 与误差存在关系Debug.DrawRay(playerTarget, positon - playerTarget, Color.red); if (lastRotate != initRotate) transform.LookAt(playerTarget); lastRotate = initRotate; /鼠标中键控制镜头远近float fov = this.GetComponent().fieldO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年钢筋施工承揽具体合同版B版
- 一年级人自然社会教案(全册)浙江版
- 预制柱吊装施工工艺正式版
- 2024版苏州租赁房屋家具清单3篇
- 2024年餐饮业标准原材料购销协议样本一
- 2024年简化版离婚协议书样本
- 黔南民族师范学院《offce办公软件三剑客》2023-2024学年第一学期期末试卷
- 2024苏州二手房买卖合同风险评估与防控措施协议3篇
- 重庆文理学院《JAVA面向对象编程》2023-2024学年第一学期期末试卷
- 3.1多变的天气【帮课堂】2025学年七年级地理上册同步学与练(人教版)(解析版)
- 外立面改造专项施工方案
- 乡村旅游景观小品装饰创新创意
- 《甲状腺的超声诊断》
- 事业单位岗位设置管理工作手册-台州市事业单位岗位设置管理
- 中医医师定考述职报告3篇
- 医疗系统气动物流传输系统施工工法
- GB/T 42177-2022加氢站氢气阀门技术要求及试验方法
- 多层共挤吹膜
- YY 0286.1-2007专用输液器第1部分:一次性使用精密过滤输液器
- GB/T 4423-2020铜及铜合金拉制棒
- GB/T 4354-2008优质碳素钢热轧盘条
评论
0/150
提交评论