【问题标题】:how can i access objects and call objects method?如何访问对象并调用对象方法?
【发布时间】:2020-04-05 14:47:11
【问题描述】:

所以我正在构建一个游戏,如果我让玩家跳跃,并且如果玩家降落在板条箱或敌人上,玩家会通过碰撞上的函数跳跃(使用碰撞检测器另一个游戏对象来检测碰撞)。碰撞已注册,虽然该函数未执行,但经过一些调试后,我注意到我正在调用的对象(脚本)在我播放时不存在,它们为 null,并且它给出了 nullReferenceException。

碰撞检测器类:

public class CollisionDetector : MonoBehaviour {
    public bool collide=false;
    public rogueMovement ro;
    public Crate cr;
    void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.collider.tag=="enemy")
        {
            Debug.Log("Jumpoff enemy");
            collision.collider.GetComponent<rogueMovement>().jumpOffEnemy();
            collide = true;
        }
        else if (collision.collider.tag=="crate")
        {
            ro.isJumping=false;
            Debug.Log("Crate collision");
            cr.Die();
        }

    }
}

我希望它执行的功能:

public void jumpOffEnemy()
{
    //ani.SetTrigger("jump");
    rb.AddForce(new Vector2(0f, Verticaljump), ForceMode2D.Impulse);
    //transform.Translate(0f,5f*Time.deltaTime,0f);
    Debug.Log("jump");
}

这是在玩之前和之后,我放置了 Crate 脚本和 rogue 类的碰撞检测器游戏对象发生的情况的图像

enter image description here enter image description here

【问题讨论】:

  • 好吧,看来GetComponent&lt;rogueMovement&gt;() 正在返回null。所以你需要解决这个问题。
  • 是的,我做到了。如果您检查我发布的图像,玩游戏后返回 null 的对象,尽管在玩游戏之前它还可以,没有错误。

标签: c# oop unity3d


【解决方案1】:

尝试使用碰撞。gameObject.GetComponent().jumpOffEnemy();

它应该可以解决您的主要问题。除此之外,您需要初始化 rogueMovement 和 Crate,因为当游戏开始时,Unity 不知道从哪里获取和更改这些脚本的值,因为脚本可以附加到任何和多个游戏对象,除非它们是 ScriptableObjects 而不是 MonoBehaviours。简单的修复方法如下:

public GameObject x;
public GameObject y;

rogueMovement ro;
Crate cr;

Public void Start()
{
    ro = x.GetComponent<rogueMovement>();
    cr = y.GetComponent<Crate>();
}

在这些脚本所在的位置附加 x 和 y 游戏对象。 希望这会有所帮助。

【讨论】:

  • 我不再从事这个项目,因为它很先进,而且我是游戏开发的新手。感谢您的回答,我会在完成当前项目后尝试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多