推薦閱讀
- CSDN主頁
- GitHub開源地址
- Unity3D插件分享
- 簡書地址
- 我的個人博客
- QQ群:1040082875
一、前言
在仿真開發中,會遇到將模型進行移動、放大、旋轉、拆分、合并等操作,其他的移動、放大、旋轉都有比較多的例子進行參考,今天就分享一下如何將物體進行拆分
二、實作思路
這個實作的思路有很多的,比如:
1、先將模型拆分好,然后記錄拆好的物體的坐標,然后拆分的時候讓物體移動到拆好的物體的坐標
2、設定一個中心點,然后其他物體向這個中心點的反方向附加一個力,這樣就有一種彈開的效果
3、添加物理效果,比如給所有物體增加碰撞盒,然后之間碰撞離散
4、以物體的法線向四周添加力,讓物體離散
5、設定一個中心點,其他物件以這個中心點為目標點,計算跟這個中心點的距離,然后將這個距離乘2,就是這個物件新的位置
三、實作
咱們就按照第五個思路進行,就是先設定一個中心點,其他物件以這個中心點為目標點,計算跟這個中心點的距離,然后將這個距離乘2,就是這個物件新的位置,
1、首先設定一個中心點,這個中心點最好是所有物體的中心位置,這樣其他物件才能均勻的拆分
using System.Collections.Generic;
using UnityEngine;
public class SplitTest : MonoBehaviour
{
public Transform m_ParObj;//中心點
}
2、獲取所有的子物件
using System.Collections.Generic;
using UnityEngine;
public class SplitTest : MonoBehaviour
{
public Transform m_ParObj;//中心點
private void Start()
{
List<GameObject> m_Child = m_ParObj.GetChild();//獲取所有子物件
}
}
因為Unity沒有函式來直接獲取所有子物件,所以這里用了擴展方法來獲取所有子物件:
using System.Collections.Generic;
using UnityEngine;
public static class MyExtensions
{
public static List<GameObject> GetChild(this Transform obj)
{
List<GameObject> tempArrayobj = new List<GameObject>();
foreach (Transform child in obj)
{
tempArrayobj.Add(child.gameObject);
}
return tempArrayobj;
}
}
3、根據子物件和中心點計算出來距離,然后讓這個距離乘2:
public Vector3 SplitObjTest(Transform m_ParObj, Transform _TargetObj)
{
Vector3 tempV3;
tempV3.x = (_TargetObj.position.x - m_ParObj.position.x) * 2;
tempV3.y = (_TargetObj.position.y - m_ParObj.position.y) * 2;
tempV3.z = (_TargetObj.position.z - m_ParObj.position.z) * 2;
return tempV3;
}
4、將所有的子物件一個個的傳入這個函式中,求得目標位置,然后設定子物件移動到目標位置:
using System.Collections.Generic;
using UnityEngine;
public class SplitTest : MonoBehaviour
{
public Transform m_ParObj;//中心點
private void Start()
{
List<GameObject> m_Child = m_ParObj.GetChild();//獲取所有子物件
for (int i = 0; i < m_Child.Count; i++)
{
Vector3 tempV3 = SplitObjTest(m_ParObj, m_Child[i].transform);
m_Child[i].transform.position = tempV3;
}
}
public Vector3 SplitObjTest(Transform m_ParObj, Transform _TargetObj)
{
Vector3 tempV3;
tempV3.x = (_TargetObj.position.x - m_ParObj.position.x) * 2;
tempV3.y = (_TargetObj.position.y - m_ParObj.position.y) * 2;
tempV3.z = (_TargetObj.position.z - m_ParObj.position.z) * 2;
return tempV3;
}
}
5、將父物件賦值給ParObj卡槽:

6、效果展示:
初始:

運行起來:

7、如果想要加入影片分解的效果,可以使用DoTween:
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class SplitTest : MonoBehaviour
{
public Transform m_ParObj;//中心點
private void Start()
{
List<GameObject> m_Child = m_ParObj.GetChild();//獲取所有子物件
for (int i = 0; i < m_Child.Count; i++)
{
Vector3 tempV3 = SplitObjTest(m_ParObj, m_Child[i].transform);
m_Child[i].transform.DOMove(tempV3, 3f, false);
}
}
public Vector3 SplitObjTest(Transform m_ParObj, Transform _TargetObj)
{
Vector3 tempV3;
tempV3.x = (_TargetObj.position.x - m_ParObj.position.x) * 2;
tempV3.y = (_TargetObj.position.y - m_ParObj.position.y) * 2;
tempV3.z = (_TargetObj.position.z - m_ParObj.position.z) * 2;
return tempV3;
}
}

四、后記
好啦,結束,有什么問題可以加群討論
CSDN認證博客專家
CSDN博客專家
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/232597.html
標籤:其他
