- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
昨晚我正在开发一个 C-Sharp 项目,试图围绕游戏对象相互碰撞进行编码。我想要不同的门类型(例如木头、石头、金属),可以用不同的武器(例如棍棒、剑、斧头)分解。
为了检测 GateManager 上的冲突,我为每个门使用了标签。例如:
void OnTriggerEnter(Collider collider) {
switch (gameObject.tag) {
case "WoodenGate":
...
case "StoneGate":
...
上面的代码并不准确,但应该给出一个想法。将每种门类型设置为不同的标签感觉是错误的(如果每种门类型都有不同的标签并且每种 Material 类型都有不同的标签等,那么我最终会得到数百个标签)。
所以我想出了一个替代方案。我设置了 GateType 的枚举并创建了 3 个值(WoodenGate、StoneGate、MetalGate)。然后,我将公共(public) GateType 属性附加到 GateManager 类。这使我能够在统一的“检查器”窗口中选择与每个预制件相关的枚举。非常整洁,我真的很高兴。
然后出现了一个问题:我在列表的中间添加了第四个枚举(例如 GlassGate)。因为枚举只是 int 值,所以第三个项目不再是 MetalGate,而是现在的 StoneGate。这意味着金属门预制件突然有了石门的 GateType。这破坏了我的游戏。
抱歉,对于这个冗长的问题,但我的问题是我应该如何最好地标记和识别许多不同类型的项目?我不想使用标签(因为我需要太多),也不想使用枚举(因为它们与统一检查器结合使用时会产生脆弱的问题。
我认为这一定是许多游戏的常见要求(例如,在游戏中,您可以在许多不同的游戏对象上使用镐来收集不同的资源),所以只是想知道最佳实践?
最佳答案
1。您可以声明并使用许多接口(interface)来完成此操作,但缺点是您需要声明其中许多接口(interface)并在附加到每个对象的许多脚本中实现它们:
public interface IDestroyable { }
public interface IOpenable { }
然后你在脚本中继承它:
public class MyScript : MonoBehaviour, IDestroyable{}
public class MyOtherScript : MonoBehaviour, IOpenable{}
检查碰撞时是哪一个:
void OnTriggerEnter(Collider collider)
{
if (collider.GetComponent<IOpenable>() != null)
{
}
else if (collider.GetComponent<IDestroyable>() != null)
{
}
}
2。您还可以使用您提到的枚举。
public enum GateType
{
WoodenGate,
StoneGate,
MetalGate
}
将描述该对象是什么类型的门的单个脚本附加到所有门对象预制件,然后从编辑器或脚本中为每个门选择枚举
public class GateDescription : MonoBehaviour
{
public GateType gateType;
}
检查碰撞时是哪一个:
void OnTriggerEnter(Collider collider)
{
GateDescription gateType = collider.GetComponent<GateDescription>();
if (gateType != null)
{
switch (gateType.gateType)
{
case GateType.StoneGate:
break;
case GateType.WoodenGate:
break;
case GateType.MetalGate:
break;
}
}
}
关于c# - Unity - 使用枚举属性来检测对象碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47354777/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!