




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在以前的仿真项目中用到了第三人称视角的移动,W、S、A、D控制角色的前后左右移动,摄像机跟随角色移动,并且摄像机做了缓冲处理。鼠标右键长按旋转控制镜头旋转,中键滑轮控制镜头拉进拉远。分为两个脚本,CharacterThirdControl挂在角色身上,CameraThirdControl挂在跟随摄像机身上。角色的标签设置为Player。跟随摄像机为主摄像机(可以根据自己需求改变)。下面直接贴代码,代码中已有注释:using UnityEngine;using System.Collections;RequireComponent(typeof(CharacterController)public class CharacterThirdControl : MonoBehaviour Transform myCamera; /跟随摄像机 private CharacterController cc; Vector3 playerDirect; /角色的目标方向 Vector3 correctDirect; /为了矫正计算方向向量的误差 float perError = 0.2f; /误差与摄像机缓冲存在关系 float speed = 0.1f; /速度与Update的帧数有关,同样数据帧数越多,速度越快 Vector3 front; /前 Vector3 back; /后 Vector3 left; /左 Vector3 right; /右 / Use this for initialization void 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() PlayerControl(); / / 计算方向向量函数 / 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) /判断是否在误差范围内 front = correctDirect; back = -front; left =new Vector3(-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 = right; 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) 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 class CameraThirdControl : 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; private float lastRotate; / Use this for initialization void 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); /设置摄像机对着角色的位置 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 called once per frame void 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); Quaternion 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 = new 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 = initRotat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 轻奢电动车辆赠与及售后保障合同
- 热销木饰面产品区域总代理合同
- 餐饮厨房后厨员工培训与福利保障承包合同
- 电子产品进出口销售代理协议模板
- 车辆租赁与驾驶人员责任险合同范本
- 协议离婚中婚姻财产分割与遗产继承合同
- 住宅小区车位使用权转让及维修基金缴纳协议
- 长租公寓退房检查及押金返还协议
- 桥梁桩基声屏障安装工程
- 正向设计流程核心要点
- 学习解读《水利水电建设工程验收规程》SLT223-2025课件
- DZ∕T 0213-2020 矿产地质勘查规范 石灰岩、水泥配料类(正式版)
- 消防档案模板(完整版)
- 万玮:《班主任兵法》
- 防汛物资检查记录
- 施工现场防火的安全管理制度
- 零星维修工程项目方案施工组织计划
- FM筋膜手法(课堂PPT)
- 采矿工程毕业设计(毕业论文)
- 厌氧胶(MSDS)
- 水准仪全站仪检测报告
评论
0/150
提交评论