Zed-Unity插件代码注释——ZEDLayersManager.cs

2023-11-04 22:38

本文主要是介绍Zed-Unity插件代码注释——ZEDLayersManager.cs,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • Zed-Unity插件代码注释——ZEDLayersManager.cs
    • 引言
    • 基础环境
    • ZEDLayersManager.cs脚本介绍
    • 代码(注释后)

Zed-Unity插件代码注释——ZEDLayersManager.cs

引言

略(2020-09-01 15.50)

基础环境

略(2020-09-01 15.58)

ZEDLayersManager.cs脚本介绍

  • 脚本位置:

在这里插入图片描述

  • 脚本功能:

这个脚本比较短,主要是在Unity启动的时候创建两个图层,一个图层可以在AR模式下被看到,一个看不到。 这个是为了混合现实的时候,控制用户看到的对象。例如把Unity的背景放在看不到的图层里面,然后把虚拟的人物放在可看到的图层里面。同时里面还定义了一个方法用以清除图层。

  • 脚本使用
    这个脚本是在编辑器阶段使用的,一般我们不会直接对里面的函数进行调用,但是里面创建的两个图层对我们来说比较重要。
    unity中默认一共有31个图层,但不一定全都会被使用上,一般0~7图层被unity默认占用,我们只可以自定义8 ~ 31的图层。
    这个脚本默认情况下会把不可见的图层定义在16层, 而把可见的ar图层定义在30层。具体原因可能跟习惯有关???
    在这里插入图片描述
  • 代码结构
    这个脚本比较短,代码结构比较简单,就是先定义了一个图层结构体,里面是图层的一些固定参数,然后定义了图层管理类,类里面两个函数,一个用于创建指定2个图层,一个用于清除给定名称的图层。
    在这里插入图片描述

代码(注释后)

#if UNITY_EDITOR  //Editor Lance: 条件编译, 指的是满足条件的话 把下面的引用对象添加进来
using UnityEditor;
#endif
/** Editor:lance**/
/// <summary>
/// This class creates automaticaly layers on load
/// 此类在加载时自动创建图层
/// Editor lances:创建的这个图层估计是ZED对象的主要图像 例如 画布等
/// </summary>
public struct ZEDLayers
{public static int tagInvisibleToZED = 16; //不可见的图层序号为16层,public static string ID_tagInvisibleToZED = "tagInvisibleToZED";  //图层名称,这个图层对ZED是不可见的//这个估计指的是在AR模式下 用户看不见的图层,例如Unity中的背景public static int arlayer = 30 ;    //定义 AR的图像序号,为30层,public static string ID_arlayer = "arlayer";  // AR图层的名称
}#if UNITY_EDITOR[InitializeOnLoad] // Editor Lance: 监听Unity启动事件 https://blog.csdn.net/huutu/article/details/42318499
public static class ZEDLayersManager
{static ZEDLayersManager() //构造函数,类的初始化{CreateLayer(ZEDLayers.ID_tagInvisibleToZED, ZEDLayers.tagInvisibleToZED); //创建ZED不可见的图层CreateLayer(ZEDLayers.ID_arlayer, ZEDLayers.arlayer);//创建AR图层}/// <summary>/// 创建图层的函数/// </summary>/// <param name="layerName"> 图层名称</param>/// <param name="layerIndex">图层序号</param>public static void CreateLayer(string layerName, int layerIndex){// Editor Lance: 代码的用法 https://docs.unity3d.com/ScriptReference/AssetDatabase.LoadAllAssetsAtPath.htmlUnityEngine.Object[] asset = AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset"); // Editor Lance:加载Unity工程里面的TagManager的资源if (layerIndex < 7 || layerIndex > 31) return; //Invalid ID.  Editor Lance:unity默认占用了0~7的图层,然后只有8~31的图层可以被自定义if ((asset != null) && (asset.Length > 0)) //资源里面有东西{//Editor Lance: 官方解释 https://docs.unity3d.com/ScriptReference/SerializedObject.html 但是我没看懂具体的意思//Editor Lance: 博客解释 https://blog.csdn.net/weixin_30360497/article/details/98998280?utm_medium=distribute.pc_relevant.none-task-blog-title-1&spm=1001.2101.3001.4242//Editor Lance: 大概的意思就是生成的这个实例是一个被序列化的物品对象,序列化的意思是说在面板上是可见的。SerializedObject serializedObject = new SerializedObject(asset[0]); //asset[0]应该是主要的对象SerializedProperty layers = serializedObject.FindProperty("layers");  // 这个对象有一个叫layers字段的属性for (int i = 0; i < layers.arraySize; ++i) //这个对象是个数组?遍历其中的元素{if (layers.GetArrayElementAtIndex(i).stringValue == layerName) //如果存在我们要创建的层,则修改对应的图层序号{layerIndex = i;//return;     // Layer already present, update layerindex value.}}// Editor Lance:如果上面遍历后发现没有我们要的图层,我们要重新创建if (layers.GetArrayElementAtIndex(layerIndex).stringValue == "") // 如果索引的图层还是空的{layers.GetArrayElementAtIndex(layerIndex).stringValue = layerName; // 赋值图层名称serializedObject.ApplyModifiedProperties(); //应用修改后的属性serializedObject.Update();//更新if (layers.GetArrayElementAtIndex(layerIndex).stringValue == layerName){return;     // to avoid unity locked layer}}}}/// <summary>/// 清除指定的图层名曾/// </summary>/// <param name="layerName"></param>public static void ClearLayer(string layerName){UnityEngine.Object[] asset = AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset");if ((asset != null) && (asset.Length > 0)){SerializedObject serializedObject = new SerializedObject(asset[0]);SerializedProperty layers = serializedObject.FindProperty("layers"); //Editor Lance:前面代码可以认为是对图层操作的固定代码for (int i = 0; i < layers.arraySize; ++i){if (layers.GetArrayElementAtIndex(i).stringValue == layerName){layers.GetArrayElementAtIndex(i).stringValue = "";}}serializedObject.ApplyModifiedProperties(); //需要调用这两个函数,才可以完成修改serializedObject.Update();//需要调用这两个函数,才可以完成修改}}
}
#endif

这篇关于Zed-Unity插件代码注释——ZEDLayersManager.cs的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/345631

相关文章

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪