世界坐標與局部坐標之間的轉(zhuǎn)換
在Unity中,物體的坐標分為局部坐標和世界坐標。
局部坐標是相對于物體的父對象的坐標系,而世界坐標是相對于場景的整體坐標系。
使用transform.position屬性來獲取物體在世界坐標系下的坐標。
使用transform.localPosition屬性來獲取物體在世界坐標系下的坐標。
使用transform.TransformPoint將局部坐標系轉(zhuǎn)換為世界坐標系。
使用transform.InverseTransformPoint世界坐標系轉(zhuǎn)換為局部坐標系。
舉個例子
將下面代碼掛載到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("局部坐標轉(zhuǎn)為世界坐標:" + worldPoint);
Vector3 localPoint = transform.InverseTransformPoint(worldPoint);
Debug.Log("世界坐標轉(zhuǎn)為局部坐標:" + localPoint);
}
}
輸出結(jié)果如下
如果想讓物體運動到指定的位置,通常情況下是參考世界坐標系。因為世界坐標系是整個場景的坐標系,而局部坐標系是相對于物體的父對象的坐標系。假設(shè)想讓物體移動到坐標為(x,y,z)的位置,參照世界坐標與局部坐標的物體運動代碼如下:
// 世界坐標下運動
transform.position = new Vector3(x, y, z);
// 局部坐標下運動
transform.localPosition = new Vector3(x, y, z);
如果想要實現(xiàn)多個物體以相同的速度按照順序移動到不同的位置,可以參考下一節(jié)。文章來源:http://www.zghlxwxcb.cn/news/detail-745869.html
物體移動至指定位置
需求
將一個由多個零部件組成的自定義模型導(dǎo)入unity中,希望實現(xiàn)該模型的部分拆卸過程。下面以共有11個拆卸步驟為例
思路
在網(wǎng)上找了很多資料,目前想到的辦法有利用協(xié)程或動畫播放的方法(這里只做了協(xié)程的方法,動畫的等我學會再加上)
1、首先是自定義的模型的拆卸,因此需要知道哪些零部件需要先拆,哪些后拆。
2、還需要考慮碰撞等干涉情況,因此下面代碼中有的零部件出現(xiàn)了多次。
3、將所有需要拆卸的零部件創(chuàng)建一個空父對象,下面這個代碼就掛載到空父對象上。
4、利用GameObject.Find()函數(shù),找到每個零部件,并放在一個數(shù)組里面,便于后續(xù)對每個零部件進行操作。
5、將每個零部件需要移動的指定位置與運動時間,同樣放在另外兩個數(shù)組里面。
6、零部件的移動,我使用的是DOTween插件中的DOLocalMove方法。
DOTween插件解析文章來源地址http://www.zghlxwxcb.cn/news/detail-745869.html
注意
下面代碼有待完善,如“每一步拆卸步驟所有的時間是不一樣的,但速度應(yīng)該是一樣,這個我目前還不知道如何解決,只知道運動的位移相同的零件,其運動速度是一樣的”
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
public class MoveTogether : MonoBehaviour
{
//物體數(shù)組
public GameObject[] objects;
//物體名稱數(shù)組
public string[] Names;
//目標位置數(shù)組
public Vector3[] targetPositions;
//運動時間數(shù)組
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();
}
}
}
到了這里,關(guān)于unity物體移動至指定位置的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!