本文提供全图文流程,中文翻译。
Chinar 坚持将简单的生活方式,带给世人!
(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)
Chinar —— 心分享、心创新!
助力快速理解 C# 结构体的具体用法
给新手节省宝贵的时间,避免采坑!
Chinar 教程效果:
全文高清图片,点击即可放大观看 (很多人竟然不知道)
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 层次面板上
会发现
我们需要设置多少种怪物,直接设置就行了
对应的怪物参数,也变的可视化操作了,非常方便
设置完成后,我们即可通过脚本,对所有的怪物数据进行操作
需要的时候,从数组里取出对应数据即可!
设置完后,我们通过Start函数,运行输出下看看验证是否正确
/// <summary>
/// 初始化函数
/// </summary>
void Start()
{
foreach (var e in Enemys)
{
print("怪物名称:" + e.Name);
}
}
输出结果:
那么之后的维护,与使用就非常方便了
至此:结构体的基本使用方式介绍完
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 服务器配置、运行、建站一条龙 !
$ $
技术交流群:806091680 ! Chinar 欢迎你的加入
END
本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究
对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com
对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址