unity第三视角移动摄像机跟随Word格式文档下载.docx
- 文档编号:22184221
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:9
- 大小:16.29KB
unity第三视角移动摄像机跟随Word格式文档下载.docx
《unity第三视角移动摄像机跟随Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《unity第三视角移动摄像机跟随Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
//为了矫正计算方向向量的误差
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<
CharacterController>
();
}
voidLateUpdate()
PlayerControl();
///<
summary>
///计算方向向量函数
/summary>
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)<
perError&
Mathf.Abs(correctDirect.z-front.z)<
perError)//判断是否在误差范围内
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;
)>
0)//右
playerDirect=right;
Vertical"
0)
0)//前左
playerDirect=front+left;
elseif(Input.GetAxis("
0)//前右
playerDirect=front+right;
else
playerDirect=front;
0)
0)//后左
playerDirect=back+left;
0)//后右
playerDirect=back+right;
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);
}
publicclassCameraThirdControl:
MonoBehaviour
{
[Range(0,1)]
[SerializeField]
floattarget_offsety=0.6f;
//高度差
[Range(0,90)]
floatinitRotate=15f;
//摄像机角度
[Range(2,10)]
floatDISTANCE_DEAFULT=3.2f;
//设置摄像机与物体之间的距离
Transformtarget;
//摄像机跟随的角色
privatefloatdistance;
privateVector3playerTarget;
privatefloatlastRotate;
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);
//更新摄像机的位置角度等信息
Vector3positon=playerTarget+(cr*Vector3.back*distance);
RaycastHit[]hits=Physics.RaycastAll(newRay(playerTarget,(positon-playerTarget).normalized));
if(hits.Length>
RaycastHitstand=newRaycastHit();
floatmaxDistance=float.MaxValue;
foreach(RaycastHithitinhits)
if(!
hit.collider.isTrigger&
hit.collider.name!
=target.name&
hit.distance<
maxDistance)
stand=hit;
maxDistance=stand.distance;
if(stand.collider!
=null)
stringtag=stand.collider.gameObject.tag;
distance=Vector3.Distance(stand.point,playerTarget);
if(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)
//鼠标中键控制镜头远近
floatfov=this.GetComponent<
Camera>
().fieldOfView;
fov-=Input.GetAxis("
MouseScrollWheel"
)*10;
this.GetComponent<
().fieldOfView=Mathf.Clamp(fov,30,50);
publicvoidChangeCharacterView(boolcondition)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- unity 第三 视角 移动 摄像机 跟随