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;
}
}

Unity程序员的常识，但我想在我的博客中再次提出这个冗余的主题，对于那些可能不知道这一点的人来说，特别是初学者。 我也想保持简单。

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 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;

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);

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.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学习中心查找。

GitHub

Gitee