转载链接:Unity实现通用的设备拆分、组装效果控制脚本_xiaochenXIHUA的博客-CSDN博客
实现模型拆装组合功能脚本
1.代码段
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ctrl_EquipmentSplit : MonoBehaviour {
public bool isOpenSplit = true; //定义 //是否开启拆装功能
public bool isSplitMark = false; //是否拆分标识
public float moveSpeed = 0.1F; //移动速度
public GameObject ObjMain;
public static float t = 0;
public Transform[] allEqParts = new Transform[0]; //所有的设备部件
public Transform[] eqPartTarget = new Transform[0]; //设备部件的目标位置
private Dictionary<string, Vector3> _EqPartInitPosition = new Dictionary<string, Vector3>(); //设备部件的初始位置
void Start()
{
//获取到设备的初始位置
GetEqInitPosition(allEqParts, _EqPartInitPosition);
}
void Update()
{
if (isOpenSplit)
{
Debug.Log("运行了这个开关");
//Log.Write("开启测试拆分脚本");
//进行拆分
if (isSplitMark)
{
Debug.Log("已经进行了拆分");
//Log.Write("拆分设备部件");
//移动方法
MoveMethod(allEqParts, eqPartTarget, moveSpeed);
}
else
{
//返回方法
BackMethod(allEqParts, _EqPartInitPosition, moveSpeed);
}
}
}
//私有的方法 获得拆分之前 原本的位置信息
private void GetEqInitPosition(Transform[] allEqParts, Dictionary<string, Vector3> eqPartInitPosition)
{
if (allEqParts != null)
{
int count = allEqParts.Length;
for (int i = 0; i < count; i++)
{
if (eqPartInitPosition.ContainsKey(allEqParts[i].name))
{
eqPartInitPosition[allEqParts[i].name] = allEqParts[i].localPosition;
}
else
{
eqPartInitPosition.Add(allEqParts[i].name, allEqParts[i].localPosition);
}
}
}
}
//定义一个私有的方法 移动到的位置信息
private void MoveToTargetPosition(Transform curGameObj, Vector3 targetPos, float moveSpeed)
{
if (curGameObj != null && targetPos != null && moveSpeed > 0)
{
curGameObj.localPosition = Vector3.MoveTowards(curGameObj.localPosition, targetPos, moveSpeed);
}
else
{
Debug.Log("当前移动速度小于等于0,请重新输入!!!");
}
}
private void MoveMethod(Transform[] allEqPart, Transform[] target, float moveSpeed)
{
//Log.Write("开始拆分");
Debug.Log("开始拆分");
if (allEqPart != null && target != null && moveSpeed > 0)
{
int count = allEqPart.Length;
for (int i = 0; i < count; i++)
{
//当前位置移动到目标位置
MoveToTargetPosition(allEqPart[i], target[i].localPosition, moveSpeed);
}
}
}
private void BackMethod(Transform[] allEqPart, Dictionary<string, Vector3> initPos, float moveSpeed = 3F)
{
if (allEqPart != null && initPos != null && moveSpeed > 0)
{
int count = allEqPart.Length;
for (int i = 0; i < count; i++)
{
if (initPos.ContainsKey(allEqPart[i].name))
{
//当前位置移动到目标位置
MoveToTargetPosition(allEqPart[i], initPos[allEqPart[i].name], moveSpeed);
}
}
}
}
}
2.unity中设置