初学Unity的小知识:
改变对象的父级有三种调用方式,如下:
transMe.SetParent(transParent,true);
transMe.SetParent(transParent,false);
transMe.parent = transParent;
具体有什么区别呢,这里写一个测试例子来详细说明,先上代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class test333 : MonoBehaviour
{public Transform transMe; //测试对象public Transform transParent;public bool toParent1; //worldPositionStays = truepublic bool toParent2; //worldPositionStays = falsepublic bool toParent3; //直接改parentpublic bool reset;void Start(){resetme();}private void resetme(){transMe.SetParent(null, false);transMe.position = new Vector3(0f, 3f, 0f);}// Update is called once per framevoid Update(){if (reset){reset = false;resetme();}if (toParent1){transMe.SetParent(transParent,true);toParent1 = false;}if (toParent2){toParent2 = false;transMe.SetParent(transParent, false);}if (toParent3){toParent3 = false;transMe.parent = transParent;}}
}
下图中:红色是parent,在(1,1,1),白色盒子是要改变parent的对象,在(0,3,0)默认位置。
我们来看下几种变化:
第一种worldPositionStays为True
transMe.SetParent(transParent,true);
第二个参数是True。标识需要保留当前的世界坐标,很好理解,运行后,勾选toParent1,我们看到位置没有任何变化,只是改变了父子级。
第二种worldPositionStays为False
transMe.SetParent(transParent, false);
我们运行后发现改变父子级后,会把当前的Local坐标叠加到新的位置,明显看到是parent的位置上加上了(0,3,0)坐标后的位置。
第三种改变parent
transMe.parent = transParent;
运行后和第一种相同,都是保留世界坐标。