unity第三视角移动摄像机跟随.docx
- 文档编号:9048098
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:9
- 大小:16.29KB
unity第三视角移动摄像机跟随.docx
《unity第三视角移动摄像机跟随.docx》由会员分享,可在线阅读,更多相关《unity第三视角移动摄像机跟随.docx(9页珍藏版)》请在冰豆网上搜索。
unity第三视角移动摄像机跟随
在以前的仿真项目中用到了第三人称视角的移动,W、S、A、D控制角色的前后左右移动,摄像机跟随角色移动,并且摄像机做了缓冲处理。
鼠标右键长按旋转控制镜头旋转,中键滑轮控制镜头拉进拉远。
分为两个脚本,CharacterThirdControl挂在角色身上,CameraThirdControl挂在跟随摄像机身上。
角色的标签设置为Player。
跟随摄像机为主摄像机(可以根据自己需求改变)。
下面直接贴代码,代码中已有注释:
usingUnityEngine;
usingSystem.Collections;
[RequireComponent(typeof(CharacterController))]
publicclassCharacterThirdControl:
MonoBehaviour{
TransformmyCamera;//跟随摄像机
privateCharacterControllercc;
Vector3playerDirect;//角色的目标方向
Vector3correctDirect;//为了矫正计算方向向量的误差
floatperError=0.2f;//误差与摄像机缓冲存在关系
floatspeed=0.1f;//速度与Update的帧数有关,同样数据帧数越多,速度越快
Vector3front;//前
Vector3back;//后
Vector3left;//左
Vector3right;//右
//Usethisforinitialization
voidStart()
{
myCamera=Camera.main.transform;//将主摄像机设置为跟随摄像机
front=Vector3.zero;
back=Vector3.zero;
left=Vector3.zero;
right=Vector3.zero;
correctDirect=Vector3.zero;
cc=transform.GetComponent
}
voidLateUpdate()
{
PlayerControl();
}
///
///计算方向向量函数
///
privatevoidCalculateDirection()
{
Vector3temp=transform.position-myCamera.position;
temp=newVector3(temp.x,0,temp.z);
front=temp;
if(correctDirect!
=Vector3.zero&&Mathf.Abs(correctDirect.x-front.x) { front=correctDirect; } back=-front; left=newVector3(-front.z,0,front.x); right=-left; correctDirect=front; } /// ///控制角色移动 /// privatevoidPlayerControl() { playerDirect=newVector3(0,0,0); CalculateDirection();//计算角色的方向 if(Input.GetAxis("Horizontal")<0)//左 { playerDirect=left; } if(Input.GetAxis("Horizontal")>0)//右 { playerDirect=right; } if(Input.GetAxis("Vertical")>0) { if(Input.GetAxis("Horizontal")<0)//前左 { playerDirect=front+left; } elseif(Input.GetAxis("Horizontal")>0)//前右 { playerDirect=front+right; } else { playerDirect=front;//前 } } if(Input.GetAxis("Vertical")<0) { if(Input.GetAxis("Horizontal")<0)//后左 { playerDirect=back+left; } elseif(Input.GetAxis("Horizontal")>0)//后右 { playerDirect=back+right; } else { playerDirect=back;//后 } } if(playerDirect! =Vector3.zero) { playerDirect+=transform.position; MoveSpeed(playerDirect); } } /// ///调整角色方向,控制角色移动 /// privatevoidMoveSpeed(Vector3direct) { transform.LookAt(newVector3(direct.x,transform.position.y,direct.z)); cc.Move(transform.forward*speed); } } usingUnityEngine; usingSystem.Collections; publicclassCameraThirdControl: MonoBehaviour { [Range(0,1)] [SerializeField] floattarget_offsety=0.6f;//高度差 [Range(0,90)] [SerializeField] floatinitRotate=15f;//摄像机角度 [Range(2,10)] [SerializeField] floatDISTANCE_DEAFULT=3.2f;//设置摄像机与物体之间的距离 Transformtarget;//摄像机跟随的角色 privatefloatdistance; privateVector3playerTarget; privatefloatlastRotate; //Usethisforinitialization voidStart() { lastRotate=initRotate; distance=DISTANCE_DEAFULT;//设置摄像机与角色的距离 target=GameObject.FindGameObjectWithTag("Player").transform;//找到角色 playerTarget=newVector3(target.position.x,target.position.y+target_offsety,target.position.z);//设置摄像机对着角色的位置 Quaternioncr=Quaternion.Euler(initRotate,transform.eulerAngles.y,0);//设置摄像机与角色之间的角度 //计算摄像机的位置 Vector3positon=playerTarget; positon+=cr*Vector3.back*distance; transform.position=positon; transform.rotation=target.rotation; transform.LookAt(playerTarget); } //Updateiscalledonceperframe voidUpdate() { //鼠标右键控制镜头转动 if(Input.GetMouseButton (1)) { transform.RotateAround(playerTarget,Vector3.up,Input.GetAxis("MouseX")*3f); } } //更新摄像机的位置角度等信息 voidLateUpdate() { playerTarget=newVector3(target.position.x,target.position.y+target_offsety,target.position.z); Quaternioncr=Quaternion.Euler(initRotate,transform.eulerAngles.y,0); Vector3positon=playerTarget+(cr*Vector3.back*distance); RaycastHit[]hits=Physics.RaycastAll(newRay(playerTarget,(positon-playerTarget).normalized)); distance=DISTANCE_DEAFULT; if(hits.Length>0) { RaycastHitstand=newRaycastHit(); floatmaxDistance=float.MaxValue; foreach(RaycastHithitinhits) { if(! hit.collider.isTrigger&&hit.collider.name! =target.name&&hit.distance { stand=hit; maxDistance=stand.distance; } } if(stand.collider! =null) { stringtag=stand.collider.gameObject.tag; distance=Vector3.Distance(stand.point,playerTarget); if(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; } //鼠标中键控制镜头远近 floatfov=this.GetComponent fov-=Input.GetAxis("MouseScrollWheel")*10; this.GetComponent } publicvoidChangeCharacterView(boolcondition) { } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- unity 第三 视角 移动 摄像机 跟随