unity物体移动至指定位置

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

世界坐标与局部坐标之间的转换

在Unity中,物体的坐标分为局部坐标世界坐标
局部坐标是相对于物体的父对象的坐标系,而世界坐标是相对于场景的整体坐标系。

使用transform.position属性来获取物体在世界坐标系下的坐标。
使用transform.localPosition属性来获取物体在世界坐标系下的坐标。
使用transform.TransformPoint将局部坐标系转换为世界坐标系。
使用transform.InverseTransformPoint世界坐标系转换为局部坐标系。

举个例子
unity移动到指定位置,unity,游戏引擎

unity移动到指定位置,unity,游戏引擎
将下面代码挂载到Sphere上

public class Coordinate : MonoBehaviour
{
    public GameObject SomeThing;
    public Vector3 SomePoint;

    void Start()
    {
        Debug.Log("世界坐标:" + transform.position);
        Debug.Log("局部坐标:" + transform.localPosition);

        Debug.Log("当前坐标:" + SomePoint);
        Vector3 worldPoint = transform.TransformPoint(SomePoint);
        Debug.Log("局部坐标转为世界坐标:" + worldPoint);
        Vector3 localPoint = transform.InverseTransformPoint(worldPoint);
        Debug.Log("世界坐标转为局部坐标:" + localPoint);
    }
}

输出结果如下
unity移动到指定位置,unity,游戏引擎

如果想让物体运动到指定的位置,通常情况下是参考世界坐标系。因为世界坐标系是整个场景的坐标系,而局部坐标系是相对于物体的父对象的坐标系。假设想让物体移动到坐标为(x,y,z)的位置,参照世界坐标与局部坐标的物体运动代码如下:

// 世界坐标下运动
transform.position = new Vector3(x, y, z);
// 局部坐标下运动
transform.localPosition = new Vector3(x, y, z);

如果想要实现多个物体以相同的速度按照顺序移动到不同的位置,可以参考下一节。

物体移动至指定位置

需求

将一个由多个零部件组成的自定义模型导入unity中,希望实现该模型的部分拆卸过程。下面以共有11个拆卸步骤为例

思路

在网上找了很多资料,目前想到的办法有利用协程或动画播放的方法(这里只做了协程的方法,动画的等我学会再加上)
1、首先是自定义的模型的拆卸,因此需要知道哪些零部件需要先拆,哪些后拆。
2、还需要考虑碰撞等干涉情况,因此下面代码中有的零部件出现了多次。
3、将所有需要拆卸的零部件创建一个空父对象,下面这个代码就挂载到空父对象上。
4、利用GameObject.Find()函数,找到每个零部件,并放在一个数组里面,便于后续对每个零部件进行操作。
5、将每个零部件需要移动的指定位置与运动时间,同样放在另外两个数组里面。
6、零部件的移动,我使用的是DOTween插件中的DOLocalMove方法。

DOTween插件解析文章来源地址https://www.toymoban.com/news/detail-745869.html

注意

下面代码有待完善,如“每一步拆卸步骤所有的时间是不一样的,但速度应该是一样,这个我目前还不知道如何解决,只知道运动的位移相同的零件,其运动速度是一样的”
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class MoveTogether : MonoBehaviour
{
    //物体数组
    public GameObject[] objects;
    //物体名称数组
    public string[] Names;
    //目标位置数组
    public Vector3[] targetPositions;
    //运动时间数组
    public float[] moveTime;
    void Start()
    {
        Names = new string[]
        { 
            "一移动螺丝", 
            "一移动螺丝", 
            "中间部分", 
            "铁片1螺丝",
            "铁片1",
            "铁片2螺丝",
            "铁片2",
            "铁片3螺丝",
            "铁片3",
            "整体下方", 
            "整体下方" };

        objects = new GameObject[Names.Length];
        for (int i = 0; i < Names.Length; i++)
        {
            objects[i] = GameObject.Find(Names[i]);
        }
        
        targetPositions = new Vector3[] 
        { new Vector3(0f, 0f, -0.5f),  //一移动螺丝向下
          new Vector3(3f, 0f, -0.5f),  //一移动螺丝向右
          new Vector3(0f, 0f, -0.8f), //中间部分向下
          new Vector3(3f, 0f, 0f),    //铁片1螺丝向外
          new Vector3(3f, 0f, 0f),    //铁片1向外
          new Vector3(0f, -2f, 0f),  //铁片2螺丝向外
          new Vector3(0f, -2f, 0f),  //铁片2向外
          new Vector3(-3f, 0f, 0f),  //铁片3螺丝向外
          new Vector3(-3f, 0f, 0f),  //铁片3向外
          new Vector3(0f, 0f, -0.3f),  //整体下方向下
          new Vector3(3f, 0f, -0.3f) }; //整体下方向右

        moveTime = new float[] { 1f,3f,2f,2f,2f,2f,2f,2f,2f,2f,3f };
        StartCoroutine(Spilt_Merge());
    }
    IEnumerator Spilt_Merge()
    {
        //StepA.transform.DOLocalMove(targetStepA1, moveSpeed).SetEase(Ease.Linear);
        for (int i = 0; i < objects.Length; i++)
        {
            if (i > 0)
            {
                yield return objects[i - 1].transform.DOLocalMove(targetPositions[i - 1], moveTime[i - 1]).WaitForCompletion();
            }
            yield return objects[i].transform.DOLocalMove(targetPositions[i], moveTime[i]).WaitForCompletion();
        }      
    }
}

到了这里,关于unity物体移动至指定位置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Unity 之transform.LookAt() 调整一个物体的旋转,使其朝向指定的位置

    transform.LookAt 是 Unity 引擎中 Transform 组件的一个方法,用于调整一个物体的旋转,使其朝向指定的位置。通常情况下,它被用来使一个物体(如摄像机、玩家角色等)朝向另一个物体、位置或方向。以下是关于 transform.LookAt 方法的详细介绍: 方法签名: 参数说明: target :要

    2024年02月09日
    浏览(48)
  • 【Unity脚本开源】记录鼠标按下的位置和移动的距离来进行物体的旋转,并在鼠标释放后将物体恢复到初始旋转位置

    ♥️作者:白日参商 🤵‍♂️个人主页:白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!! 🎈🎈加油! 加油! 加油! 加油 🎈欢迎评论 💬点赞👍🏻 收藏 📂加关注+! 提针对这个需求,以下是示例脚本代码: ♥️作者

    2024年02月12日
    浏览(42)
  • Unity虚拟相机Cinemachine-实现相机自动移动到指定位置

    介绍两种方法, 第一种使用虚拟相机自带DollyCart和DollyTrack进行设置; 第二种使用时间线Timeline和DollyTrack进行设置 1.首先添加图中三个虚拟相机 2.点击 DollyTrack,添加点,设置轨道 3.调整点的位置,使轨道在相机移动的起点和终点保持平滑 4.设置Dolly Cart,将轨道拖拽到Dolly

    2024年01月25日
    浏览(45)
  • three.js实现鼠标点击控制物体移动(带动画效果,位置精确)

    通过查阅各种资料,最终确定解决方案,动画效果使用gsap组件库实现,也可不用,代码稍作修改即可。解决鼠标点击坐标偏移问题,复制可直接运行。 完整代码如下:

    2024年02月07日
    浏览(56)
  • [UE5]物体沿指定路径(样条线)循环往复的移动

    UE5.0.3 B站:https://www.bilibili.com/video/BV17K411B7DL/ YouTube: B站:https://www.bilibili.com/video/BV1PV4y1F7F2/ YouTube: GitHub:https://github.com/wjswxc/SplineDemo 中文: 英文: Shape_NarrowCapsule 添加样条组件 编辑样条线 在蓝图中添加如下代码 中文: 英文:

    2024年02月09日
    浏览(44)
  • Unity之用代码移动物体(平滑移动)

    因为移动的起点和终点都是不确定,所以这里用代码进行实现而不是动画(试过动画,但是发现无法成功添加clip) 物体移动常用的有两个方法,一个是Mathf.MoveTowards,一个是Mathf.Lerp,他们都用于值的平滑过渡 Mathf.MoveTowards          current:起点位置         target:目

    2024年02月07日
    浏览(39)
  • 【虚幻引擎】UE4/UE5鼠标点击事件实现物体移动

     在UE4/UE5中,引擎有它自己的一套框架体系,虚幻就是基于这一个框架体系来实现的。其中就有PlayerController(玩家控制器),玩家控制器中就有对鼠标的一系列设置,包括显示鼠标,允许点击事件等。  1.创建PlayerController,命名为MyPlayerController 2.打开MyPlayerController,勾选参数

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

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

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

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

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

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

    2024年02月12日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包