【Unity基础】Unity中移动物体的8种方法

本文主要介绍物体线性移动方法,是基于3D场景介绍的。当然在2D场景中也有对应的方法。

首先物理学上,物体的运动可以分为运动学和动力学,二者的区别在于是否受外力影响。

具体可以参看《什么是运动学和动力学》

运动学方面,是通过改变物体的位置来实现的。在Unity中,可以使用Transform和Vector的属性以及方法来实现。

1. Transform.Position

我们可以直接给物体指定一个坐标来设定其位置。

cs 复制代码
transform.position = new Vector3(2, 1, 0);

当在每一帧里改变其位置时,看起来就是移动的效果了。

cs 复制代码
    void Update()
    {
        var dir = new Vector3(0.02f, 0, 0);
        transform.position += dir;
    }

2. Transform.Translate()

Translate方法本质上也是在改变物体的位置。

cs 复制代码
void Update()
    {
        // Move the object forward along its z axis 1 unit/second.
        transform.Translate(Vector3.forward * Time.deltaTime);

        // Move the object upward in world space 1 unit/second.
        transform.Translate(Vector3.up * Time.deltaTime, Space.World);
    }

3. Vector3.MoveTowards()

这个方法是将物体移动到指定位置。

cs 复制代码
public Vector3 targetPosition;
public float speed=10;
void Update()
{
    transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);
}

4. Vector3.Lerp()

通过插值计算的方法平滑地改变物体位置。

cs 复制代码
[SerializeField] private float moveSpeed;
[SerializeField] private float lerp;
private void Update()
{
    transform.position = Vector3.Lerp(transform.position, new Vector2(5,5), lerp); 
}

Vector3类中还有两个方法SLerp和SmoothDamp,是通过对向量进行线性插值计算来改变位置的。SLerp与Lerp方法的区别在于,Lerp是线性插值,而SLerp是球性插值,后者适用于旋转向量的平滑移动。

5. Vector3.SmoothDamp()

SmoothDamp可以用于平滑地移动物体到指定的位置。

假设你有一个物体,需要将它从当前位置平滑地移动到一个目标位置,你可以使用 SmoothDamp 方法来计算每一帧的新位置。以下是一个简单的例子:

cs 复制代码
using UnityEngine;

public class SmoothMove : MonoBehaviour
{
    public Transform target; // 目标位置
    private Vector3 velocity = Vector3.zero; // 初始速度

    void Update()
    {
        // 使用 SmoothDamp 计算新的位置
        transform.position = Vector3.SmoothDamp(transform.position, target.position, ref velocity, 0.3f);
    }
}

动力学方面,可以通过Rigidbody的属性和方法来实现。

1. Rigidbody.velocity

这是直接改变物体的速度来实现移动的。

cs 复制代码
    public Vector3 direction = Vector3.right;
    public float speed = 5f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        rb.velocity = direction.normalized * speed;
    }

2. Rigidbody.MovePosition()

Rigidbody.MovePosition移动 Rigidbody 并遵循插值设置。启用 Rigidbody 插值后,Rigidbody.MovePosition会在帧之间创建平滑过渡。

cs 复制代码
    public Vector3 startPosition; // 初始位置
    public float speed = 2f;
    public float range = 3f; // 移动范围
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        startPosition = transform.position; // 记录初始位置
    }

    void FixedUpdate()
    {
        // 计算物体应有的位置
        float positionOffset = Mathf.PingPong(Time.time * speed, range) - (range / 2);
        rb.MovePosition(startPosition + Vector3.right * positionOffset);
    }

Rigidbody.position也可以改变物体的位置,它与MovePostion的区别在于,前者是一次性改变物体位置,而MovePosition方法用于连续地移动物体。也就是前者是在一帧内完成的,而后者需要在多帧里完成。

cs 复制代码
    void Start()
    {
        GetComponent<Rigidbody>().position = Vector3.zero;
    }

3. Rigidbody.AddForce()

使用这个方法给物体施加一个方向力。在力的作用下,物体就会移动,这时物体的移动与其物理特性比如重量、阻力和重力有关。

cs 复制代码
    public Vector3 forceDirection = Vector3.right;
    public float acceleration = 10f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        rb.AddForce(forceDirection.normalized * acceleration);
    }

参考:

https://blog.csdn.net/qq_63486332/article/details/131953729

https://blog.csdn.net/GG_and_DD/article/details/126917358

相关推荐
蓝裕安3 小时前
伪工厂模式制造敌人
开发语言·unity·游戏引擎
谢泽浩7 小时前
Unity 给模型贴上照片
unity·游戏引擎
z2014z7 小时前
Unity Resource System 优化笔记
unity·游戏引擎
王维志7 小时前
Unity 高亮插件HighlightPlus介绍
unity·游戏引擎
zaizai10078 小时前
我的demo保卫萝卜中的技术要点
unity
菌菌巧乐兹9 小时前
Unity 百度AI实现无绿幕拍照抠像功能(详解版)
人工智能·百度·unity
孑么1 天前
C# 委托与事件 观察者模式
开发语言·unity·c#·游戏引擎·游戏程序
wangduqiang7471 天前
unity的学习
学习·unity·游戏引擎
@Sunset...1 天前
Unity程序基础框架
unity·游戏引擎
咩咩觉主2 天前
Unity实战案例全解析 :PVZ 植物脚本分析
unity·游戏引擎