访问我创建和检索的组件时获取NullReferenceException

时间:2016-01-13 02:49:41

标签: c# unity3d nullreferenceexception

首先,我是多么原始地发布另一个可怕的

  

NullReferenceException:未将对象引用设置为对象的实例

但是我已经在网上搜索了一个解决方案,现在已经有2个小时了,并且没有提出任何问题......这是我的两个脚本:

GROUNDED:

using UnityEngine;
using System.Collections;

public class GroundCheck : MonoBehaviour {

private Player player;

void Start()
{
    player = GetComponent<Player>();
}

void OnTriggerEnter2D(Collider2D col)
{
    player.grounded = true;
}

void OnTriggerExit2D(Collider2D col)
{
    player.grounded = false;
}
}

PLAYER:

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

public float maxSpeed = 3;
public float speed = 50f;
public float jumpPower = 150f;

public bool grounded;

private Rigidbody2D rb2d;
private Animator anim;

// Use this for initialization
void Start () {

    rb2d = gameObject.GetComponent<Rigidbody2D>();
    anim = gameObject.GetComponent<Animator>();
}

// Update is called once per frame
void Update () {

    anim.SetBool("Grounded", grounded);
    anim.SetFloat("Speed", Mathf.Abs(Input.GetAxis("Horizontal")));
}

void FixedUpdate()
{
    float h = Input.GetAxis("Horizontal");

    rb2d.AddForce((Vector2.right * speed) * h);

    if (rb2d.velocity.x > maxSpeed)
    {
        rb2d.velocity = new Vector2(maxSpeed, rb2d.velocity.y);
    }

    if (rb2d.velocity.x < -maxSpeed)
    {
        rb2d.velocity = new Vector2(-maxSpeed, rb2d.velocity.y);
    }
}
}

确切的错误是:

  

NullReferenceException:未将对象引用设置为对象的实例

     

GroundCheck.OnTriggerEnter2D(UnityEngine.Collider2D col)       (atAssets /脚本/ GroundCheck.cs:15)

这是我的场景:

这是我的boxcollider(如果它有帮助):

boxcollider

3 个答案:

答案 0 :(得分:1)

您的地面检查脚本与播放器脚本不在同一个对象上,这意味着您无法使用getcomponent来获取播放器脚本。因此,您没有将播放器var设置为导致错误的任何内容。将播放器var设置为编辑器中具有播放器脚本的游戏对象,然后在start方法中使用player.GetComponent();

答案 1 :(得分:1)

如果GroundCheckPLAYER类都在同一个GameObject上,那么更改Start()类的GroundCheck方法,如下所示:

void Start()
{
    player = gameObject.GetComponent<Player>();
}

如果它们不在同一个GameObject上,请使用以下代码:

void Start()
{
    GameObject playerObj = GameObject.Find("Name of gameObject that player script is in that");
    player = playerObj.GetComponent<Player>();
}

PLAYER课程中添加static修饰符来定义基础:

public static bool grounded;

答案 2 :(得分:-1)

android.support.v4.app.Fragment&lt; - 在collider param请求gameObject中,首选getcomponent to col,仅控制对象碰撞是否为Fragment

void OnTriggerEnter2D(Collider2D col)

我有类似的问题。我希望它有所帮助 http://docs.unity3d.com/ScriptReference/Collision2D.html

Collider2d有gameobject组件,触发输入get Collider这个对象。

http://docs.unity3d.com/ScriptReference/Collider2D.OnCollisionEnter2D.html中的

请参阅使用碰撞器中的示例(不是触发器只是示例)来使用,访问gameObject。

对象(播放器)在事件OnTriggerEnter,Exit或Stay中传递参数时没有必要的findtag