Unity中人物移动的几种方式

1.使用Transform组件

        (1)transform.position(最基础,最常用):

这是通过上下左右键控制人物运动的方法

         //获取水平按键,左键或A 则值为-1f,右键或D 则值为1f
        horizontal = Input.GetAxis("Horizontal");

        //获取垂直按键,上键或W 则值为-1f,下键或S 则值为1f
        vertical = Input.GetAxis("Vertical");

         

        Vector2 position = transform.position;
         position.x = position.x + speed * horizontal*Time.deltaTime;//Time.deltaTime在小技巧中有讲,speed在最开始赋值,或者外部赋值
        position.y = position.y + speed * vertical * Time.deltaTime;
        transform.position = position; 

注意: transform.position = position; // 通过transform获取位置会在人物与碰撞体碰撞时发生抖动,所以一般使用刚体的rigidbody2d.position

        (2) transform.Translate(v3向量,坐标系):这个坐标系有两种,一种世界坐标系Space.World;一种局部坐标系Space.Self,当这个坐标系不写时,默认的为局部坐标系,这里可以看坐标系

这是局部坐标系:

这是世界坐标: 

 public float speed;
private void update( )

{

         //沿z轴移动,如果想要自己控制,参照(1)的写法
        transform. Translate(new Vector3(0, 0, speed*Time. deltaTime ) , Space .World);

}

2.使用 Vector3插值 (1是速度越来越慢,3是匀速,4是先匀速再速度越来越慢)

        (1)Vector3.Lerp(当前位置(V3),目标位置(V3),速度(float)):线性移动由速度参数控制
速度越小,物体越慢,这里速度其实就是插值的比例(0~1),例如总路程为1,速度为0.5,第一次插值后两者距离为1*0.5,第二次插值为(1-(1*0.5)*0.5),缓动效果(越靠近目标越慢)(这里的缓动效果会无限接近目标,但是接近不了),一般用来控制相机的移动

public float speed;
public Transform target;//目标对象
private void Update()

{
        Vector3 V = Vector3.Lerp( transform.position,target. position, speed * Time .deltaTime);
        transform.position = V;
}

(2) Vector3.Slerp(当前位置(V3),目标位置(V3),速度(float)):这就是通过抛物线的形式到达目标点(不常用)

(3)Vector3.MoveTowards(当前位置(V3),目标位置(V3),最大速度(float)):速度取正靠近目标,速度取负远离目标,注意这是做匀速直线运动靠近目标

(4)Vector3.SmoothDamp(当前位置(V3),目标位置(V3),当前速度(ref:V3),缓动时间(float),最大速度(float)):官方翻译为“平滑阻尼”,也就是移动过程中,逐渐变慢的抵达终点(这里缓动可以到达目标)这里的最大速度可以不用写,当前速度参数:应为全局变量,这个值由你每次调用这个函数时被修改所以是ref(这里的当前速度不用赋值),缓动间参数:该值越小,越快抵达目标

public float time;
public Vector3 cspeed = Vector3 . zero;
public transform t;
private void Update()

{
        Vector3 V = Vector3. SmoothDamp(transform.position, t.position,ref cspeed,
        time*
Time.deltaTime) ;

}
transform. position = V;

3.使用刚体组件 :

  (1)AddForce(有方向的力(V3),力的模式):这里就可以理解为给刚体了一个带有方向的力,

 注意:1.建议放置在FixedUpdate函数下 2.移动物体需要添加刚体 3.适合模拟外力作用下的刚体运动(因此经常用来做发射子弹)4.此力为累加,不适合重复施加力来模拟物体
力的模式(ForceMode)总共有四种:

1.Force(叫持续的力,受质量影响) (默认),不写力的模式的时候就是这个(持续力,用质量)2.Impulse(一个瞬间冲击力,受质量影响)(瞬间力,用质量)
3.Acceleration(可持续的加速度,不受质量影响)(持续加速度,不用质量)
4.VelocityChange(一个瞬间速度变化,不受质量影响)(瞬间加速度,不用质量)

(2)MovePosition(新的位置(V3)):这里新的位置(V3)是transform.position+dir(移动的v3向量方向)*speed*Time.deltaTime

(3)Velocity:直接设置物体的速度(不用考虑质量)(注意这是一个属性速度有方向和大小,所以是直接用v3矢量直接赋值表示速度的方向和大小),经常用来做人物的跳跃移动

 void Run()//这是奔跑移动函数
    {
        float moveDir = Input.GetAxis("Horizontal");
        lookDirection = moveDir;乘上

        //这里如果Run放在update中最好是在speed后乘上Time.deltaTime
        Vector2 playerVel = new Vector2(moveDir*speed,M_Rigidbody2D.velocity.y);
        M_Rigidbody2D.velocity = playerVel;
    } 

void Jump()//这是跳跃函数
    {      
        if (Input.GetKeyDown(KeyCode.K))
        {
            Vector2 jumpVel = new Vector2(M_Rigidbody2D.velocity.x, jumpspeed);
            M_Rigidbody2D.velocity = jumpVel;
        }   
    }

注意这里的所有V3向量在2D平面游戏中都可以变成V2向量 

猜你喜欢

转载自blog.csdn.net/qq_62947569/article/details/128473193