一个所有子物体的Transform都是零零点,物体根据其子物体身上挂载的Mesh Renderer的中心点区分其子物体位置,以此实现解体分散的效果与还原的效果
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SplitAnomaly : MonoBehaviour
{
private Transform m_ParObj; // 中心点
private List<GameObject> m_Child; // 所有子对象
private List<Vector3> m_InitPoint = new List<Vector3>(); // 初始位置
public float Drawout=0.5f;//差值
private void Start()
{
m_ParObj = GetComponent<MeshRenderer>().gameObject.transform; //中心点为整个物体的中心点,需要在挂载脚本的物体上添加MeshRenderer
// m_ParObj = gameObject.transform; //我们使用了GetComponentInChildren<MeshRenderer>()来获取脚本所挂载物体下所有子物体中的第一个带有MeshRenderer组件的物体的MeshRenderer组件,从而获取到所有子物体的中心点。
// 同时,我们将m_ParObj的获取方式修改为gameObject.transform来获取脚本所挂载物体的Transform
m_Child = GetChild(m_ParObj); // 获取所有子对象
for (int i = 0; i < m_Child.Count; i++)
{
m_InitPoint.Add(m_Child[i].GetComponent<MeshRenderer>().bounds.center); // 记录每个子物体的中心点位置
}
}
// 获取所有子对象,包括隐藏的物体
public List<GameObject> GetChild(Transform obj)
{
List<GameObject> tempArrayobj = new List<GameObject>();
foreach (Transform child in obj.GetComponentsInChildren<Transform>(true))
{
if (child.GetComponent<MeshRenderer>() != null)
{
tempArrayobj.Add(child.gameObject);
}
}
return tempArrayobj;
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.W))
{
// 拆分
SplitObject();
}
if (Input.GetKeyDown(KeyCode.S))
{
// 合并
MergeObject();
}
}
private void SplitObject()
{
for (int i = 0; i < m_Child.Count; i++)
{
Vector3 tempV3 = SplitObjTest(m_ParObj, m_Child[i].transform);
tempV3 += m_InitPoint[i]; // 加上子对象在初始位置的偏移量
m_Child[i].transform.DOMove(tempV3, 3f, false);
}
}
private void MergeObject()
{
for (int i = 0; i < m_Child.Count; i++)
{
Vector3 initPos = Vector3.zero;//因为我们的模型都是零零点位置
m_Child[i].transform.DOMove(initPos, 3f, false);
}
}
public Vector3 SplitObjTest(Transform m_ParObj, Transform _TargetObj)
{
Vector3 tempV3;
tempV3.x = (_TargetObj.GetComponent<MeshRenderer>().bounds.center.x - m_ParObj.GetComponent<MeshRenderer>().bounds.center.x) * Drawout;
tempV3.y = (_TargetObj.GetComponent<MeshRenderer>().bounds.center.y - m_ParObj.GetComponent<MeshRenderer>().bounds.center.y) * Drawout;
tempV3.z = (_TargetObj.GetComponent<MeshRenderer>().bounds.center.z - m_ParObj.GetComponent<MeshRenderer>().bounds.center.z) * Drawout;
//所有子物体中的第一个带有MeshRenderer组件的物体的MeshRenderer组件 ,从而获取到所有子物体的中心点
// tempV3.x = (_TargetObj.GetComponent<MeshRenderer>().bounds.center.x - m_ParObj.gameObject.GetComponentInChildren<MeshRenderer>().bounds.center.x) * Drawout;
// tempV3.y = (_TargetObj.GetComponent<MeshRenderer>().bounds.center.y - m_ParObj.gameObject.GetComponentInChildren<MeshRenderer>().bounds.center.y) * Drawout;
// tempV3.z = (_TargetObj.GetComponent<MeshRenderer>().bounds.center.z - m_ParObj.gameObject.GetComponentInChildren<MeshRenderer>().bounds.center.z) * Drawout;
return tempV3;
}
}