2025-01-04 Unity插件 YodaSheet2 —— 基础用法

文章目录

  • 环境配置
  • 1 创建 YadeSheetData
  • 2 读取方式
    • 2.1 表格读取
    • 2.2 列表读取
  • 3 自定义设置
    • 3.1 修改代码生成位置
    • 3.2 添加列表支持
      • 3.2.1 修改 DataTypeMapper.cs
      • 3.2.2 修改 SheetDataExtensions.cs
      • 3.2.3 修改 CodeGeneratorEditor.cs
      • 3.2.4 测试

​ 官方文档: Unity 亚德表 — Yade Sheet for Unity。

​ 本文介绍基本使用方法与部分心得。

环境配置

  • Unity 版本:6000.0.26f1c1
  • YadeSheet 版本:1.5.5

1 创建 YadeSheetData

  1. 在 Project 窗口中右键单击并选择 创建 -> Yade Sheet 菜单以创建 yade 工作表文件,将其命名为 TestSheet 。
image-20250104014033855
  1. 双击 TestSheet 文件开始编辑,例如:
image-20250104014156449

2 读取方式

2.1 表格读取

  1. 创建名为 Test.cs 的 MonoBehaviour 脚本,声明 public 的 YadeSheetData 字段 sheet,在 Start 函数中打印表格中的内容。
using UnityEngine;
using Yade.Runtime;

public class Test : MonoBehaviour
{
    public YadeSheetData Sheet;

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        // 读取第 0 行第 0 列的 Cell
        Debug.Log(Sheet.GetCell(0, 0).GetValue()); // Result: "Hello"
        
        // 读取 B1 Cell
        Debug.Log(Sheet.GetCell("B1").GetValue()); // Result: "Samples"
    }

    // Update is called once per frame
    void Update()
    { }
}
  1. 在场景中创建空物体 Test 并挂载 Test.cs 脚本,关联 TestSheet,运行后即可得到输出结果。
image-20250104014736520 image-20250104014902125

2.2 列表读取

​ 这种读取方式将表格中的每一行看做一个 Item,整个表格即为 List<Item>

image-20250104015627556
  1. 创建 Item 的 C# 数据结构。

    依次点击 “1” -> “2”,创建 Item 的字段。

    • Index:要设置的列。
    • Alias:简短描述。
    • Field:用于内置代码生成器生成类的 Field 名,只能输入只能与数字、字母和_组合的单词,不能以数字开头
    • Type:用于内置代码生成器生成类中字段的类型。
image-20250104015935431
  1. 在标题区右键,可选择显示 Type、Field、Alias。
image-20250104020437395
  1. 依次点击 “1” -> “2”,输入要生成的 C# 代码名,下方有预览。
image-20250104020602740
  1. 点击生成,默认生成在 “Asset” -> “Yade” -> “CodeGen” 目录下。

    [DataField(0)] 特性表示 Name 对应第 0 列的数据。

image-20250104021054949
using System;
using Yade.Runtime;

public class Data
{
	/// <summary>
	/// 字符串1
	/// </summary>
	[DataField(0)] public String Name;

	/// <summary>
	/// 字符串2
	/// </summary>
	[DataField(1)] public String Content;

	[DataField(2)] public String _C;
	[DataField(3)] public String _D;
	[DataField(4)] public String _E;
	[DataField(5)] public String _F;
	[DataField(6)] public String _G;
}


// Generated by Yade (http://u3d.as/1VtP)
  1. 接下来,即可将 TestSheet 转换为 List 进行读取:
using UnityEngine;
using Yade.Runtime;

public class Test : MonoBehaviour
{
    public YadeSheetData Sheet;

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        List<Data> list = Sheet.AsList<Data>();
        
        Debug.Log(list[2].Name);    // Result: "Hello2"
        Debug.Log(list[3].Content); // Result: "Samples3"
    }

    // Update is called once per frame
    void Update()
    { }
}

3 自定义设置

3.1 修改代码生成位置

​ 依据路径 “Asset” -> “Yade” -> “Editor” -> “Components” -> “Common”,找到目录下的 “CodeGeneratorEditor.cs” 代码文件。

image-20250104021908624

​ 在第 286 行的 Create() 方法中修改默认生成路径。

image-20250104022058658

3.2 添加列表支持

​ 原生支持类型如下,可以看到,有许多不必要且不常用的类型(最后一行为自定义扩展类)。

image-20250104022323613

3.2.1 修改 DataTypeMapper.cs

​ 依据路径 “Asset” -> “Yade” -> “Runtime” -> “Common”,找到目录下的 “DataTypeMapper.cs” 代码文件。

image-20250104022746446

​ 第 66 行 ~ 91 行定义了支持的内置类型。

image-20250104022943614

​ 许多不常用,我们修改如下(注意保持排序):

image-20250104023116634

3.2.2 修改 SheetDataExtensions.cs

​ 依据路径 “Asset” -> “Yade” -> “Runtime” -> “Extensions”,找到目录下的 “SheetDataExtensions.cs” 代码文件。

image-20250104023330236

​ 第 65 行 ~ 80 行给出了对应类型的转换器 Parser。

image-20250104023432092

​ 同样,修改如下。

image-20250104023549109

​ 同时,创建对应的转换方法即可。这里我使用 “|” 分隔元素。

private static List<string> ListStringParse(string arg)
{
    var list = new List<string>();
    var strs = arg.Split('|');
    foreach (var str in strs)
    {
        list.Add(str.TrimStart().TrimEnd());
    }
    return list;
}

private static List<float> ListFloatParse(string arg)
{
    var list = new List<float>();
    var strs = arg.Split('|');
    foreach (var str in strs)
    {
        list.Add(Convert.ToSingle(str.TrimStart().TrimEnd()));
    }
    return list;
}

private static List<int> ListIntParse(string arg)
{
    var list = new List<int>();
    var strs = arg.Split('|');
    foreach (var str in strs)
    {
        list.Add(Convert.ToInt32(str.TrimStart().TrimEnd()));
    }
    return list;
}

​ 回到编辑器页面,可以看到添加了 List 类型,同时删除了许多不常用的内置类型。

image-20250104023946013

​ 之后,将第 253 ~ 275 行注释,这段代码会捕获 List 类型,导致转换失败。注释后 List 类型会直接进入第 278 行的 else 块中,这段代码将正确处理 List 类型。

image-20250104031709884

3.2.3 修改 CodeGeneratorEditor.cs

​ 到此并没有结束,生成代码时,发现 List 类型不正确:

image-20250104024323493

​ 这和 CodeGen 有关,因此,我们回到 “Asset” -> “Yade” -> “Editor” -> “Components” -> “Common”,找到目录下的 “CodeGeneratorEditor.cs” 代码文件。在第 180 行 ~ 190 行的 GetCodeGenerated() 函数中,没有处理泛型类型的情况。

image-20250104025144698

​ 替换为如下代码,同时在 “CodeGeneratorEditor.cs” 中导入 System.Array 命名空间:

var typeString = type.ToString();
if (type.IsGenericType)
{
    // 获取类型的名称,不包括泛型参数的部分
    string baseName = type.GetGenericTypeDefinition().Name;

    // 去掉类型名称中的数字,例如 List`1 -> List
    baseName = baseName.Substring(0, baseName.IndexOf('`'));

    // 获取泛型参数的类型名称,并去掉其命名空间部分
    var    genericArgs    = type.GetGenericArguments();
    string genericArgsStr = "<" + string.Join(", ", Array.ConvertAll(genericArgs, t => t.Name)) + ">";

    typeString = baseName + genericArgsStr;
}
else if (typeString.Contains("+"))
{
    var temp = typeString.Split(new char[] { '+' }, System.StringSplitOptions.RemoveEmptyEntries);
    namespaces.AppendLine(string.Format("using static {0};", temp[0]));
    typeString = temp[1];
}
else if (typeString.StartsWith("System."))
{
    typeString = typeString.Substring(7);
}

​ 最后,还需要在第 156 行添加命名空间 “System.Collections.Generic” 的写入,以在生成代码中支持泛型类的使用。

image-20250104025826600

3.2.4 测试

​ 以如下表格为例,生成到 Data.cs 文件中。

image-20250104025521907

​ 打开 Data.cs 代码,没有报错。

image-20250104030018550

​ 重新修改 Test.cs 脚本,运行,成功读取 List。

using System.Collections.Generic;
using UnityEngine;
using Yade.Runtime;

public class Test : MonoBehaviour
{
    public YadeSheetData Sheet;

    public List<float> Content1;
    public List<float> Content2;
    public List<float> Content3;
    public List<float> Content4;

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        var list = Sheet.AsList<Data>();

        foreach (var data in list)
        {
            Debug.Log(data.Name);
        }
        
        Content1 = list[0].Content;
        Content2 = list[1].Content;
        Content3 = list[2].Content;
        Content4 = list[3].Content;
    }

    // Update is called once per frame
    void Update()
    { }
}
image-20250104032139815

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索 JMeter While Controller:循环测试的奇妙世界

嘿&#xff0c;宝子们&#xff01;今天咱们就来聊聊 JMeter 里超级厉害的 While 控制器&#xff0c;它就像是一把神奇的钥匙&#xff0c;能帮我们打开循环测试的大门&#xff0c;模拟出各种各样复杂又有趣的场景哦&#xff01; 一、While 控制器初印象 想象一下&#xff0c;你…

Linux中隐藏操作身法

从历史记录中删除指定的命令 假设历史记录中已经包含了一些你不希望记录的命令。这种情况下我们怎么办&#xff1f;很简单。通过下面的命令来删除&#xff1a; history | grep "keyword"例如:history | grep set o history 批量第二条和第四条删除&#xff1a; sed…

单片机--51- RAM

1.概览某个51单片机对空间区域的划分&#xff1a; 2.RAM被分配的区域是256bytes&#xff0c; 通常8051单片机ram是128bytes 8052的ram是256bytes&#xff08;其中高128位的地址和sfr区域地址重合&#xff0c;物理区域不同&#xff09; extern uint32_t alarm_cnt_1; uint32…

使用GitLab+Jenkins搭建CICD执行环境

使用GitLabJenkins搭建CI\CD执行环境 前言什么是DevOps&#xff1f;什么是CI/CD&#xff1f;使用GitLabJenkins搭建CI\CD执行环境GitLab安装1. 安装和配置所需的依赖2. 下载并安装极狐GitLab3. 登录极狐GitLab 实例4.常用gitlab指令5.修改密码 Jenkins安装1.Jenkins 的主要特点…

仿生的群体智能算法总结之一(十种)

群体智能算法是一类通过模拟自然界中的群体行为来解决复杂优化问题的方法。以下是10种常见的群体智能算法: 编号 算法名称(英文) 算法名称(中文) 年份 作者 1 Ant Colony Optimization (ACO) 蚁群优化算法 1991 Marco Dorigo 2 Particle Swarm Optimization (PSO) 粒子群优…

【管道——二分+区间合并】

题目 思路 区间合并 1、按照左端点排序2、遍历窗口&#xff0c;若窗口非法&#xff0c;继续遍历&#xff1b;否则执行33、若是第一个窗口&#xff0c;设定合并结果初值&#xff0c;判断结果左端点是否造成“起点过大”&#xff0c;是&#xff0c;FALSE退出&#xff1b;否则执行…

《Rust权威指南》学习笔记(三)

泛型和trait 1.泛型可以提高代码的复用能力&#xff0c;泛型是具体类型或其他属性的抽象代替&#xff0c;可以看成是一种模版&#xff0c;一个占位符&#xff0c;编译器在编译时会将这些占位符替换成具体的类型&#xff0c;这个过程叫做“单态化”&#xff0c;所以使用泛型的…

Unity 中计算射线和平面相交距离的原理

有此方法 能够计算射线和平面是否相交以及射线起点到平面交点的距离 代码分析 var dot Vector3.Dot(ray.direction, plane.normal);计算射线和平面法线的点积&#xff0c;如果大于等于0&#xff0c;则说明射线和平面没有相交&#xff0c;否则&#xff0c;说明射线和平面相交…

Docker安装Prometheus和Grafana

概念简述 安装prometheus 第一步&#xff1a;确保安装有docker 第二步&#xff1a;拉取镜像 第三步&#xff1a;准备相关挂载目录及文件 第四步&#xff1a;启动容器 第五步&#xff1a;访问测试 安装grafana 第一步&#xff1a;确保安装有docker 第二步&#xff1a;拉…

《Rust权威指南》学习笔记(一)

基本介绍 1.Rust使用场景 &#xff1a;需要运行速度、需要内存安全、更好的利用多处理器。程序员无法在安全的Rust代码中执行任何非法的内存操作。相对于C#等带有垃圾回收机制的语言来讲&#xff0c;Rust遵循了零开销抽象&#xff08;Zero-Cost Abstraction&#xff09;规则&a…

才气小波与第一性原理

才气小波与第一性原理 才气小波与第一性原理具身智能云藏山鹰类型物热力学第二定律的动力机械外骨骼诠释才气小波导引社会科学概论软凝聚态数学意气实体过程王阳明代数Wangyangmingian王阳明算符才气语料库命运社会科学概论意气实体过程业务分层框架示例 才气小波与第一性原理 …

JAVA:利用 Redis 实现每周热评的技术指南

1、简述 在现代应用中&#xff0c;尤其是社交媒体和内容平台&#xff0c;展示热门评论是常见的功能。我们可以通过 Redis 的高性能和丰富的数据结构&#xff0c;轻松实现每周热评功能。本文将详细介绍如何利用 Redis 实现每周热评&#xff0c;并列出完整的实现代码。 2、需求分…

Fabric环境部署-安装Go

安装go语言环境 国内镜像&#xff1a;Go下载 - Go语言中文网 - Golang中文社区 1.选择版本下载后解压&#xff1a;注意go1.11.linux-amd64.tar.gz换成你下的 sudo tar zxvf go1.21.linux-amd64.tar.gz -C /usr/local 2.. 创建Go目录 mkdir $HOME/go 3. 用vi打开~./bashrc&…

计算队列中的‘捣乱分子’对数:一种量化无序程度的方法

计算队列中的‘捣乱分子’对数:一种量化无序程度的方法 前言解题思路关键点实现代码时间复杂度分析前言 在日常生活中,我们经常会遇到需要排队的场景,比如买票、候车、就餐等。在理想的排队情况下,人们会按照某种顺序(如先到先服务)整齐地排成一列。然而,总有一些人不遵…

信号的产生、处理

一、信号的概念 信号是linux系统提供的一种&#xff0c;向指定进程发送特定事件的方式。收到信号的进程&#xff0c;要对信号做识别和处理。信号的产生是异步的&#xff0c;进程在工作过程中随时可能收到信号。 信号的种类分为以下这么多种&#xff08;用指令kill -l查看&…

【机器学习】机器学习的基本分类-自监督学习-对比学习(Contrastive Learning)

对比学习是一种自监督学习方法&#xff0c;其目标是学习数据的表征&#xff08;representation&#xff09;&#xff0c;使得在表征空间中&#xff0c;相似的样本距离更近&#xff0c;不相似的样本距离更远。通过设计对比损失函数&#xff08;Contrastive Loss&#xff09;&…

Flutter-插件 scroll-to-index 实现 listView 滚动到指定索引位置

scroll-to-index 简介 scroll_to_index 是一个 Flutter 插件&#xff0c;用于通过索引滚动到 ListView 中的某个特定项。这个库对复杂滚动需求&#xff08;如动态高度的列表项&#xff09;非常实用&#xff0c;因为它会自动计算需要滚动的目标位置。 使用 安装插件 flutte…

国内Ubuntu环境Docker部署CosyVoice

国内Ubuntu环境Docker部署CosyVoice 本文旨在记录在 国内 CosyVoice项目在 Ubuntu 环境下如何使用 dockermin-conda进行一键部署。 源项目地址&#xff1a; https://github.com/FunAudioLLM/CosyVoice 如果想要使用 dockerpython 进行部署&#xff0c;可以参考我另一篇博客中的…

计算机网络•自顶向下方法:网络层介绍、路由器的组成

网络层介绍 网络层服务&#xff1a;网络层为传输层提供主机到主机的通信服务 每一台主机和路由器都运行网络层协议 发送终端&#xff1a;将传输层报文段封装到网络层分组中&#xff0c;发送给边缘路由器路由器&#xff1a;将分组从输入链路转发到输出链路接收终端&#xff1…

信创云之天翼云:引领信创云时代的先锋力量

数据显示&#xff0c;2024年中国云服务市场规模已达到4242.5亿元&#xff0c;显示出各行业对信息技术软硬件的依赖程度不断加深。在国家政策的持续支持下&#xff0c;数字化转型为云服务行业带来了前所未有的发展机遇。预计到2025年&#xff0c;中国云服务市场规模将突破4795.4…