Unity——控制物体移动的方法

控制物体移动的三种方法

一、常规方法

 //四个方向
        if (Input.GetKey(KeyCode.W))
        {
            transform.Translate(Vector3.forward*moveSpeed*Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.S))
        {
            transform.Translate(Vector3.back * moveSpeed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.A))
        {
            transform.Translate(Vector3.left * moveSpeed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.D))
        {
            transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
        }

二、使用unity自带的移动方式

float H = Input.GetAxis("Horizontal");
        float V = Input.GetAxis("Vertical");
        if (H!=0 || V!=0)
        {
            transform.Translate(new Vector3(H,0,V)*Time.deltaTime*moveSpeed,Space.World);
        }
        else
        {
           //没有移动
        }

三、通过刚体控制移动(必须添加刚体)

//通过刚体控制物体移动,需要添加刚体
        Vector3 moveForward = Vector3.zero;
        if (Input.GetKey(KeyCode.W))
        {
            moveForward.z += 1;
        }
        if (Input.GetKey(KeyCode.S))
        {
            moveForward.z += -1;
        }
        if (Input.GetKey(KeyCode.A))
        {
            moveForward.x += -1;
        }
        if (Input.GetKey(KeyCode.D))
        {
            moveForward.x += 1;
        }
        
        GetComponent<Rigidbody>().MovePosition(Quaternion.LookRotation(transform.forward) * moveForward * moveSpeed * Time.fixedDeltaTime + transform.position);

 

 

Unity3D 物体移动方式总结

1. 简介

    在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。

2. 通过Transform组件移动物体

    Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale)。 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position)。

2.1 Transform.Translate

       该方法可以将物体从当前位置,移动到指定位置,并且可以选择参照的坐标系。 当需要进行坐标系转换时,可以考虑使用该方法以省去转换坐标系的步骤。

       public function Translate(translation: Vector3, relativeTo: Space = Space.Self): void;
 

2.2 Vector3.Lerp, Vector3.Slerp, Vector3.MoveTowards

      Vector3 既可以表示三维空间中的一个点,也可以表示一个向量。这三个方法均为插值方法, Lerp为线性插值,Slerp为球形插值, MoveTowards在Lerp的基础上增加了限制最大速度功能。 当需要从指定A点移动到B点时,可以考虑时候这些方法。
 

2.3 Vector3.SmoothDamp

      该方法是可以平滑的从A逐渐移动到B点,并且可以控制速度,最常见的用法是相机跟随目标。

2.4 Transform.position

       有时重新赋值position能更快实现我们的目标。

3. 通过Rigidbody组件移动物体

    Rigidbody组件用于模拟物体的物理状态,比如物体受重力影响,物体被碰撞后的击飞等等。

    注意:关于Rigidbody的调用均应放在FixedUpdate方法中,该方法会在每一次执行物理模拟前被调用。

3.1 Rigidbody.velocity

     设置刚体速度可以让物体运动并且忽略静摩擦力,这会让物体快速从静止状态进入运动状态。

3.2 Rigidbody.AddForce

      给刚体添加一个方向的力,这种方式适合模拟物体在外力的作用下的运动状态。

3.3 Rigidbody.MovePosition

      刚体受到物理约束的情况下,移动到指定点。

4. 通过CharacterController组件移动物体

     CharacterController用于控制第一人称或第三人称角色的运动,使用这种方式可以模拟人的一些行为,比如限制角色爬坡的最大斜度,步伐的高度等。

4.1 CharacterController.SimpleMove

     用于模拟简单运动,并且自动应用重力,返回值表示角色当前是否着地。

4.2 CharacterController.Move

     模拟更复杂的运动,重力需要通过代码实现,返回值表示角色与周围的碰撞信息。

unity物体移动三种方式之——Transform.Translate

在unity中,经常遇到的一个问题就是物体移动的问题,Unity引擎给出了很多种解决方案,这里先给大家介绍一种——Transform.Translate函数。


在Unity中这是最基础的一种物体移动的方式之一,物体会按照你给的速度方程移动。


首先,我们先创建一个场景,加入一个Terrain或者是Plane,这里我加的是Terrain,为了美观,我在Terrain上刷了一层草地,绘制了一个小山包,然后添加一个Sphere,作为我们要移动的对象。新建一个脚本move.cs,绑定到脚本上,并在vs中打开:  
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class move : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        //使小球按照y轴正方向以每帧1的单位长度移动
        transform.Translate(Vector3.up * Time.deltaTime, Space.World);

    }
}

 效果图:  

transform.Translate()函数中,前一个变量是物体的移动速度,这里的速度是一个矢量,既包含大小写包含方向,后一个变量是相对坐标系,这里的相对坐标系有两个值,一个是世界坐标,一个是自身坐标,如果第一个坐标不填写的话,默认为自身坐标系。这里我们将坐标体系修改为自身坐标系看一下效果:  
 

transform.Translate(Vector3.up * Time.deltaTime, Space.Self);

这里我为了看到效果,将小球按照x轴旋转了90°。
我们还可以这样:

transform.Translate(new Vector3 (1,1,1) * Time.deltaTime, Space.World);

 

通过这个函数,我们可以将控制物体按照任何方向进行移动

unity物体移动三种方式之——AddForceAtPosition(二)

上次介绍了给物体施加力的一个函数AddForcePosition(),介绍了这个函数的三个参数和效果,今天我们继续来介绍这个函数。


这个函数是通过给物体施加力的方式,来使物体运动,我们都学过牛顿三定律,物体的的速度受物体质量的影响,当你用10N的力去推一个质量为1kg的物体和一个100kg的物体的时候(没有阻力的情况下),他们的速度是不相同的。同样,在untiy中,这个道理同样成立,因为unity本来就可以模仿真实世界的受力情况。让我们来看一下。
首先来说,使用 AddForcePosition()函数的物体,本身必须有Rigibody组件,在Rigibody组件中我们可以选择物体是否受重力影响,


第一个红框是代表物体的质量(密度),第二个红框代表是否受重力影响,其他参数,大家可以参考官方文档,可以点击组件右上角的小书(带一个小问号)的按钮即可。
现在,我再代码中将物体质量设置为5,我们来看效果:  

我们可以看出小球速度非常快,轻易就击倒了目标,
  我们再看看我将小球质量调整为30以后的效果:

 

小球的速度变得非常慢。
这里我们可以看出质量对于物体的运动速度的影响(恒力条件下),所以,我们在用这个函数的时候,一定要注意物体的质量。

unity物体移动三种方式之——AddForceAtPosition

上次说了物体移动的三种方式中的Transform.Translate,今天我们来说说另外一种方式——AddForceAtPosition()。这种方式是通过给物体目标方向上的一个力,让物体运动,就好比你投篮,给了篮球一个朝向球篮方向的力。
  效果如图:

代码如下:

if(Input.GetMouseButton(0))
        {

            Ray ray =  Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            if(Physics.Raycast(ray, out hit))
            {

                if(hit.collider.name =="Cube")
                {                   
                    Vector3 direction = hit.transform.position - obj.transform.position;
                    //发射炮弹
                    obj.GetComponent<Rigidbody>().AddForceAtPosition(direction,   hit.transform.position,ForceMode.Impulse);
                }   
            }
        }

 带注释的那一句,就是给小球在hit.transform.position位置上施加一个direction大小的forceMode.Impulse方式的力
函数的官方解释:

public void AddForceAtPosition(Vector3 force, Vector3 position, ForceMode mode = ForceMode.Force);

其中三个参数:
Vector3 force:力(矢量)
Vector3 position:施加力的位置
ForceMode mode :力的方式


额额,差不多就是这样,对于这里函数的使用,大概就是这样,但是在游戏中如果追求更好的模拟真实场景中的效果,大家还是要多多练习,没有实际练习过,你是想象不出效果来的。

发布了97 篇原创文章 · 获赞 21 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/sun124608666/article/details/100745819
今日推荐