Unity C#编程优化——枚举
考虑下面关于行星枚举的这个例子:
public enum Planet {
MERCURY,
VENUS,
EARTH,
MARS,
JUPITER,
SATURN,
URANUS,
NEPTUNE,
PLUTO // Pluto is a planet!!!
}
起初,这样的定义还算好,直到需要产生一个行星的质量。所以我们做这样的事情:
// Returns the mass of the planet in 10^24 kg
public float GetMass(Planet planet) {
switch(planet) {
case Planet.MERCURY:
return 0.330;
case Planet.VENUS:
return 4.87f;
case Planet.EARTH:
return 5.97f;
...
case Planet.PLUTO:
return 0.0146f;
}
}
行星直径又如何? 另一个switch语句? 密度怎么样? 重力? 逃跑速度? 只要想想你将要维护的switch语句的数量。 你可以争辩说,你可以使用一个Dictionary,但仍然笨重。 每个数据的Dictionary都要映射?没门。
有一个更好的方法,我会告诉你如何。 这可能已经是非Unity程序员的常识,但我想在我的博客中再次提出这个冗余的主题,对于那些可能不知道这一点的人来说,特别是初学者。 我也想保持简单。
基本上,你可以使用类作为枚举。 为什么用类? 这确实表现的更好 您可以存储任意数量的任意数据。 您甚至可以存储例程或功能。 你可以做很多事情。 唯一的要求是它是不可变的,这意味着类一个实例的状态在整个程序期间都不能改变。以下是Planet枚举用类表示的一个版本:
public class Planet {
// The different values
public static readonly Planet MERCURY = new Planet(0, 0.330f, 4879, 5427, 3.7f);
public static readonly Planet VENUS = new Planet(1, 4.87f, 12104, 5243, 8.9f);
public static readonly Planet EARTH = new Planet(2, 5.97f, 12756, 5514, 9.8f);
public static readonly Planet MARS = new Planet(3, 0.642f, 6792, 3933, 3.7f);
public static readonly Planet JUPITER = new Planet(4, 1898.0f, 142984, 1326, 23.1f);
public static readonly Planet SATURN = new Planet(5, 568.0f, 120536, 687, 9.0f);
public static readonly Planet URANUS = new Planet(6, 86.8f, 51118, 1271, 8.7f);
public static readonly Planet NEPTUNE = new Planet(7, 102.0f, 49528, 1638, 11.0f);
public static readonly Planet PLUTO = new Planet(8, 0.0146f, 2370, 2095, 0.7f);
// Use readonly to maintain immutability
private readonly int id;
private readonly float mass; // in 10^24 kg
private readonly int diameter; // in km
private readonly int density; // in kg/m^3
private readonly float gravity; // in m/s^2
// We use a private constructor because this should not be instantiated
// anywhere else.
private Planet(int id, float mass, int diameter, int density, float gravity) {
this.id = id;
this.mass = mass;
this.diameter = diameter;
this.density = density;
this.gravity = gravity;
}
public int Id {
get {
return id;
}
}
public float Mass {
get {
return mass;
}
}
public int Diameter {
get {
return diameter;
}
}
public int Density {
get {
return density;
}
}
public float Gravity {
get {
return gravity;
}
}
}
为了保持不变性,所有成员变量应该是只读的。 一旦他们被分配,他们将不能再被改变。 这很重要,因为作为枚举,它的内部值不应该改变。 然后将每个枚举值实现为该类的静态只读实例。
这是怎么用的? 与正常枚举是一样的,如下使用:
// Use it like an enum
ship.TargetPlanet = Planet.NEPTUNE;
// Want to know the target planet's mass?
float mass = ship.TargetPlanet.Mass;
// Density?
int density = ship.TargetPlanet.Density;
我们已经消除了切换语句或字典来维护不同行星信息的需要。 想要一个新的行星状态? 只需添加一个新的成员变量并在实例化上指定它们。
如何从其他数据类型转换? 喜欢说从int id转换为Planet实例? 这很容易 通常我为这些转换添加了一个公共和静态方法。 例如:
public class Planet {
// The different values
public static readonly Planet MERCURY = new Planet(0, 0.330f, 4879, 5427, 3.7f);
public static readonly Planet VENUS = new Planet(1, 4.87f, 12104, 5243, 8.9f);
public static readonly Planet EARTH = new Planet(2, 5.97f, 12756, 5514, 9.8f);
public static readonly Planet MARS = new Planet(3, 0.642f, 6792, 3933, 3.7f);
public static readonly Planet JUPITER = new Planet(4, 1898.0f, 142984, 1326, 23.1f);
public static readonly Planet SATURN = new Planet(5, 568.0f, 120536, 687, 9.0f);
public static readonly Planet URANUS = new Planet(6, 86.8f, 51118, 1271, 8.7f);
public static readonly Planet NEPTUNE = new Planet(7, 102.0f, 49528, 1638, 11.0f);
public static readonly Planet PLUTO = new Planet(8, 0.0146f, 2370, 2095, 0.7f);
// This can be used to loop through all planets
public static Planet[] ALL = new Planet[] {
MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE, PLUTO
};
// Converts the specified id to a Planet instance
public static Planet Convert(int id) {
for(int i = 0; i < ALL.Length; ++i) {
if(ALL.Id == id) {
return ALL;
}
}
// return ALL[id] could also work here but what if a non sequential id is used?
throw new Exception("Cannot convert {0} to a Planet.".FormatWith(id));
}
...
}
// Usage
Planet planet = Planet.Convert(someIntPlanet);
想从字符串ID转换? 添加将保存此值的字符串成员变量。 而不是使用诸如ALL []的数组,您可以使用如下所示的Dictionary:
private static Dictionary<string, planet="" style="color: rgb(34, 34, 34); font-family: 微软雅黑; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;"> ALL = new Dictionary<string, planet="">() {
{ MERCURY.TextId, MERCURY },
{ VENUS.TextId, VENUS },
{ EARTH.TextId, EARTH },
...
{ PLUTO.TextId, PLUTO },
};
// Converts the specified string to a Planet instance
public static Planet Convert(string id) {
return ALL[id];
}
您可以支持您喜欢的任何类型的转换。
还有更多的你可以做。 您现在可以添加功能。 你可以这样做:
Planet currentPlanet = Planet.VENUS;
currentPlanet.ApplyGravity(ship);
The coolest thing for me is you can specify different actions or behavior to the enum values. Something like this (It’s very contrived but you get the idea.):
public static readonly Planet EARTH = new Planet(2, 5.97f, 12756, 5514, 9.8f, delegate(Ship ship) {
// Actions on land of ship
ship.AddFood(1000);
ship.RetireCrew();
ship.RecruitNewCrew();
});
public static readonly Planet MARS = new Planet(3, 0.642f, 6792, 3933, 3.7f, delegate(Ship ship) {
// Actions on land of ship
ship.DeductFood(50);
ship.Research();
ship.Mine();
});
通过简单地将你的枚举变成一个类,你已经将它升级到更有组织的东西,而且更加功能强大。 您也可以使用反射和继承等先进功能,但大多数情况下,您不需要。
更多unity2018的功能介绍请到paws3d学习中心查找。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
数据类型,变量
不管任何东西在计算机存储都是数字,数据都是数字的形式存储的,而数字转成二进制由内存中和处理器交互。 而内存是有大小的,选择合适的类型可以避免不必要的内存浪费。 整数型(规定必须转成10进制使用) int(32位,四个字节 ) long(64位,八个字节) byte 万能型数据类型 一个字节 8位网络传输的最小单位也是一个字节,计算机的所有文件都能进行存储,是计算机中最小的单位。 short 两个字节16位,因为有正负级计算,在二进制的最高位,0表示正数,1表示负数 字符型:英文用的是ASCII - 0~127 128个符号 用的是一个字节,而中文要用的是2个字节 char(16位,两个字节) 没有负数寄存,java中文字处理是 unicode 编码 布尔型:boolean(8位,一个字节) 0 false,1 true,实际上存储 只耗去了一位存储的是逻辑值,true false 真与假。 浮点型(小数):小数类型今后计算的时候不精确,放大成整数再计算,float(32位,4个字节) 后保留 6位小数,double(64位,8个字节) 后保留 15位小数 public class T5...
- 下一篇
Python零基础学习笔记(三十三)—— 窗体的控制
这里需要安装和下载pywin32导入相应的库 同时需要下载spy++工具来获取窗口句柄和标题 打开qq执行代码就有效果了 控制窗体的显示和隐藏 ''' import time import win32con import win32gui ''' #找出窗体的编号 QQWin = win32gui.FindWindow("Tedkaafa","QQ") #窗口句柄和标题 #隐藏窗体 win32gui.ShowWindow(QQWin,win32con.SW_HIDE) #显示窗体 win32gui.ShowWindow(QQWin,win32con.SW_SHOW) ''' while True: QQWin = win32gui.FindWindow("TXGuiFoundation", "QQ") win32gui.ShowWindow(QQWin, win32con.SW_HIDE) time.sleep(2) win32gui.ShowWindow(QQWin, win32con.SW_SHOW) time.sleep(2) ''' 控制窗体的位置和大小 ''' import ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS关闭SELinux安全模块
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7,8上快速安装Gitea,搭建Git服务器