




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在以前的仿真项目中用到了第三人称视角的移动,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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度航天材料研发项目技术学徒引进及培养协议
- 2025年事业单位招聘考试卫生类预防医学专业知识试卷(临床医学基础)
- 2025年事业单位招聘考试教师音乐学科专业知识试卷(音乐史)
- 2025年事业单位招聘考试综合试卷:统计学发展史
- 教育科技与儿童权利保护的紧密联系及实践路径
- 2025人教版新版七年级上英语 Starter Unit 3练习与测试
- 提升学生课堂活跃度的教育心理策略
- 温岭市社区工作者招聘笔试真题2024
- 教育公平与质量政策解读与未来战略
- 集团化公司财务管控
- 感冒急性鼻炎护理
- 2024年村秘书述职报告
- 私房摄影保密协议书
- 天麻买卖合同协议
- 展览会会务服务投标方案(技术方案)
- 2025届四川省泸州市高三下学期第三次教学质量诊断性考试英语试题(原卷版+解析版)
- 胸痹心痛护理个案
- 船闸水工建筑物设计规范
- 铝塑板装饰施工方案
- 心电图操作及简单解读
- 技法儿童绘画课件
评论
0/150
提交评论