unity物体移动至指定位置

news2024/9/27 19:18:57

物体坐标与物体移动

  • 世界坐标与局部坐标之间的转换
  • 物体移动至指定位置
    • 需求
    • 思路
    • 注意

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

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

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

举个例子
在这里插入图片描述

在这里插入图片描述
将下面代码挂载到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);
    }
}

输出结果如下
在这里插入图片描述

如果想让物体运动到指定的位置,通常情况下是参考世界坐标系。因为世界坐标系是整个场景的坐标系,而局部坐标系是相对于物体的父对象的坐标系。假设想让物体移动到坐标为(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插件解析

注意

下面代码有待完善,如“每一步拆卸步骤所有的时间是不一样的,但速度应该是一样,这个我目前还不知道如何解决,只知道运动的位移相同的零件,其运动速度是一样的”
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();
        }      
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/889504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个DW的计算

一个DW的计算 1- 题目: 已知一个DW1.1 要求: 从DW中取出指定的位的值1.1.1 分析1.1.2 实现1.1.3 简化实现1.1.4 验证 2- 题目: 已知一个DW2.1 要求: 从DW中的指定的P和S,取出指定的位的值2.1.1 分析2.1.2 实现 1- 题目: 已知一个DW 有图中所示一行信息&#xff0c;表示一个DW(…

mktime有时会返回-1使用boost库没有问题

linux获得时间戳 #include <iostream> #include <boost/date_time/posix_time/posix_time.hpp> long long utc8_to_stamp(int date, float time) {struct tm stm;int itime (time);int iY date/10000,iM(date-iY*10000)/100,iDdate%100,iHitime/10000,iMin(itime…

学习笔记十七:node节点选择器,亲和性

node节点选择器&#xff0c;污点、容忍度、亲和性 node节点选择器nodeName&#xff0c;指定pod节点运行在哪个具体node上nodeSelector&#xff1a;指定pod调度到具有哪些标签的node节点上 亲和性node节点亲和性使用requiredDuringSchedulingIgnoredDuringExecution硬亲和性使用…

Linux编程库

1、Linux编程库介绍&#xff1a; 编程库就是指始终可以被多个Linux软件项目重复使用的代码集。 使用编程库有两个主要的优点&#xff1a; 可以简化编程&#xff0c;实现代码重复使用&#xff0c;进而减小应用程序的大小。可以直接使用比较稳定的代码。 Linux下的库文件分为共…

rabbitmq容器启动后修改连接密码

1、进入容器 docker exec -it rabbitmq bash 2、查看当前用户列表 rabbitmqctl list_users 3、修改密码 rabbitmqctl change_password [username] ‘[NewPassword]’ 4、修改后退出容器 ctrlpq 5、退出容器后即可生效&#xff0c;不需要重启容器

三分之一的英国大学生被欺诈

根据NatWest的一项新研究&#xff0c;去年英国大学三分之一的学生在网上遭遇欺诈。 今年5月&#xff0c;这家高街银行委托咨询公司RedBrick对来自63个城镇的3000多名英国大学生进行了调查。 尽管三分之一的受访者表示他们在过去的12个月里遇到过诈骗&#xff0c;但没有统计数…

动手学深度学习-pytorch版本(二):线性神经网络

参考引用 动手学深度学习 1. 线性神经网络 神经网络的整个训练过程&#xff0c;包括: 定义简单的神经网络架构、数据处理、指定损失函数和如何训练模型。经典统计学习技术中的线性回归和 softmax 回归可以视为线性神经网络 1.1 线性回归 回归 (regression) 是能为一个或多个…

【06 英语语法:时态、语态、虚拟语气】

时态、语态、虚拟语气 1. 时态和语态1.1 时态: 4个时间*4个状态 &#xff08;时间&#xff1a;现在、过去、将来、过去将来&#xff1b;状态&#xff1a;一般、进行、完成、完成进行&#xff09;⑴ 16 时态 详解表⑵ 主从句的 时态搭配⑶ 常用的 不规则动词变化 1.2 语态&#…

url下载地址含非法字符下载失败

示例下载链接&#xff1a;https://666666.shei.org.cn:2023/20230105/0ac280a3-498b-45d8-830c-a788475a8022/2023817-F2666666很六 &#xff08;改&#xff09;.doc java.lang.IllegalArgumentException: Illegal character in path at index 96: https://666666.shei.org.c…

android resoure资源图片颜色值错乱

最近androidstudio开发&#xff0c;添加一些颜色值或者drawable资源文件时&#xff0c;运行app,颜色值或者图片对应不上&#xff0c;暂时找不到原因&#xff0c;望告知。 暂时解决方法&#xff1a;

IT 运营管理中的根本原因分析(RCA)

全球数字化的兴起造成了一种情况&#xff0c;即组织在很大程度上依赖于其IT基础架构&#xff0c;就像我们依赖神经系统一样。我们可以将其等同于神经系统&#xff0c;因为IT基础架构可以实现有效控制&#xff0c;协调所有功能&#xff0c;并确保高效&#xff0c;顺利地完成每项…

代码随想录算法训练营第60天|动态规划part17| 647. 回文子串、516.最长回文子序列、动态规划总结篇

代码随想录算法训练营第60天&#xff5c;动态规划part17&#xff5c; 647. 回文子串、516.最长回文子序列、动态规划总结篇 647. 回文子串 647. 回文子串 思路&#xff1a; 暴力解法 两层for循环&#xff0c;遍历区间起始位置和终止位置&#xff0c;然后还需要一层遍历判断…

vue2.0/vue3.0学习笔记——2022.08.16

vue2&#xff08;查漏补缺&#xff09; 一、vue基础 内置指令&#xff08;查漏补缺&#xff09; 1、v-text 更新元素的textContent 2、v-html 更新元素的innerHtml 3、v-cloak 防止闪现&#xff0c;与css配合: [v-cloak] {dispaly: none} 4、v-once 在初次动态渲染厚&#x…

1N4007S 整流二极管 1A 1000V A-405

前两天二极管生产厂家东沃电子科普过1N4007和1N4007G这两种普通塑封整流二极管&#xff0c;查看“STD-1N4001 Thru 1N4007 (DO-41) Datasheet”和“STD-1N4001G Thru 1N4007G (DO-41) Datasheet”产品手册可知&#xff0c;1N4007和1N4007G参数除了结电容和芯片尺寸不一样以外&a…

每日一练 | mongo集群如何创建分片键

文章目录 MongoDB是什么什么是分片键环境如何设置分片键 MongoDB是什么 MongoDB 是一个基于分布式文件存储的数据库 什么是分片键 分片&#xff1a;每个分片包含分片数据的一部分。每个分片可以部署为副本集。 而分片键的作用就是把数据按一定的条件分布到各个分片中&#…

Linux 修改信号的响应方式

修改信号的响应方式 1.signal()方法介绍&#xff1a; 修改信号的响应方式要用到方法signal()。需要引用头文件signal.h。signal()的原型&#xff1a; typedef重命名了一个函数指针的类型&#xff0c;这个指针的类型为指向一个参数为int返回值为void的函数的指针。这个函数指针…

学生学徒班适学人员介绍

什么是学生学徒制呢&#xff1f; 产业技能生态链企业与院校毕业年度学生&#xff0c;按照学生就业意愿&#xff0c;建立就业导向的学生学徒制关系&#xff0c;签订学徒培养协议&#xff0c;确定学生的就业岗位和培养计划&#xff08;含岗位实习&#xff09;。 泰迪-学生学…

Python中随机数的使用详解

目录标题 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~!随机数功能1. choice(seq)2. randint(start, end)3. random()4. uniform(a, b)5. randrange(start, end, step)6. sample(seq, number)7. shuffle(lt)尾语 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python资料、源码…

[JavaWeb]【二】Vue Ajax Elemnet Vue路由打包部署

目录 一 什么是Vue 1.1 Vue快速入门 1.2 常用指令 1.2.1 v-bind && v-model 1.2.2 v-on 1.2.3 v-if && v-show 1.2.4 v-for 1.2.5 案例 1.3 生命周期 二 Ajax 2.1 Ajax介绍 2.2 同步与异步 2.3 原生Ajax&#xff08;繁琐&#xff0c;过时了&#xff09…

Windows安装 Elasticsearch 教程

下载地址 Past Releases of Elastic Stack Software | Elastic 解压 解压完的样子 进入BIN目录 D:\Develop\elasticsearch\elasticsearch-7.12.0\bin 按住shift 鼠标右键 打开 powershell 窗口 查看ES版本 .\elasticsearch.bat --version 出现问题了 警告&#xff1a;不赞成…