Unity3d C#实现场景编辑/运行模式下3D模型XYZ轴混合一键排序功能(含源码工程)

前言

在部分场景搭建中需要整齐摆放一些物品(如仓库中的货堆、货架等),因为有交互的操作在单个模型上,每次总是手动拖动模型操作起来也是繁琐和劳累。
在这背景下,我编写了一个在运行或者编辑状态下都可以进行一键排序模型的脚步。方便在场景搭建时,可以快速搭建这种有规律的模型;在运行时有模型排序功能需求时,能调用接口一键排序。

效果

X轴居中排序:
在这里插入图片描述

X轴左对齐排序:
在这里插入图片描述

XY轴左排序:
在这里插入图片描述

XY轴居中排序:
在这里插入图片描述

xyz轴居中排序:
在这里插入图片描述

多重嵌套排序:
在这里插入图片描述

多重嵌套YZ轴排序:

在这里插入图片描述

实现

功能的设计是在脚步的Inspector上进行排序相关的参数设置,并提供一键排序的按钮。点击后子节点按配置要求进行位置修改。

配置内容

首先是排序的对齐方式(alignment),这里提供如下枚举:

public enum RankAlign {Center =1,Left =2,Right = 3
}

Center为居中的方式,Left是以父节点的位置为左侧(这里不是严格意义上的左,而是从坐标轴的0–正轴方向排序),Right与Left相反。

其它配置,主要就是三个轴系中的配置内容:

    [Header("x轴对齐方式")]public RankAlign rankXAlign = RankAlign.Center;[Header("y轴对齐方式")]public RankAlign rankYAlign = RankAlign.Center;[Header("z轴对齐方式")]public RankAlign rankZAlign = RankAlign.Center;[Header("启用x轴排序)")]public bool isXAxis;[Header("启用y轴排序)")]public bool isYAxis;[Header("启用z轴排序)")]public bool isZAxis;[Header("x轴间距)")]public float XDis;[Header("y轴间距)")]public float YDis;[Header("z轴间距)")]public float ZDis;[Header("x轴默认值)")]public float XDef;[Header("y轴默认值)")]public float YDef;[Header("z轴默认值)")]public float ZDef;

其中 isXAxis、isYAxis和isZAxis是启用对应轴上排序的开关。

完整的配置如图:
在这里插入图片描述

排序逻辑

再者就是排序处理:

    public void RankingChildren() {int total = transform.childCount;if (isXAxis)XMidIdx = GetMiddleIndex(total, rankXAlign);if (isYAxis)YMidIdx = GetMiddleIndex(total, rankYAlign);if (isZAxis)ZMidIdx = GetMiddleIndex(total, rankZAlign);for (int i = 0; i < total; i++)SetRankPos(transform.GetChild(i), i, total);}

这里的处理就是根据各个轴排序对齐方式找到中间点,根据这个轴向上的中间点和节点间距计算出对应轴上的位置,如果不启用排序的则使用对应轴的默认值。

编辑器拓展

因为要使用编辑器的类Editor,所以要新建一个Editor文件夹放入编辑器拓展的脚本,或者在脚步中判断是否为编辑器环境。否则无法打包。这里在Editor文件夹下新建一个ModelRankingEditor脚本:

[CustomEditor(typeof(ModelRanking))]
public class ModelRankingEditor : Editor
{// Start is called before the first frame updatevoid Start(){}public override void OnInspectorGUI(){DrawDefaultInspector();ModelRanking modelRanking = (ModelRanking)target;if (GUILayout.Button("排序节点", new GUILayoutOption[] { GUILayout.ExpandWidth(false) })){modelRanking.RankingChildren();}
}
}

其处理方式就是重写OnInspectorGUI函数,绘制一个排序节点的按钮,按钮事件绑定RankingChildren() 函数。 还有一点要在编辑器未运行下可执行排序,脚本上需要加上
[ExecuteInEditMode]。

测试场景

测试场景可以随意搭建一下,基于SampleScene新建一个空节点,新增几个Cube节点作为子节点:

在这里插入图片描述

在排序节点上添加上排序脚本,进行简单的配置后,点击排序节点按钮即可:
在这里插入图片描述

如果需要,在程序运行中进行排序,可以使用AddComponent()来添加组件,
添加后对其配置属性进行简单设置,以上步骤也可以预先添加设置好;然后调用==modelRanking.RankingChildren();==函数进行排序即可。

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

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

相关文章

C#设计模式教程(10):装饰器模式

装饰器模式的定义 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许用户在不修改现有对象结构的情况下,动态地给一个对象添加额外的职责。这种模式创建了一个装饰类,用来包装原有的类。 这种模式创建了一个装饰类,用于包装原有的类,并在保持类方法签名完整性…

JS-元素尺寸与位置

通过js的方式&#xff0c;得到元素在页面中的位置 获取宽高 元素.offsetWidth 元素.offsetHeight 1&#xff09;获取元素的自身宽高、包括元素自身设置的宽高paddingborder 2&#xff09;获取出来的是数值&#xff0c;方便计算 3&#xff09;注意&#xff1a;获取的是可视…

C++中的指针、引用;左值、右值;左值引用、右值引用

一、指针、引用 引用指的是为已经创建的对象重新起一个名字。创建引用的时候&#xff0c;编译器只是将这个别名绑定到引用的对象上。 对象名提供了一种直接访问数据的方式&#xff0c;因为对象名本质上是数据所在的内存地址空间的一个地址映射。 引用提供了一种简介访问数据…

在 Python 中实现语音合成的四种方法

1 离线合成 pytts 配置环境 $ apt-get update $ apt-get install espeak $ pip install pyttsx3 $ apt-get install ffmpeg $ apt-get install alsa-utils运行程序 import pyttsx3engine pyttsx3.init() engine.setProperty(rate, 150) engine.setProperty(volume, 0.7)tex…

Python项目——搞怪小程序(PySide6+Pyinstaller)

1、介绍 使用python编写一个小程序&#xff0c;回答你是猪吗。 点击“是”提交&#xff0c;弹窗并退出。 点击“不是”提交&#xff0c;等待5秒&#xff0c;重新选择。 并且隐藏了关闭按钮。 2、实现 新建一个项目。 2.1、设计UI 使用Qt designer设计一个UI界面&#xff0c…

C#,入门教程(20)——列表(List)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(19)——循环语句&#xff08;for&#xff0c;while&#xff0c;foreach&#xff09;的基础知识https://blog.csdn.net/beijinghorn/article/details/124060844 List顾名思义就是数据列表&#xff0c;区别于数据数组&#xff08;arr…

redis复制和分区:主从复制、哨兵模式和集群模式

概述 在 Redis 中&#xff0c;复制和分区是用于数据冗余和性能扩展的关键特性。以下是主从复制、哨兵模式和集群模式的工作原理的简要概述&#xff1a; 主从复制 (Replication) 基本概念&#xff1a;Redis 的主从复制功能允许多个 Redis 服务器具有相同的数据副本。这在读取操…

WGAN损失函数解读

WGAN是Wasserstein GAN 解读

【大数据Hive】hive 行列转换使用详解

目录 一、前言 二、使用场景介绍 2.1 使用场景1 2.2 使用场景2 三、多行转多列 3.1 case when 函数 语法一 语法二 操作演示 3.2 多行转多列操作演示 四、多行转单列 4.1 concat函数 语法 4.2 concat_ws函数 语法 4.3 collect_list函数 语法 4.4 collect_set函…

《设计模式的艺术》笔记 - 命令模式

介绍 命令模式将一个请求封装为一个对象&#xff0c;从而可用不同的请求对客户进行参数化&#xff1b;对请求排队或者记录请求日志&#xff0c;以及支持可撤销的操作。命令模式是一种对象行为模式&#xff0c;其别名为动作模式或事务模式。 实现 myclass.h // // Created by …

数据预处理 matlab 数据质量评估

知乎 数据类型转换等 Mathworks 数据预处理 概念辨析 配对是同一批样本的前后比较&#xff0c;独立是两批不同样本的的比较 独立样本是指我们得到的样本是相互独立的。配对样本就是一个样本中的数据与另一个样本中的数据相对应的两个样本。配对样本可以消除由于样本指定的不公…

dpwwn:02

靶场下载地址 https://download.vulnhub.com/dpwwn/dpwwn-02.zip 环境配置 当打开此虚拟机环境的时候&#xff0c;可能会出现&#xff1a;当前硬件版本不支持设备“sata”。然后启动失败的情况~ 解决办法参考&#xff1a;https://www.cnblogs.com/yaodun55/p/16434468.html …

x-cmd pkg | fanyi - 命令行中英文翻译工具

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 fanyi 是命令行翻译工具&#xff0c;翻译数据来源于 icba.com 和 fanyi.youdao.com&#xff0c;仅支持中英文互译。支持 ChatGPT&#xff0c;可通过设置 OpenAI API 密钥以启用 ChatGPT 翻译。 注意&#xff1a;在 L…

QT上位机开发(动态数据采集与监控)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 上位机开发中,有一种类型的应用软件很特殊,它几乎没有什么交互操作,主要的工作就是检测和显示。如果说在此基础上有什么扩展的话,可能就是安全监控和报警。所以,这个上位机软件…

Flink SQL

Flink SQL 来源&#xff1a;B站尚硅谷 sql-client准备 Table API和SQL是最上层的API&#xff0c;在Flink中这两种API被集成在一起&#xff0c;SQL执行的对象也是Flink中的表&#xff08;Table&#xff09;&#xff0c;所以我们一般会认为它们是一体的。Flink是批流统一的处理…

银河麒麟V10安装mysql5.7

本文介绍如何在银河麒麟高级服务器操作系统下安装 Mysql 数据库 1.适配系统版本 适用系统&#xff1a;V10(SP1) 适用架构&#xff1a;X86、AARCH64、LOONGARCH64 其他版本和架构可作参考 2.安装说明 X86 和 AARCH 架构的源中自带 Mysql 安装包&#xff0c;所以可以下载对…

本地运行LlaMA 2的简易指南

大家好&#xff0c;像LLaMA 2这样的新开源模型已经变得相当先进&#xff0c;并且可以免费使用。可以在商业上使用它们&#xff0c;也可以根据自己的数据进行微调&#xff0c;以开发专业版本。凭借其易用性&#xff0c;现在可以在自己的设备上本地运行它们。 本文将介绍如何下载…

@RequestBody注解基础

RequestBody RequestBody注解一般与post方法使用。 一个请求中只能存在一个RequestBody注解。 RequestBody 用于接收前端传递给后端的json字符串中的数据。&#xff08;处理json格式的数据&#xff09; 语法格式&#xff1a; ​(RequestBody Map map) (RequestBody Object obje…

numpy数组的max、min、argmax和argmin计算方法

numpy数组的max、min、argmax和argmin计算方法 官方对numpy.max和numpy.min的说明 numpy.max 参考官方的理解 数组&#xff1a; 24611529 import numpy as npif __name__ __main__:a np.array([[2, 4, 6, 1], [1, 5, 2, 9]])print(a)print(np.argmax(a, axis0)) # ax…

Java医院信息管理系统

技术框架&#xff1a; springboot shiro layui jquery thymeleaf nginx 有需要的可以联系我。 运行环境&#xff1a; jdk8 mysql IntelliJ IDEA maven项目功能&#xff1a; 本项目是用springbootlayuishiro写的医院管理系统&#xff0c;系统的业务比较复杂&#x…