【虚拟仿真】Unity3D中拆分模型教程(多种类型模型拆分)推荐阅读
⼤家好,我是佛系⼯程师☆恬静的⼩魔龙☆,不定时更新Unity开发技巧,觉得有⽤记得⼀键三连哦。
⼀、前⾔
今天有⼩伙伴在我这篇⽂章下⾯问我如何⼀秒⼀拆:
虽然我已经给出了思路,但是离实现还是有点思路,正好我对于我这篇⽂章也是不满意,就解答⼀下⼩伙伴的疑惑,然后再将⽂章内容进⾏升级。
原⽂章: 的思路是获取⼦物体跟⽗物体之间的距离,然后拆分的时候让⼦物体移动到跟⽗物体距离的两倍的位置上,这种⽅法只能拆分完全对称镜像的模型,⽐如这样的:
但是,其他类型的,奇奇怪怪的模型估计就不那么好⽤了,所以本篇⽂章升级了⼀下,可以拆分更多模型,快来看看吧。
⼆、实现⼀秒⼀拆
⾸先,解决⼩伙伴⼀秒⼀拆代码的实现。本⼩节根据这篇⽂章基础上进⾏实现。
新建个项⽬,模板选3D,我⽤的是Unity3D版本是Unity 2019.4.7f1:
unity3d入门
搭建场景,简简单单搭⼀个⼗字模型:
将导⼊:
新建脚本SplitTest.cs,双击打开脚本,修改代码:
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SplitTest : MonoBehaviour
public class SplitTest : MonoBehaviour
{
private Transform m_ParObj;//中⼼点
private List<GameObject> m_Child;//所有⼦对象
private List<Vector3> m_InitPoint =new List<Vector3>();//初始位置
private int m_IsSplitState =0;
private float m_TimeTotal =0;//总时间
private float m_Timecurrent =0;//当前时间
private int m_TimeDisRe =0;//时间间隔记录
private int IndexCount =0;//计数
public int m_TimeDistance =1;//时间间隔
void Start()
{
m_ParObj =GetComponent<Transform>();
m_Child =GetChild(m_ParObj);
for(int i =0; i < m_Child.Count; i++)
{
m_InitPoint.Add(m_Child[i].transform.position);
}
m_TimeTotal = m_Child.Count* m_TimeDistance;
}
//获取所有⼦对象
public List<GameObject>GetChild(Transform obj)
{
List<GameObject> tempArrayobj =new List<GameObject>();
foreach(Transform child in obj)
{
tempArrayobj.Add(child.gameObject);
}
return tempArrayobj;
}
void Update()
{
if(Input.GetKeyDown(KeyCode.W))
{
m_Timecurrent =0;
m_TimeDisRe =0;
IndexCount =0;
m_IsSplitState =1;
}
if(Input.GetKeyDown(KeyCode.S))
{
m_Timecurrent =0;
m_TimeDisRe =0;
IndexCount =0;
m_IsSplitState =2;
}
if(m_IsSplitState ==1)
{
/
/拆分
SplitObject();
}
else if(m_IsSplitState ==2)
{
//合并
MergeObject();
}
}
private void SplitObject()
{
{
m_Timecurrent += Time.deltaTime;
if(m_Timecurrent <= m_TimeTotal && IndexCount< m_Child.Count)
{
if(Mathf.FloorToInt(m_Timecurrent)== m_TimeDisRe)
{
m_TimeDisRe += m_TimeDistance;
Vector3 tempV3 =SplitObjTest(ansform, m_Child[IndexCount].transform);                m_Child[IndexCount].transform.DOMove(tempV3,1f,false);
IndexCount++;
}
}
}
private void MergeObject()
{
m_Timecurrent += Time.deltaTime;
if(m_Timecurrent <= m_TimeTotal && IndexCount < m_Child.Count)
{
if(Mathf.FloorToInt(m_Timecurrent)== m_TimeDisRe)
{
m_TimeDisRe += m_TimeDistance;
m_Child[IndexCount].transform.DOMove(m_InitPoint[IndexCount],3f,false);
IndexCount++;
}
}
}
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;
}
}
效果图:
三、对称型模型拆分
模型样例:
这种规则的,对称的,镜像的,正⽅形的,都可以使⽤下⾯的代码。
新建脚本SplitCube.cs,修改代码:
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SplitCube : MonoBehaviour
{
private Transform m_ParObj;//中⼼点
private List<GameObject> m_Child;//所有⼦对象
private List<Vector3> m_InitPoint =new List<Vector3>();//初始位置
private void Start()
{
m_ParObj = transform;
m_Child =GetChild(m_ParObj);//获取所有⼦对象
for(int i =0; i < m_Child.Count; i++)
{
m_InitPoint.Add(m_Child[i].transform.position);
}
}
//获取所有⼦对象
public List<GameObject>GetChild(Transform obj)
{
List<GameObject> tempArrayobj =new List<GameObject>();
foreach(Transform child in obj)
{
tempArrayobj.Add(child.gameObject);
}
return tempArrayobj;
}
private void Update()
{
if(Input.GetKeyDown(KeyCode.W))
{
//拆分
SplitObject();
}
if(Input.GetKeyDown(KeyCode.S))
{
//合并
MergeObject();
}
}
private void SplitObject()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。