Unity3D拆分模型动画展示

news2024/12/23 19:17:05

系列文章目录

Unity工具


文章目录

  • 系列文章目录
  • 前言
  • 一、模型拆分功能
    • 1-1、首先先搭建一个简单的场景
    • 1-2、导入DoTween插件
    • 1-3、代码实现
    • 1-4、效果展示(一个一个拆分的)
  • 二、对称模型拆分
    • 2-1、规则的,镜像的,对称的都可以使用
    • 2-2、代码如下:
    • 2-3、效果展示(一键拆分的)
  • 三、不规则形状模型拆分
    • 3-1、先搭建一个不规则模型进行测试
    • 3-2、使用预分法拆分模型
    • 3-3、先把模型零件复制一份,然后把每一个零件手动拆分好(如下图)
    • 3-4、代码实现
    • 3-5、脚本设置如下图
    • 3-6、效果展示(不规则模型拆分)
  • 总结


前言

大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。


提示:以下是本篇文章正文内容,下面案例可供参考

一、模型拆分功能

1-1、首先先搭建一个简单的场景

在这里插入图片描述

1-2、导入DoTween插件

DoTween下载链接

1-3、代码实现

using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SplitController : 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.M))
        {
            m_Timecurrent = 0;
            m_TimeDisRe = 0;
            IndexCount = 0;
            m_IsSplitState = 1;
        }
        if (Input.GetKeyDown(KeyCode.N))
        {
            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(m_ParObj.transform, 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;
    }
}

1-4、效果展示(一个一个拆分的)

Unity模型拆分(一个一个的拆分)

二、对称模型拆分

2-1、规则的,镜像的,对称的都可以使用

2-2、代码如下:

using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SplitSymmetry : 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.M))
        {
            //拆分
            SplitObject();
        }
        if (Input.GetKeyDown(KeyCode.N))
        {
            //合并
            MergeObject();
        }
    }

    private void SplitObject()
    {
        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);
        }
    }

    private void MergeObject()
    {
        for (int i = 0; i < m_InitPoint.Count; i++)
        {
            m_Child[i].transform.DOMove(m_InitPoint[i], 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;
    }

}

2-3、效果展示(一键拆分的)

Unity模型拆分(一键拆分)

三、不规则形状模型拆分

3-1、先搭建一个不规则模型进行测试

在这里插入图片描述

3-2、使用预分法拆分模型

3-3、先把模型零件复制一份,然后把每一个零件手动拆分好(如下图)

在这里插入图片描述
在这里插入图片描述
隐藏的模型就是刚刚拼的模型

3-4、代码实现

using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SplitAnomaly : MonoBehaviour
{
    [Header ("移动之前的物体父节点")]
    public Transform m_ChildPointParent;//要移动的子对象的父物体
    private List<GameObject> m_Child;//所有子对象
    private List<Vector3> m_InitPoint = new List<Vector3>();//初始位置
    [Header("移动之后的物体父节点")]
    public Transform m_TargetPointParent;//目标点对象的父物体
    private List<GameObject> m_TargetChild;//目标点所有子对象
    private List<Vector3> m_TargetPoint = new List<Vector3>();//要移动的位置

    private void Start()
    {
        m_Child = GetChild(transform);//获取所有子对象
        for (int i = 0; i < m_Child.Count; i++)
        {
            m_InitPoint.Add(m_Child[i].transform.position);
        }

        m_TargetChild = GetChild(m_TargetPointParent);//获取所有目标点子对象
        for (int i = 0; i < m_TargetChild.Count; i++)
        {
            m_TargetPoint.Add(m_TargetChild[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.M))
        {
            //拆分
            SplitObject();
        }
        if (Input.GetKeyDown(KeyCode.N))
        {
            //合并
            MergeObject();
        }
    }

    private void SplitObject()
    {
        for (int i = 0; i < m_Child.Count; i++)
        {
            m_Child[i].transform.DOMove(m_TargetPoint[i], 3f, false);
        }
    }

    private void MergeObject()
    {
        for (int i = 0; i < m_InitPoint.Count; i++)
        {
            m_Child[i].transform.DOMove(m_InitPoint[i], 3f, false);
        }
    }
}

3-5、脚本设置如下图

在这里插入图片描述

3-6、效果展示(不规则模型拆分)

Unity模型拆分(不规则模型拆分)


总结

遇到规则的模型就用第一种方式,遇到不规则的就用第二种方。
不定时更新Unity开发技巧,觉得有用记得一键三连哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1320321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gitee提交代码步骤介绍(含git环境搭建)

1、gitee官网地址 https://gitee.com; 2、Windows中安装git环境 参考博客&#xff1a;《Windows中安装Git软件和TortoiseGit软件》&#xff1b; 3、设置用户名和密码 这里的用户名和密码就是登录gitee网站的用户名和密码如果设置错误&#xff0c;可以在Windows系统的“凭据管理…

八股文打卡day3——计算机网络(3)

面试题&#xff1a;请讲一下四次挥手的过程&#xff1f; 1.客户端发送FIN数据包给服务器&#xff0c;表示客户端不再发送数据给服务器&#xff0c;想要断开这个方向的连接。 2.服务器收到客户端的FIN包之后&#xff0c;发送ACK包给客户端&#xff0c;对收到的FIN包进行收到确认…

你也是爬虫高手?毫秒级抢票,光速入监狱

文章目录 前言案情介绍法院观点判决情况判决文书案例分析 关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前言 …

C++ 开发中为什么要使用继承

为何继承 实验介绍 继承是 C++ 中的特性之一,使用继承能够有效减轻工作量,使得开发更加高效。 知识点 什么是继承为何继承继承的内容权限关键字什么是继承 生活中继承是指孩子继承父亲的财产等。C++ 使用了这一思想,却又与生活中的继承不一样。 在使用继承时,派生类是…

cesium学习笔记(问题记录)——(三)

一、根据点跟角度计算另一点坐标&#xff08;三维球体&#xff09; export const getAnotherPoint (lon: number, lat: number, angle: number, distance: number) > {// WGS84坐标系var a 6378137; // 赤道半径var b 6356752.3142; // 短半径var f 1 / 298.257223563;…

valgrind定位C++线程/内存等错误

Valgrind 是一套 Linux 下&#xff0c;开放源代码&#xff08;GPL V2&#xff09;的仿真调试工具的集合。 Valgrind 由内核&#xff08;core&#xff09;以及基于内核的其他调试工具组成。内核类似于一个框架&#xff08;framework&#xff09;&#xff0c;它模拟了一个 CPU 环…

【漏洞复现】CVE-2023-47261 Dokmee ECM信息泄露致远程命令执行

漏洞描述 Dokmee ECM是一款国外企业内容管理 (ECM) 软件。每个公司的办公室每个角落都存放着文档、记录和档案。Dokmee 一系列解决方案可以帮助您高效地组织、保护和管理这些文件。支持的文件:PDF、TIFF、Word、Excel、Auto-CAD 绘图、电子邮件等。Dokmee 可以帮助您立即实现…

模型部署之模型转换

一、模型转换的意义 模型部署是为了模型能在不同框架间流转。 在实际应用时&#xff0c;模型转换几户都用于工业部署&#xff0c;负责模型从训练框架到部署侧推理框架的连接&#xff0c;这是因为随着深度学习随着深度学习应用和技术的演进&#xff0c;训练框架和推理框架的职…

在linux上基于shell自动部署Java项目

一&#xff0c;安装git yum list git 列出git安装包 yum install git 在线安装git 使用 git -varsion 查看是否安装成功 安装成功 二&#xff0c; Git克隆代码 git clone 远程仓库地址 三&#xff0c;创建shell脚本 touch shell.sh shell脚本 #!/bin/sh echo echo 自动…

1130 - Host “WIN-CA4FHERGO9J‘ is not allowed to connect to this MySQL server

1、知识小课堂 1.1 Mysql MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发&#xff0c;属于Oracle旗下产品。它是最流行的关系型数据库管理系统之一&#xff0c;在WEB应用方面&#xff0c;MySQL是最好的RDBMS (Relational Database Management System&am…

详解 Jeecg-boot 框架如何配置 elasticsearch

目录 一、下载安装 Elasticsearch 1、 地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch 2、下载完成后&#xff0c;解压缩&#xff0c;进入config目录更改配置文件 3、 修改配置完成后&#xff0c;前往bin目录启动el 4、访问&#xff1a;localhost:92…

Java对象结构

Java 对象(Object 实例)结构包括三部分:对象头、对象体、对齐字节。 Object的三个部分 对象头包括三个字段&#xff0c;第一个字段叫做 Mark Word(标记字)&#xff0c;用于存储自身运行时的数据 例如 GC 标志位、哈希码、锁状态等信息。 第二个字段叫做 Class Pointer(类对象…

排序算法——归并排序

void print_arr(int arr[], int n) {for (int i 0;i < n;i){printf("%d", arr[i]);}putchar("\n"); }//合并&#xff08;归并排序最主要的部分&#xff09; void merge(int arr[], int tempArr[],int left,int mid,int right) {//标记左半区第一个未排…

模型部署概述

一、前言 一般来说&#xff0c;学术界负责各种 SOTA(State of the Art) 模型的训练和结构探索&#xff0c;而工业界负责将这些 SOTA 模型应用落地&#xff0c;赋能百业。本文将要讲述的是&#xff0c;在 CV 场景中&#xff0c;如何实现模型的快速落地&#xff0c;赋能到产业应…

【PWN】学习笔记(三)【返回导向编程】(下)

目录 课程回顾ret2libc![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ebe1a9a9e54f4319946621dbe89c5774.png)做题 ret2libc2ret2libc3 课程 课程链接&#xff1a;https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12e7b4e6 课程…

Redis Set类型

集合类型也是保存多个字符串类型的元素的&#xff0c;但和列表类型不同的是&#xff0c;集合中 1&#xff09;元素之间是无序的 2&#xff09;元素不允许重复 一个集合中最多可以存储2的32次方个元素。Redis 除了支持集合内的增删查改操作&#xff0c;同时还支持多个集合取交…

利用python进行数据分析 第十四章 数据分析案例

本书正文的最后一章&#xff0c;我们来看一些真实世界的数据集。对于每个数据集&#xff0c;我们会用之前介绍的方 法&#xff0c;从原始数据中ᨀ 取有意义的内容。展示的方法适用于其它数据集&#xff0c;也包括你的。本章包含了一 些各种各样的案例数据集&#xff0c;可以用…

hypervisor display显卡节点card0生成过程

ditsi 配置 lagvm/LINUX/android/vendor/qcom/proprietary/devicetree/qcom direwolf-g9ph.dts #include "direwolf-vm-la.dtsi" direwolf-vm-la.dtsi #include "display/quin-vm-display-la.dtsi" quin-vm-display-la.dtsi //对应/sys/class/drm/card…

软件测试面试八股文(超详细整理)

请你说一说测试用例的边界 参考回答&#xff1a; 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充&#xff0c;这种情况下&#xff0c;其测试用例来自等价类的边界。 常见的边界值 1)对16-bit 的整数而言 32…

Python纯净式下载与安装

1. 下载 Download Python | Python.org 建议下老版本些的&#xff0c;毕竟求稳。 点击需要的版本&#xff0c;然后滑倒最下面&#xff0c;可以看到不同系统对应的下载选项&#xff1a; 2. 安装 如果下载慢的话&#xff0c;可以复制链接到迅雷下载&#xff0c;下载完成后&…