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); } }

 

 

 

 
 
 
 

转载于:https://www.cnblogs.com/hellozzz/p/4179941.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值