unity第三视角移动,摄像机跟随_第1页
unity第三视角移动,摄像机跟随_第2页
unity第三视角移动,摄像机跟随_第3页
unity第三视角移动,摄像机跟随_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论