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

相关文章

Rust中的注释使用解读

《Rust中的注释使用解读》本文介绍了Rust中的行注释、块注释和文档注释的使用方法,通过示例展示了如何在实际代码中应用这些注释,以提高代码的可读性和可维护性... 目录Rust 中的注释使用指南1. 行注释示例:行注释2. 块注释示例:块注释3. 文档注释示例:文档注释4. 综合示例总结Rust 中的注释

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.