开发者社区> chinar-yunxi> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Unity3D 预备知识:C#与Lua相互调用
  在使用Unity开发游戏以支持热更新的方案中,使用ULua是比较成熟的一种方案。那么,在使用ULua之前,我们必须先搞清楚,C#与Lua是怎样交互的了? 一.基本原理   简单地说,c#调用lua, 是c# 通过Pinvoke方式调用了lua的dll(一个C库),然后这个dll执行了lua脚本。
1973 0
使用Unity 实现 AOP
前提 引用以下文件 Microsoft.Practices.ObjectBuilder2.dll Microsoft.Practices.Unity.dll Microsoft.Practices.
540 0
unity
引用:http://baike.baidu.com/view/1097775.htm Unity是一款跨平台的游戏开发工具,从一开始就被设计成易于使用的产品。作为一个完全集成的专业级应用,Unity还包含了价值数百万美元的功能强大的游戏引擎。
434 0
Unity查找物体的子物体、孙物体
Unity查找物体下的所有物体 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar ——...
1782 0
Unity缓存池
unity在创建物体后(申请内存),删除,内存中没有立刻释放,只是将引用取消掉. 缓存池:优点:减少内存消耗,优化运行时效率,防止内存泄漏.需要存放不同类型的游戏对象(GameObject) 使用字典来创建缓存池Dictionary> 缓存池创建:缓存池判断游戏物体是什么类型使用枚举 public...
939 0
unity变量的声明与使用
unity变量的声明与使用
0 0
web前端-表单的使用详解
写在前面 上篇文章中我们学习了图像,表格和列表的使用,今天我们走进表单的学习: 🚀上期传送锚点:HTML图像,表格,列表的使用
0 0
Unity开发者必备的C#脚本技巧
我是一名Unity开发爱好者,自己总结了一些Unity的脚本编辑技巧
0 0
+关注
chinar-yunxi
有人天生为王、有人败者为寇 脚下的路如果不是自己的选择,那么旅途的终点在哪?也就没人知道....
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载