问题描述
我正在学习C#和Unity3D几个月,现在我偶然发现了一种逻辑,希望有人可以对我进行描述。 (我已经在Google上搜索了几个小时,甚至还查询了其他语言是否以这种方式使用枚举。)
此代码来自统一资产商店的免费资产,我尝试对其进行剖析。
一切对我来说都是可以理解的,但随后涉及到GetSliderData()和SetSliderData()函数。
我的问题:模部分如何工作?
在获取和设置值时,为什么仍要除法?还是某种语法,例如不是“> =”(小于或等于符号)的Lambda表达式“ =>”
提前感谢您的宝贵时间! Dom
public class SliderData : ScriptableObject
{
// Data storage
public List<float> sliderData;
/* Use a single enum as retrieval label for any slider by using a splitter
* value as interval. */
private const int ENUM_INTERVAL = 16;
public enum SliderField
{
// Customizer sliders
DEPTH_MIN,DEPTH_MAX,PERLIN_SPEED,PERLIN_LEVEL,ZONE_PERLIN_SPEED,ZONE_PERLIN_LEVEL,MAP_PERLIN_SPEED,MAP_PERLIN_LEVEL,}
/// Retrieves the value of the slider belonging to the given field constant.
public float GetSliderData(SliderField field)
{
return sliderData[(int)field % ENUM_INTERVAL];
}
/// Sets the value of the slider belonging to the given field constant.
public void SetSliderData(SliderField field,float value)
{
sliderData[(int)field % ENUM_INTERVAL] = value;
}
}
解决方法
Get_Successor_Zones_From_Table.then(data => setZoneNames(data));
的目的似乎是将给定的%
值包装到field
列表的现有索引上。
如果值达到/超过sliderData
,它将从ENUM_INTERVAL
重新开始。
对于您的方法,实际上,如果使用枚举值,这似乎有点多余,因为总之只有0
个。但是它可以通过类型转换触发,例如8
..但是为什么有人要这么做?
无论如何,这似乎只是假设(SliderField)17
列表至少包含sliderData
个元素...
通常来说,我不会使用这种结构,而是通过实际字段而不是这种“字典”列表来存储和访问值。
当然取决于用例以及以后如何精确使用资产。似乎涉及到一些您未在此处分享的行为。
但是,与其浏览神奇的枚举和列表索引,不如简单地
16