如何检查一个gameObject是否具有特定的属性?

3

我有一个Player对象,它有一个名为public boolean isIndestructible = true的属性。我还有一个Mine对象,它有以下函数:

void OnCollisionEnter2D(Collision2D other) {
    if (other.gameObject.CompareTag("Player") && !other.gameObject.isIndestructible) {
        SceneManager.LoadScene("Game");
    }
}

基本上,我只想在Player对象不是不可摧毁时重新加载游戏。 然而,这段代码不起作用(gameObject没有isIndestructible属性),所以有什么正确的方法可以找到它?

isDestructable 不是属性而是字段。话虽如此,将其作为属性并在接口中声明,该接口由具有此属性的所有类实现。 因此,您只需要检查对象是否来自此接口并使用接口的属性,例如 var objectIsIndestructable = (other.gameObject as IHaveIsIndestructible)?.IsIndestructable。 您可以使用反射,但这是不良设计。 - ckuri
1
你需要使用 GetComponent 来获取与所需属性/字段/方法相关联的脚本。 - Draco18s no longer trusts SE
1个回答

1

我有一个Player对象,其中有一个公共的布尔型属性isIndestructible = true。

那么你已经把MonoBehaviour附加到了Player对象上,对吗?

Player.cs

using UnityEngine;

public class Player : MonoBehaviour
{
    public bool isIndestructible {get; set;}
}

要获取在 Mine 中的属性 isIndestructible
void OnCollisionEnter2D(Collision2D other) {
    var player = other.gameObject.GetComponent<Player>();
    if(player != null && player.isIndestructible){        
        SceneManager.LoadScene("Game");
    }
}

我尝试过这个方法,但是在运行游戏时出现了StackOverflowException错误。我在isIndestructible声明前面加上了[HideInInspector],并在Player类中添加了Player player = new Player );,以便在private void Start()中设置player.isIndestructible = true。对我有效的方法是使用Player player = other.gameObject.GetComponent (typeof(Player)) as Player;,然后检查player.isPunching,而不使用get/set。 - IronWaffleMan
@IronWaffleMan 请使用最小单元测试来测试您的脚本。顺便说一句,不要使用 GetComponent(typeof(Player)),因为 typeof(Player) 使用反射,速度相当慢。请改用 GetComponent<Player>() - zwcloud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接