利用OnAnimatorove函数控制人物的移动

unity中控制人物移动有很多方法,经过这么长时间的学习后,我总结了一些;

  1. 利用transform的translate方法控制人物移动;(结合动画的控制就不说了)
 float mx = Input.GetAxis("Horizontal") * moveSpeed * Time.deltaTime;
 float mz = Input.GetAxis("Vertical") * moveSpeed * Time.deltaTime;
 
 transform.translate(mx,0,mz);

2.利用Rigidbody组件rigidbody.MovePosition()方法进行移动(包含动画控制部分),鼠标控制人物移动;

void  FixedUpdate()
{
    float h=Input.GetAxis("Horizontal");
    float v=Input.GetAxis("Vertical");
    Move(h,v);
    Turning();
    Animating(h,v);
}
void Move(float h,float v)
{
    Vector3 movement;
    movement.Set(h,0,v);
    movement=movement.normalized*speed*Time.deltaTime;
    rigidbody.MovePosition(transform.position+movement);
}
void Turning()
{
    Ray camRay=Camera.main.ScreenPointToRay(Input.mousePosition);
    RayCastHit hitInfo;
    if(Physics.RayCast(camRay,out hitInfo,distance,floorMask))
    {
        Vector3 playerToMouse=hitInfo.point-transform.position;
        playerToMouse.y=0;
        Quaternion newRotation=Quaternion.LookRotation(playerToMouse);
        rigidbody.MovePosition(newRotation);
    }
}
void Animating(float h,float v)
{
    bool walking=h!=0||v!=0;
    m_ator.SetBool("Walk",walking);
}

3.还有一种就是利用Rigidbody的velocity属性来控制人物移动了

 float moveSpeed =10;
    Animator m_ator;
    Rigidbody rigid;
    Vector3 m_Pos;
    void Start () {
        m_ator = transform.GetComponent<Animator>();
        rigid = transform.GetComponent<Rigidbody>();
        m_Pos = transform.position;
    }
 void Update () {
        float mx = Input.GetAxis("Horizontal") ;
        float mz = Input.GetAxis("Vertical") ;
        Vector3 nowVelocity = rigid.velocity;
        if (Mathf.Abs(mx) > 0.01f || Mathf.Abs(mz) > 0.01f)
        {
            m_Pos = transform.position;
             transform.LookAt(m_Pos+new Vector3(mx, 0, mz));
            rigid.velocity = new Vector3(mx * moveSpeed, nowVelocity.y * moveSpeed, mz * moveSpeed);
            m_ator.SetBool("Walk",true);
        }
        else {
            rigid.velocity = new Vector3(0,nowVelocity.y*moveSpeed,0);
            m_ator.SetBool("Walk",false);
        }
        
       
 }
时间: 2024-10-05 14:56:09

利用OnAnimatorove函数控制人物的移动的相关文章

利用钩子函数来捕捉键盘响应的windows应用程序

一:引言: 你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的…..其实这些都是用到了windows的钩子函数.因此本文将对钩子函数的相关知识进行阐述.当然,本文的目的并不是想通过此程序让读者去窃取别人的密码,只是由于钩子函数在windows系统中是一个非常重要的系统接口函数,所以想和大家共同的探讨,当然本文也对怎样建立动态连结库(DLL)作了一些简单的描述.(本文的程序为vc6.

云中树莓派(4):利用声音传感器控制Led灯

云中树莓派(1):环境准备 云中树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示 云中树莓派(3):通过 AWS IoT 控制树莓派上的Led 云中树莓派(4):利用声音传感器控制Led灯 1. 声音传感器及其配置 声音传感器如下图所示: 将 VCC 引脚接入树莓派 5V 引脚,将 GND 引脚接入树莓派 GND 引脚,将 OUT 引脚接入树莓派 GPIO20. 要注意,模块在环境声音强度达不到设定阈值时,OUT输出高电平(1),当外界环境声音强度超过设定阈值时,模块O

es6 中的generator函数控制流程

Generator函数跟普通函数的写法有非常大的区别: 一是,function关键字与函数名之间有一个星号: 二是,函数体内部使用yield语句,定义不同的内部状态(yield在英语里的意思就是"产出"). 最简单的Generator函数如下: function* g() { yield 'a'; yield 'b'; yield 'c'; return 'ending'; } g(); // 返回一个对象 g函数呢,有四个阶段,分别是'a','b','c','ending'. Gen

利用Excel函数多角度计算个人所得税

新个税征收方法已与2011年9月1日起施行,但计算方法变更改后,有关这方面的计算方法在网络论坛上讨论较多,但在新旧交替时期正误混杂,新人难以分辨.在现实中根本就找不到这方面的经典计算方法,ExcelHome论坛超级版主.微软最有价值专家MVP黄成武归纳总结一下计算方法,最终目的是给大家拓展函数使用的技巧和思路,在陶醉于函数奇妙.经典的运用中,感叹Excel博大精深,同时又是加强练习Excel函数的绝佳机会. 一.个税计算最新税率表 级数 全月应纳税所得额 税率 扣除数 1       不超过15

关于用过控制人物移动的方法

在这里将收集更新有关,控制移动的方法. 1.通过WSAD控制人物的前后移动的方法(一) 1 public class PlayerMovemeng:monoBehaviour 2 { 3 //人物的移动速度 4 public float speed=6f; 5 //坐标的移动变化量 6 Vector3 movement; 7 Rigidbody playerRigidbody; 8 //与Ray发生碰撞的平面的Layer层数' 9 int FloorMask; 10 float camRayLe

利用select 函数 实现sleep功能 达到纳米级

利用select 函数 实现sleep达到纳米级 . 当然这个数据计算出来不准确,本身就包含程序执行本身消耗的数量. 原理是把select read write except  fd_set 全部设为NULL,这样select 就可以等待指定的时间. #include <sys/select.h> #include <stdio.h> #include <time.h> #include <sys/time.h> int  main(){         s

tcgetattr函数与tcsetattr函数控制终端

6.4.4  使用tcgetattr函数与tcsetattr函数控制终端 为了便于通过程序来获得和修改终端参数,Linux还提供了tcgetattr函数和tcsetattr函数.tcgetattr用于获取终端的相关参数,而tcsetattr函数用于设置终端参数.这两个函数的具体信息如表6.2所示. 表6.2   tcgetattr函数和tcsetattr函数 头文件 <termios.h> <unistd.h> 函数形式 int tcgetattr(int fd, struct t

OVS中对于用户层和datapath层的多个通道利用epoll进行控制

这里先暂时记录下代码流程,有待完善. static int construct(struct ofproto *ofproto_) { struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofproto_); const char *name = ofproto->up.name; int max_ports; int error; int i; error = dpif_create_and_open(name, ofproto->up.type

利用printf()函数,打印一个由*号组成的大写字母A

#include <stdio.h > void main() { printf(" *\n") ; printf(" * *\n"); printf(" *****\n"); printf(" * *\n"); printf(" * *\n") ; } 利用printf()函数,打印一个由*号组成的大写字母A,布布扣,bubuko.com