Unity C#结构体的总结/使用详解

简介: Unity C#结构体的总结/使用详解 本文提供全流程,中文翻译。 助力快速理解 C# 结构体的具体用法 为新手节省宝贵的时间,避免采坑! 在 Unity 中,鉴于这种情况,我们可以使用结构体,然后将其序列化,显示在 Inspector 面板上 并用 LIst 列表/或者数组完成批量的可视...

Unity C#结构体的总结/使用详解


本文提供全图文流程,中文翻译。

Chinar 坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)

Chinar —— 心分享、心创新!

助力快速理解 C# 结构体的具体用法

给新手节省宝贵的时间,避免采坑!


Chinar 教程效果:
Struct_2

全文高清图片,点击即可放大观看 (很多人竟然不知道)


1

Struct —— 结构体

C# 中,结构体是值类型数据结构。

它使得一个单一变量可以存储各种数据类型的相关数据, struct 关键字用于创建结构体。

结构体是用来代表一个记,其中存储我们自定义的各种类型数据。

结构体的具体特性,这里就不多说了,菜鸟教程/百度大神都有更为详细的解释




我只讲写实在的,便于新手理解、应用

很多时候,我们使用它,是为了整理数据结构

使得我们的数据逻辑,更加简单、清晰、便于我们理解与操作
举个例子
比如:我们要管理一个游戏中所有的怪物信息数据

我们就需要记录每种怪物的数据,其中可能有怪物类型、血量、出生位置、等等信息...

如果管理停车场中的所有汽车,我们就需要记录每种怪物的数据,其中可能有车牌号、型号、价格、车主等等信息

此时,我们如果通过手写变量去 大量的声明对象,以及对象的其他诸如此类的属性,工作量将非常大




例如以下这样:甚至,更多的怪物种类,写着、写着就懵逼了

后期,要修改某个怪物的对应属性,查找起来非常麻烦

就算我们使用构造函数,虽然简化了代码,但如果怪物种类过多,后期维护起来,也是个麻烦事

using UnityEngine;


/// <summary>
/// 怪物类
/// </summary>
public class Enemy
{
    public string  Name;
    public int     Id;
    public Vector3 Pos;
    public Color   Color;
}

/// <summary>
/// 结构体测试类
/// </summary>
public class ChinarStruct : MonoBehaviour
{
    /// <summary>
    /// 初始化函数
    /// </summary>
    void Start()
    {
        Enemy enemy1 = new Enemy
        {
            Name  = "小兵",
            Id    = 1,
            Pos   = new Vector3(0, 0, 0),
            Color = new Color(0, 1, 1)
        };

        Enemy enemy2 = new Enemy
        {
            Name  = "中兵",
            Id    = 2,
            Pos   = new Vector3(1, 2, 3),
            Color = new Color(1, 0, 1)
        };

        Enemy enemy3 = new Enemy
        {
            Name  = "大兵",
            Id    = 3,
            Pos   = new Vector3(4, 5, 6),
            Color = new Color(1, 1, 1)
        };

        Enemy enemy4 = new Enemy
        {
            Name  = "Boss",
            Id    = 4,
            Pos   = new Vector3(100, 200, 300),
            Color = new Color(1, 1, 0)
        };
    }
}

Unity 中,鉴于这种情况,我们可以使用结构体,然后将其序列化,显示在 Inspector 面板上

并用 LIst列表/或者数组完成批量的可视化设定每一种怪物的参数

这样,数据逻辑就会非常清晰,并且在我们使用怪物数据时,也会非常方便,而不需一个个的去手动写入数据


2

Disposal Data —— 整理数据


那么我们这时候,使用结构体来规整我们的数据

让怪物的各种参数显示在 Inspector 层次面板上

那么后期,我们需要对某一个怪物的属性进行变更时,只需要在面板上更改到我们要的值即可

全程可视化操作,要比 1 中找字符串、更改代码要简单/方便许多
举个例子
1. 我们创建一个怪物的结构体,你可以理解为一个怪物类型

其中包含了我们需要怪物拥有的所有属性(自己随意定义)

[Serializable]对结构体进行序列化,才能显示在 Inspector 层次面板上

/// <summary>
/// 怪物结构体
/// </summary>
[Serializable]//序列化,才能显示在层次面板上
public struct EnemyStruct
{
    public string  Name;  //名称
    public string  Id;    //id
    public Vector3 Pos;   //生成位置
    public Color   Color; //颜色
    public int     Count; //数量
}

2. 声明一个结构体数组/ LIst 列表

用来批量创建,我们所需要的 Enemy 怪物

[Serializable]对结构体进行序列化,才能显示在 Inspector 层次面板上

using System;
using UnityEngine;


/// <summary>
/// 结构体测试类
/// </summary>
public class ChinarStruct : MonoBehaviour
{
    /// <summary>
    /// 怪物结构体
    /// </summary>
    [Serializable] //序列化,才能显示在层次面板上
    public struct EnemyStruct
    {
        public string  Name;  //名称
        public string  Id;    //id
        public Vector3 Pos;   //生成位置
        public Color   Color; //颜色
        public int     Count; //数量
    }

    public EnemyStruct[] Enemys; //怪物数组


    /// <summary>
    /// 初始化函数
    /// </summary>
    void Start()
    {
    }
}

3

Add Data in Inspector —— 在面板上添加怪物数据

我们回到Unity界面,等待脚本编译后,看下 Inspector 层次面板上

会发现Struct1

我们需要设置多少种怪物,直接设置就行了

对应的怪物参数,也变的可视化操作了,非常方便

设置完成后,我们即可通过脚本,对所有的怪物数据进行操作

需要的时候,从数组里取出对应数据即可!
举个例子
Struct_2Struct3

设置完后,我们通过Start函数,运行输出下看看验证是否正确

    /// <summary>
    /// 初始化函数
    /// </summary>
    void Start()
    {
        foreach (var e in Enemys)
        {
            print("怪物名称:" + e.Name);
        }
    }

输出结果:
Struct4

那么之后的维护,与使用就非常方便了

至此:结构体的基本使用方式介绍完


4

Extend —— 扩展

其实通过这种思路,我们创建 敌人数据类,声明属性字段

我们同样可是将脚本类给序列化,显示在 Inspector 面板上进行同样操作

所以说程序的实现方式多种多样, C# 为我们提供的也不仅仅是一种开发方式

只有不断的学习运用更为简单,逻辑更为清晰的方式实现我们所需的功能

才是能长真本事的

举个例子

using System;
using UnityEngine;


[Serializable]
public class Enemy
{
    public string  Name;
    public string  Id;
    public Vector3 Pos;
    public Color   Color;
}
/// <summary>
/// 结构体测试类
/// </summary>
public class ChinarStruct : MonoBehaviour
{
    public Enemy[] Enemys; //怪物数组
}

至此:结构体的基本使用方式介绍完


其他教程

May Be —— 搞开发,总有一天要做的事!


1 —— 云服务器超全购买流程 (新手必备!)


2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)


3—— Windows 服务器配置、运行、建站一条龙 !


4 —— Linux 服务器配置、运行、建站一条龙 !



70
$ $
技术交流群:806091680 ! Chinar 欢迎你的加入

END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

相关文章
|
7月前
|
存储 C#
C#数据类型之结构体介绍
C#数据类型之结构体介绍
|
7月前
|
数据处理 C# C++
如何使用C#和C++结构体实现Socket通信
如何使用C#和C++结构体实现Socket通信
306 0
|
7月前
|
搜索推荐 算法 C#
【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)
【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)
117 1
|
4月前
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
123 7
|
4月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
84 0
|
4月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
6月前
|
C# 图形学 C++
使用vscode开发C#+unity没有代码提示问题
使用vscode开发C#+unity没有代码提示问题
84 0
使用vscode开发C#+unity没有代码提示问题
|
7月前
|
存储 C#
C#.Net筑基-类型系统②常见类型--结构体类型Struct
本文介绍了C#中的结构体(struct)是一种用户自定义的值类型,适用于定义简单数据结构。结构体可以有构造函数,能定义字段、属性和方法,但不能有终结器或继承其他类。它们在栈上分配,参数传递为值传递,但在类成员或包含引用类型字段时例外。文章还提到了`readonly struct`和`ref struct`,前者要求所有字段为只读,后者强制结构体存储在栈上,适用于高性能场景,如Span和ReadOnlySpan。
|
6月前
|
JavaScript 前端开发 C#
初识Unity——创建代码、场景以及五个常用面板(创建C#代码、打开代码文件、场景的创建、Project、Hierarchy、Inspector、Scene、Game )
初识Unity——创建代码、场景以及五个常用面板(创建C#代码、打开代码文件、场景的创建、Project、Hierarchy、Inspector、Scene、Game )
342 0
|
7月前
|
图形学
【Unity C#_菜单Window开发系列_Inspector Component UnityEditor开发】
【Unity C#_菜单Window开发系列_Inspector Component UnityEditor开发】