【转载】模型实现拆装组合

转载链接: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中设置

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值