首页 > 其他分享 >【Unity基础】Unity中移动物体的8种方法

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

时间:2024-08-28 17:22:44浏览次数:11  
标签:Rigidbody void Vector3 transform public Unity position 移动 物体

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

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

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

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

1. Transform.Position

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

transform.position = new Vector3(2, 1, 0);

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

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

2. Transform.Translate()

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

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()

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

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

4. Vector3.Lerp()

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

[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 方法来计算每一帧的新位置。以下是一个简单的例子:

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

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

    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会在帧之间创建平滑过渡。

    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方法用于连续地移动物体。也就是前者是在一帧内完成的,而后者需要在多帧里完成。

    void Start()
    {
        GetComponent<Rigidbody>().position = Vector3.zero;
    }

3. Rigidbody.AddForce()

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

    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

标签:Rigidbody,void,Vector3,transform,public,Unity,position,移动,物体
From: https://blog.csdn.net/tealcwu/article/details/141602112

相关文章

  • 【Unity输入】Unity输入方式总结
    在Unity中,常见的输入方式包括以下几种:1.键盘输入Input.GetKey():用于检测特定键是否被按下。例如,用Input.GetKey(KeyCode.W)检测玩家是否按下“W”键来控制角色移动。Input.GetKeyDown():用于检测某个键在当前帧是否被按下。Input.GetKeyUp():用于检测某个键在当前帧是否......
  • Unity 3D学习资料集合
    本文包含了unity3D游戏开发相关的学习资料,包含了入门、进阶、性能优化、面试和书籍等学习资料,含金量非常高,在这里分享给大家,欢迎收藏。学习社区1.Unity3D开发者Unity3D开发者论坛是一个专注于Unity引擎的开发者社区。在这个论坛上,开发者们可以分享自己的项目经验、技术问......
  • 新手网络爬虫利器介绍 之 移动蜂窝网络代理
    移动蜂窝代理对接说明在爬虫与反爬虫斗争愈演愈烈的情况下,各大网站和App的风控检测越来越强,其中一项就是IP封禁。为了解决IP封禁的困扰,一个有效的方式就是设置代理,设置代理之后,爬虫可以借助代理的IP来伪装自己的真实IP地址,从而突破反爬虫的限制。但代理的质量......
  • 免费、开源、详细完整的unity游戏、游戏源码、教程:人工智能分析和处理对话的美好三维
    这份unity游戏、游戏源码、教程:完全免费,完全开源,完整详细,通俗易懂,适合初学者入门,定期更新。我不想和任何人说话,任何人不要跟我说话,不要打扰我,我要安安静静的写。我解释一下原因:俗话说“道不同,不相与谋。”不是一个情感世界的人,就不该相互说话,两个不同情感世界的人,心灵是无法彼此......
  • 目录PyCharm Community Edition、python3.11、pythonProject之间的关系
    PyCharmCommunityEdition类型:PyCharmCommunityEdition是由JetBrains公司提供的免费、开源的集成开发环境(IDE)。用途:它专门为Python开发设计,提供了代码编辑、运行、调试、测试等功能。特点:包括智能代码补全、代码分析、图形化界面设计、版本控制集成等高级功能。Pyt......
  • 移动端+PC端源码,智慧城管执法系统,后端框架:springboot,移动端:uniapp
    市管理综合执法管理平台实现执法办案、业务全流程在线办理,依托移动端+PC端的“两端”应用模式,保障能够通过信息化手段进行日常的执法办案工作,强化执法监督功能。提供了案件在线办理、当事人信用管理、文书电子送达、沿街店铺分析等功能,全面赋能执法队员,提高执法队员办案效率。......
  • Unity之OpenXR如何使用Netcode实现一个多人VR游戏
    前言NetcodeforGameObjects是专为Unity构建的高级网络库,可用于抽象网络逻辑。您可以通过网络会话同时向许多玩家发送GameObjects和世界数据。借助NetcodeforGameObjects,您可以专注于构建游戏,而无需考虑低级协议和网络框架。Netcode框架的核心特性包括:易于使用:......
  • OUC 2024夏 移动软件开发 实验四:媒体API之口述校史
    一、实验准备课程主页:课程主页(gitee.com)实验文档:lab4文档实验视频:lab4视频二、实验目标1、掌握视频API的操作方法;2、掌握如何发送随机颜色的弹幕。三、实验步骤1、项目创建和页面配置基本流程见前两个lab,在此不再赘述。2、导航栏设计编写App.js:{"pages":[......
  • 移动H5端方案
    ●vue31. vue3+vantUI框架● 官方文档:https://vant-ui.github.io/vant/#/zh-CN● 版本:v4.9.4最新版本,更新时间2024-08(从2019-07至今,迭代时间5年)。● 研发团队:有赞团队● 优点:轻量、更新快,界面较美观、80+个高质量组件,覆盖移动端主流场景。● 适配性:官方支持vue3......
  • 全国大学生数学建模大赛模拟测试选拔题——移动机器人路径规划
    移动机器人路径规划是机器人学的一个重要研究领域。 它要求机器人依据某个或某些优化原则(如最小能量消耗、最 短行走路线、最短行走时间等),在其工作空间中找到一条从 起始状态到目标状态能避开障碍物的最优路径。机器人路径规划问题可以建模为一个有约束的优化问 题,都要......