Unity之用代码移动物体(平滑移动)

这篇具有很好参考价值的文章主要介绍了Unity之用代码移动物体(平滑移动)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

因为移动的起点和终点都是不确定,所以这里用代码进行实现而不是动画(试过动画,但是发现无法成功添加clip)

物体移动常用的有两个方法,一个是Mathf.MoveTowards,一个是Mathf.Lerp,他们都用于值的平滑过渡

  • Mathf.MoveTowards 
MoveTowards(float current, float target, float maxDelta);

        current:起点位置

        target:目标位置

        maxDelta:每一帧变化的量

        Mathf.MoveTowards:这个函数以固定的步长从当前值逐渐移向目标值。它提供了每帧最大的变化量,确保过渡是平滑的,但速度是固定的

  • Mathf.Lerp
Lerp(float a, float b, float t);

        a:起点位置

        b:目标位置

        t:插值参数,取值范围为0到1,表示要从a过渡到b的进度。

        Mathf.Lerp:这个函数通过根据插值系数在两个值之间进行线性插值来实现平滑过渡。它接受一个范围在0到1之间的插值参数,可以通过调整该参数来控制过渡速度和效果

  • MoveToward和Lerp的区别

        Mathf.MoveTowards:适用于需要按照固定速度进行平滑移动的场景,例如物体的平移、旋转或缩放等。

        Mathf.Lerp:适用于需要根据插值系数进行平滑过渡的场景,例如颜色的渐变、淡入淡出效果、相机的平滑跟随等。

注意:不论是MoveToward还是Lerp,每次运行只会让值变化一次,要让物体实现平滑移动,需要将MoveToward和Lerp方法放进while循环语句中

   while (elapsedTime < moveDuration)
        {
            // 使用插值方法计算当前位置
            float t = elapsedTime / moveDuration;
            Vector3 newPosition = Vector3.Lerp(initialPosition, targetPosition, t);

            // 更新物体的位置
            transform.position = newPosition;

            // 等待一帧
            yield return null;

            // 更新已经经过的时间
            elapsedTime += Time.deltaTime;
        }

这里是用时间条件来限制,在持续时间内移动物体,速度会随着路程的变长而加快,因为Lerp的插值参数是移动百分比,这样物体就能平滑的移动了

  • 扩展

        在unity中可以用Vector3.MoveTowards和Vector3.Lerp来实现物体的位移,这比用Mathf更加的方便,他是一个三维坐标的点对点移动,同时包含了xyz坐标的信息,如果是二维情况下可以用Vector2来代替

由于本人需要物体实现「这种转向一次的移动,所以需要添加中间点,这里如果是用Mathf的方法,代码就要复杂多了

Vector3 targetPosition1 = new Vector3(targetPosition2.x, startPosition.y, 0);

while (obj.transform.position != targetPosition1)//当前位置等于目标位置是跳出循环
        {
            float t = elapsedTime / moveDuration;

            Vector3 newPosition = Vector3.Lerp(startPosition, targetPosition1, t);

            obj.transform.position = newPosition;//新的位置要赋值给物体
            // 等待一帧
            yield return null;

            elapsedTime += Time.deltaTime;
            if(elapsedTime > 5f)
            {
                Debug.Log("移动物体进入死循环");
                break;
            }
        }

这里还用了协程实现了每次移动后等待一帧的操作,最后的if语句是为了防止进入死循环,至此,一个让物体移动的功能就实现了文章来源地址https://www.toymoban.com/news/detail-729477.html

到了这里,关于Unity之用代码移动物体(平滑移动)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 1.Unity中c#代码学习(读取物体名称+位置+移动)

    Ctrl + K + C 批量注释 Ctrl + K + U 批量取消注释 Debug.Log(\\\"**\\\");输出“**”中内容 GameObject obj = this.gameObject; this表示当前指代的物品 GameObject表示游戏中物体 Debug.Log(\\\"** 物体名字:\\\" + this.gameObject.name); this.gameObject.name直接调用类名 string name = obj.name; string 是c#中的字符串类型 Debug.Log(\\\"**

    2023年04月11日
    浏览(49)
  • unity摄像机平滑移动旋转

    Unity中使用Vector3.SmoothDamp(平滑阻尼)方法进行跟随移动,可以使跟随看起来很平滑,而不显得突兀,最典型的示例就是相机平滑跟随角色移动。 SmoothDamp (current : Vector3, target : Vector3, ref currentVelocity : Vector3, smoothTime )  

    2024年02月11日
    浏览(52)
  • Unity点击物体后,移动到物体所在位置

    脚本挂在被点击的物体上 脚本挂在角色控制器上 改进:使用Raycast中的LayerMask 创建“cube”层 将想要被检测的物体放入该层 3.1、 3D物体事件监听 在相机上挂Physics Raycaster组件 检查是否有EventSystem 将脚本挂在被点击的物体上 添加组件Event Trigger组件 3.2、 世界UI世界监听

    2024年02月07日
    浏览(52)
  • Unity 控制物体移动

    目录 1、通过改变物体的位置使物体移动 2、通过给物体施加力使物体移动 3、移动characterController以及碰撞检测 一、相关代码展示 1、通过改变物体的位置使物体移动 2、通过给物体施加力使物体移动 3、移动characterController 以及碰撞检测 注:使用时首先要给物体添加CharacterC

    2024年02月13日
    浏览(47)
  • Unity中的物体移动

    局部坐标系(Transform.localPosition)是指当前物体相对于父物体的位置,会受到父物体的影响。 世界坐标系(Transform.Position)是指当前物体在世界空间坐标系中的位置,不受父物体影响。 若该物体有父类,则二者的关系为:该物体的世界坐标=该物体父类的世界坐标+该物体的局

    2024年02月03日
    浏览(55)
  • unity 物体移动方法

        在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。     Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale)。 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移

    2024年02月12日
    浏览(44)
  • unity物体移动至指定位置

    在Unity中,物体的坐标分为 局部坐标 和 世界坐标 。 局部坐标是相对于物体的父对象的坐标系,而世界坐标是相对于场景的整体坐标系。 举个例子 将下面代码挂载到Sphere上 输出结果如下 如果想让物体运动到指定的位置,通常情况下是参考世界坐标系。因为世界坐标系是整

    2024年02月05日
    浏览(52)
  • unity UI 跟随3D物体移动

     

    2024年02月11日
    浏览(70)
  • 【Unity入门】物体5种移动方法

    利用修改Transform组件的position的两种常用方法。 使用Translate()函数 直接指定新的位置 将上述两种方法在 void Update()实现每一帧物体向x方向移动1.5个单位,具体代码如下: 注意:此处1.5为啥要写1.5f,根据C#的语法规定,直接写1.5会被认为double类型的数,而这里需要flaot类

    2024年02月02日
    浏览(42)
  • 【Unity】摄像机跟随鼠标移动以物体为中心旋转 物体根据视线方向移动

    描述 实现摄像机根据鼠标移动跟随物体旋转,以摄像机前物体为中心,摄像机围绕物体旋转,并使摄像机时刻指向物体 实现效果 Unity 组件设置 Camera 组件设置 Body 组件设置 实现代码 CameraRotateMove.cs 摄像机跟随和旋转 move_better.cs 物体根据按键移动

    2024年02月08日
    浏览(91)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包