zoukankan      html  css  js  c++  java
  • 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); } }
     
     
     
     
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 贪吃的大嘴
    Java实现 蓝桥杯VIP 算法提高 贪吃的大嘴
    Java实现 蓝桥杯VIP 算法提高 贪吃的大嘴
    Java实现 蓝桥杯VIP 算法提高 贪吃的大嘴
    Java实现 蓝桥杯VIP 算法提高 士兵排队问题
    Java实现 蓝桥杯VIP 算法提高 士兵排队问题
    Java实现 蓝桥杯VIP 算法提高 士兵排队问题
    Java实现 蓝桥杯VIP 算法提高 士兵排队问题
    Java实现 蓝桥杯VIP 算法提高 数字黑洞
    Minifilter微过滤框架:框架介绍以及驱动层和应用层的通讯
  • 原文地址:https://www.cnblogs.com/hellozzz/p/4179941.html
Copyright © 2011-2022 走看看