unity3d之角色的移动篇 -- 45°视角下的键盘移动
这个知识点我想分成几个章节来写,分别记录不同情况下不同的移动方式。
首先是在45度角摄像机下的键盘控制角色移动(如下图), 先写一个最简单的移动脚本吧(这个脚本也可以用于平常的小测试)
在这之前先得为角色挂上character controller组件,然后获取它。
void move(){ //首先获取横纵轴的方向 float h = Input.GetAxis ("Horizontal"); float v = Input.GetAxis("Vertical"); //设置好移动的方向 Vector3 forward = transform.TransformDirection (Vector3.forward); //设置好移动的速度 float currentSpeed = moveSpeed * v; //方向*速度就是角色的移动距离了 cc.SimpleMove (forward * currentSpeed); }
这个还是比较简单的,平常需要一些角色移动的测试可以用这个脚本,但是不严谨,仔细研究会发现经不起推敲,于是经过我的一番改造有了以下的代码:
IEnumerator move_(){
//首先获取横纵轴的方向 float h = Input.GetAxis ("Horizontal"); float v = Input.GetAxis("Vertical"); //判断纵轴(W前进,S后退)方向的正负 if(v>0){ animation.Play(run.name); //方向向前 Vector3 forward = transform.TransformDirection (Vector3.forward);
//计算速度 float currentSpeed = moveSpeed * v; //获取水平方向后以一定速度沿着Y轴旋转 this.transform.Rotate(0,trunspeed*Time.deltaTime*h,0); //开始移动 cc.SimpleMove (forward * currentSpeed); //设置一个标示判断是否需要转身,在else里需要进行判断静止状态下的水平控制旋转方向 isTurn = false; //一个默认为true的旋转标示 if(isRot){
//如果需要转身,方向为模型正前方,即0度,使用四元数对角色旋转进行插值运算 Quaternion target = Quaternion.Euler(0,0,0); this.transform.rotation = Quaternion.Slerp(this.transform.rotation,target,0.3f);
//等待0.3秒完成插值运算后关闭该标示下的行为(PS:这个方法是在update下运行的) yield return new WaitForSeconds(0.3f); isRot = false; } }
//方法基本同上,除了一些特别需要说明的之外其余不再累述 else if(v<0){ animation.Play(run.name); //既然方向相反,那么真实方向也需要改变 Vector3 back = transform.TransformDirection (Vector3.back); float currentSpeed = moveSpeed * v; //这里获取了水平方向后沿着Y轴旋转需要乘以-1,方向相反,水平轴也需要相反,不然沿着Y轴左右旋转会反 this.transform.Rotate(0,trunspeed*Time.deltaTime*h*-1,0); cc.SimpleMove (back * currentSpeed); isTurn = true; if(isRot){ Quaternion target = Quaternion.Euler(0,180,0); this.transform.rotation = Quaternion.Slerp(this.transform.rotation,target,0.3f); yield return new WaitForSeconds(0.3f); isRot = false; } }
//没有进行操作设置成空闲状态,在此状态下 isRot需要初始化,用于下次旋转 else{ if(isTurn == false){ this.transform.Rotate(0,trunspeed*Time.deltaTime*h,0); } else{ this.transform.Rotate(0,trunspeed*Time.deltaTime*h*-1,0); } isRot = true; animation.Play(idle.name); } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。