 
         
         
         
         下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在以前的仿真项目中用到了第三人称视角的移动, W、S、A、D控制角色的前后左右移动,摄像机跟随角色移动,并且摄像 机做了缓冲处理。鼠标右键长按旋转控制镜头旋转,中键滑轮控制镜头拉进拉远。分为两个脚本,CharacterThirdControl 挂在角色身上,CameraThirdControl挂在跟随摄像机身上。角色的标签设置为 Player。跟随摄像机为主摄像机(可以根据 自己需求改变)。下面直接贴代码,代码中已有注释: using Uni tyE ngine; using System.Collecti ons; RequireComp onen t(typeof(CharacterC o
2、n troller) public classCharacterThirdControl : MonoBehaviour Tran sform myCamera; 跟随摄像机 private CharacterC on troller cc; Vector3 playerDirect;/ 角色的目标方向 Vector3 correctDirect; float perError = 0.2f; float speed = 0.1f; Vector3 front;/ 前 为了矫正计算方向向量的误差 /误差与摄像机缓冲存在关系 速度与Update的帧数有关,同样数据帧数越多,速度越快 Vector
3、3 back; / 后 Vector3 left;左 Vector3 right; / 右 / Use this for in itializati on void Start() myCamera = Camera.main.transform; /将主摄像机设置为跟随摄像机 front = Vector3.zero; back = Vector3.zero; left = Vector3.zero; right = Vector3.zero; correctDirect = Vector3.zero; cc = tra nsform.GetComp onen t(); void LateU
4、pdate() PlayerCo ntrol(); / /计算方向向量函数 / private void CalculateDirection() Vector3 temp = tran sform.positi on - myCamera.positi on; temp = new Vector3(temp.x, 0, temp.z); front = temp; if (correctDirect!=Vector3.zero back = -front; left = new Vector3(-front.z, 0, front.x); right = -left; correctDire
5、ct = 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 playerDire
6、ct = 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) tra
7、nsform.LookAt( new Vector3(direct.x, transform.position.y, direct.z); cc.Move(transform.forward * speed); using UnityEngine; using System.Collections; public classCameraThirdControl : MonoBehaviour Range(0, 1) SerializeField float target_offsety = 0.6f;/ 高度差 Range(0, 90) SerializeField float initRot
8、ate = 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;/设置
9、摄像机与角色的距离 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
10、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
11、, 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 * dista
12、nce); 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 positon = pla
13、yerTarget + (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().fieldOfView; fov -= Input.Get
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑顶板拆除方案设计图
- 高中语文重要知识点系统总结
- 小学二年级音乐《小红帽》教案
- 小学毕业语文复习练习题集
- 华为国外营销方案
- 通州区综合管道施工方案
- 建筑业企业咨询运营方案
- 房产端午活动方案策划方案
- 异形建筑营造方案设计说明
- 西藏矿用变压器施工方案
- 天气系统(上)+课件【核心知识精讲精研 】 高中地理湘教版(2019)选择性必修1
- 《浅谈幼儿园劳动教育实施策略》 论文
- 中医养生文化ppt
- 混凝土配合比设计作业指导书
- GB/T 13560-2009烧结钕铁硼永磁材料
- 远程会诊登记本
- 多旋翼无人机培训教材课件
- 高新技术企业(科技型中小企业)专题培训课件
- 一句话营销技巧培训课件
- 送达地址确认书(诉讼类范本)
- 护理专业医疗质量控制指标2020年版解读课件
 
            
评论
0/150
提交评论