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

这篇具有很好参考价值的文章主要介绍了Unity3d C#实现场景编辑/运行模式下3D模型XYZ轴混合一键排序功能(含源码工程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

效果

X轴居中排序:
Unity3d C#实现场景编辑/运行模式下3D模型XYZ轴混合一键排序功能(含源码工程),Unity3D,c#,Unity拓展,Unity3d源码,Unity一键排序,Unity自定义编辑器

X轴左对齐排序:
Unity3d C#实现场景编辑/运行模式下3D模型XYZ轴混合一键排序功能(含源码工程),Unity3D,c#,Unity拓展,Unity3d源码,Unity一键排序,Unity自定义编辑器

XY轴左排序:
Unity3d C#实现场景编辑/运行模式下3D模型XYZ轴混合一键排序功能(含源码工程),Unity3D,c#,Unity拓展,Unity3d源码,Unity一键排序,Unity自定义编辑器

XY轴居中排序:
Unity3d C#实现场景编辑/运行模式下3D模型XYZ轴混合一键排序功能(含源码工程),Unity3D,c#,Unity拓展,Unity3d源码,Unity一键排序,Unity自定义编辑器

xyz轴居中排序:
Unity3d C#实现场景编辑/运行模式下3D模型XYZ轴混合一键排序功能(含源码工程),Unity3D,c#,Unity拓展,Unity3d源码,Unity一键排序,Unity自定义编辑器

多重嵌套排序:
Unity3d C#实现场景编辑/运行模式下3D模型XYZ轴混合一键排序功能(含源码工程),Unity3D,c#,Unity拓展,Unity3d源码,Unity一键排序,Unity自定义编辑器

多重嵌套YZ轴排序:

Unity3d C#实现场景编辑/运行模式下3D模型XYZ轴混合一键排序功能(含源码工程),Unity3D,c#,Unity拓展,Unity3d源码,Unity一键排序,Unity自定义编辑器

实现

功能的设计是在脚步的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是启用对应轴上排序的开关。

完整的配置如图:
Unity3d C#实现场景编辑/运行模式下3D模型XYZ轴混合一键排序功能(含源码工程),Unity3D,c#,Unity拓展,Unity3d源码,Unity一键排序,Unity自定义编辑器

排序逻辑

再者就是排序处理:

    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 update
    void 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节点作为子节点:

Unity3d C#实现场景编辑/运行模式下3D模型XYZ轴混合一键排序功能(含源码工程),Unity3D,c#,Unity拓展,Unity3d源码,Unity一键排序,Unity自定义编辑器

在排序节点上添加上排序脚本,进行简单的配置后,点击排序节点按钮即可:
Unity3d C#实现场景编辑/运行模式下3D模型XYZ轴混合一键排序功能(含源码工程),Unity3D,c#,Unity拓展,Unity3d源码,Unity一键排序,Unity自定义编辑器

如果需要,在程序运行中进行排序,可以使用AddComponent()来添加组件,
添加后对其配置属性进行简单设置,以上步骤也可以预先添加设置好;然后调用==modelRanking.RankingChildren();==函数进行排序即可。文章来源地址https://www.toymoban.com/news/detail-799251.html

到了这里,关于Unity3d C#实现场景编辑/运行模式下3D模型XYZ轴混合一键排序功能(含源码工程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity3D教程:触发器实现简单的场景跳转

    首先,需确保有一个想要跳转的目标场景。在本案例中,目标场景是ending。 第一步:创建一个碰撞体,放置在需要的触发场景跳转的位置。 第二步:删除多余的脚本,并且新建自己的脚本: 第三

    2024年02月12日
    浏览(56)
  • GameFrameWork框架(Unity3D)使用笔记(八) 实现场景加载进度条

            游戏在转换场景的时候,需要花费时间来加载相关的资源。而这个过程往往因为游戏场景的规模和复杂度以及玩家电脑配置的原因花费一小段时间(虽然这个项目里用不到)。         所以,如果这一小段时间,画面就卡在这里,啥也做不了,玩家也不知道啥时候能

    2024年02月02日
    浏览(49)
  • unity3d:asset store上C#代码热重载插件,不需要重运行,重新加载更新后函数

    https://assetstore.unity.com/packages/tools/utilities/hot-reload-edit-code-without-compiling-250972?clickref=1011lwHg8abvutm_source=partnerizeutm_medium=affiliateutm_campaign=unity_affiliate#description ●方法1:通过导航到Unity菜单栏中的“窗口”打开热重装窗口,然后选择“热重装”。 ●方法2:使用快捷键组合“Alt+Shift

    2024年02月02日
    浏览(52)
  • Unity3d 获取场景中摄像头视频流,实现直播效果(无需代码)

    下面是具体操作流程:   1. 搭建服务器,选用github 一个开源的 node.js服务器。 下载地址GitHub - iizukanao/node-rtsp-rtmp-server: RTSP/RTMP/HTTP hybrid server,点击克隆,选择ZIP下载。  2. 下载node.js( 官网链接 Node.js)   选择下载最新版本,并根据提示一步步安装即可。 3.搭建服务器。 找到

    2023年04月08日
    浏览(42)
  • Unity3D实现第一人称移动,随鼠标转动视角+上楼梯(C#)

    第一人称移动: 1、在层级面板创建一个Capsule,命名为Player,将层级面板中的相机拖到Player下方 2、重置Player和摄像机的Transform数值(方便调整摄像机在Player上的位置),然后调整摄像机在Player上的位置 大概将摄像机放到Player眼睛的位置即可。 3、创建一个脚本,命名为Came

    2024年02月13日
    浏览(58)
  • 【Unity3D编辑器开发】Unity3D中实现Transform快速复制粘贴【非常实用】

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 在开发中,常常会遇到频繁复制粘贴物体的坐标、旋转、缩放的操作。 使用Unity自带的组件复制粘贴比

    2024年02月07日
    浏览(69)
  • 【Unity3D编辑器开发】Unity3D中实现查看键盘对应KeyCode值面板【方便开发】

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 在开发中,会遇到要使用监控键盘输入的KeyCode值来执行代码的情况。 比如说: 但是,如果是一些不常

    2024年02月08日
    浏览(78)
  • 【Unity3D】缩放、平移、旋转场景

    1 前言         场景缩放、平移、旋转有两种实现方案,一种是对场景中所有物体进行同步变换,另一种方案是对相机的位置和姿态进行变换。         对于方案一,如果所有物体都在同一个根对象下(其子对象或孙子对象),那么只需要对根对象施加变换就可以实现场景变

    2023年04月22日
    浏览(57)
  • 【Unity3D】Unity3D 软件安装 ( 注册账号并下载 Unity Hub | 安装 Unity Hub | 获取个人版授权 | 中文环境设置 | 安装 Unity3D 编辑器 )

    Unity 官方网站 : 英文 : https://unity.com 中文 : https://unity.cn 进入 中文网站 https://unity.cn , 点击右上角的 \\\" 下载 Unity \\\" 按钮 ; 推荐下载 Unity3D 的长期支持版本 ; 点击界面中的 \\\" 下载 Unity Hub \\\" 选项 ; 根据你的系统 , 选择对应的 Unity Hub , 我在 Windows 上开发 , 因此选择 \\\" Windows 下载 \\\"

    2024年01月25日
    浏览(101)
  • Unity3D-场景中3D物体添加点击事件

    Unity3D - 场景中3D物体添加鼠标点击事件 鼠标点击3D物体触发,Unity从本质上来说有两种:一种是通过事件(event)触发,一种是通过射线(ray)判断穿过的物体触发。这两种触发的原理是不同的,不论哪种触发都必须满足触发的要求才可以,既然原理不同,触发的要求也不一样

    2024年02月08日
    浏览(86)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包