unity3d之角色的移动篇 -- 俯视视角下的键盘移动

这个知识点我想分成几个章节来写,分别记录不同情况下不同的移动方式。

首先是在俯视角摄像机下的键盘控制角色移动(如下图), 先写一个最简单的移动脚本吧(这个脚本也可以用于平常的小测试)

在这之前先得为角色挂上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); } }

 

 

 

 
 
 
 

posted on 2014-12-23 13:44  快要结束了  阅读(1178)  评论(0编辑  收藏  举报

导航