C# 如何检查游戏对象是否具有特定属性?

C# 如何检查游戏对象是否具有特定属性?,c#,unity3d,C#,Unity3d,我有一个具有公共布尔值IsIndecuctible=true属性的播放器对象。我还有一个Mine对象,它具有以下功能: void OnCollisionEnter2D(Collision2D other) { if (other.gameObject.CompareTag("Player") && !other.gameObject.isIndestructible) { SceneManager.LoadScene("Game"); } } 基

我有一个具有
公共布尔值IsIndecuctible=true
属性的播放器对象。我还有一个Mine对象,它具有以下功能:

void OnCollisionEnter2D(Collision2D other) {
    if (other.gameObject.CompareTag("Player") && !other.gameObject.isIndestructible) {
        SceneManager.LoadScene("Game");
    }
}
基本上,我只想在玩家对象不是坚不可摧的情况下重新加载游戏。但是这个代码不起作用(
gameObject
没有
isindectructible
属性),那么找到这个的正确方法是什么呢

我有一个具有公共布尔IsIndecuctible=true属性的播放器对象

那么你已经在玩家对象上附加了一个
monobhavior
,对吗

Player.cs

using UnityEngine;

public class Player : MonoBehaviour
{
    public bool isIndestructible {get; set;}
}
要在
Mine
中获取属性
isindectructible

void OnCollisionEnter2D(Collision2D other) {
    var player = other.gameObject.GetComponent<Player>();
    if(player != null && player.isIndestructible){        
        SceneManager.LoadScene("Game");
    }
}
无效OnCollisionInter2D(碰撞2D其他){
var player=other.gameObject.GetComponent();
如果(player!=null&&player.isindectructible){
场景管理器。加载场景(“游戏”);
}
}

isDestructable
不是属性,而是字段。也就是说,将它作为一个属性,并在一个接口中声明它,该接口由所有具有此属性的类实现。因此,您只需检查对象是否来自此接口,并使用interfaces属性,例如
var objectsindestructable=(其他.gameObject作为iHaveIsIndectable)?.IsIndectable
。您可以使用反射,但这是一个糟糕的设计。您必须使用
GetComponent
来获取与所需属性/字段/方法关联的脚本。我尝试了此操作,但在尝试运行游戏时它给了我StackOverflowException错误。我将
[hideininstit]
放在ISindectructible声明前面,以及
Player=new Player),以便我可以在
private void Start()
中设置
Player.isindecuctible=true
。在不使用get/set的情况下,对我有效的是
Player-Player=other.gameObject.GetComponent(typeof(Player))作为播放器
然后检查
player.i点击@IronWaffleMan请用最小的单元测试测试你的脚本。顺便说一句,不要使用
GetComponent(typeof(Player))
,因为
typeof(Player)
使用反射,速度非常慢。改用
GetComponent()