从Unity中的不同脚本访问变量时出现Null引用异常

时间:2016-02-07 10:18:22

标签: unity3d unityscript

我一直得到一个空的参考例外我已经用Google搜索并寻找解决方案,但我无法在这里找到确切的错误。我得到的确切错误是" NullReferenceException:对象引用未设置为对象的实例 RayCastCollect.Update()(在Assets / RayCastCollect.js:47)"

我要做的是做一个RayCast并点击游戏对象让它消失。那部分工作正常。但之后我还希望更新我的库存,这是不工作的部分,并且特定的代码行会产生错误。 player.GetComponent(Inv).cookedFish + = 1;

这是RayCast类的代码

    #pragma strict

var rayLength : int = 10;

private var inventory : Inv;

private var guiShow : boolean = false;

var bush : GameObject;

var player : GameObject;
var berr:int;

function Start()
{
    inventory = GameObject.Find("First Person Controller").GetComponent(Inv);
}

function Update()
{
    var hit : RaycastHit;
    var fwd = transform.TransformDirection(Vector3.forward);

    if(Physics.Raycast(transform.position, fwd, hit, rayLength))
    {
        if(hit.collider.gameObject.name == "log")
        {           
            guiShow = true;

            if(Input.GetKey(KeyCode.E))
            {
                //inventory.wood++;
                Destroy(hit.collider.gameObject);
                guiShow = false;
                inventory.wood++;
            }
        }
        if(hit.collider.gameObject.tag == "BushFull")
        {
            guiShow = true;
            bush = (hit.collider.gameObject);

            if(Input.GetKeyDown("e"))
            {
                bush.GetComponent(BushController).berriesTaken = true;
                guiShow = false;
                player.GetComponent(Inv).cookedFish += 1;

            }
        }
            else
            {
                guiShow = false;
            }
    }
}


    function OnGUI()
    {
        if(guiShow == true)
        {
            GUI.Box(Rect(Screen.width / 2 - 150, Screen.height / 2 - 150, 100, 20), "PICKUP!");
        }
    }

这是我的库存类

var menuSkin : GUISkin;

var wood : int = 0;
var stone : int = 0;
var clay : int = 0;

var fish : int = 0;
public var cookedFish : int = 0;

var bottle : int = 0;
var bottledWater : int = 0;

var bandage : int = 0;

var minimumVal : int = 0;

private var showGUI : boolean = false;//to switch inventory on or off jo key press krne se hoga

private var playerGUI : PlayerGUI;

function Start()
{
    playerGUI = GameObject.Find("First Person Controller").GetComponent(PlayerGUI); 
}

function Update()
{
    if(wood <= 0)
    {
        wood = minimumVal;
    }

    if(stone <= 0)
    {
        stone = minimumVal;
    }

    if(clay <= 0)
    {
        clay = minimumVal;
    }

    if(fish <= 0)
    {
        fish = minimumVal;
    }

    if(cookedFish <= 0)
    {
        cookedFish = minimumVal;
    }

    if(bottle <= 0)
    {
        bottle = minimumVal;
    }

    if(bottledWater <= 0)
    {
        bottledWater = minimumVal;
    }

    if(bandage <= 0)
    {
        bandage = minimumVal;
    }

    if(Input.GetKeyDown("i")) //key 'i' press kro to agr on ha inv to off hjae and vice versa
    {
        showGUI = !showGUI;
    }

    if(showGUI == true)
    {
        Time.timeScale = 0; //game pause hjaegi kind of sb kch ruk jaega
        GameObject.Find("First Person Controller").GetComponent(FPSInputController).enabled = false;//first person controls disable
        GameObject.Find("First Person Controller").GetComponent(MouseLook).enabled = false;//mouse control player k disabled
        GameObject.Find("Main Camera").GetComponent(MouseLook).enabled = false;
        GameObject.Find("FPSArms_Axe@Idle").GetComponent(PlayerAnimation).enabled = false;
        //GameObject.Find("Main Camera").GetComponent(RayCastCollect).enabled = false;
    }

    if(showGUI == false)
    {//agr inv ni khuli hwi to baki jo upr false ki hain unhe wapis true krdo
        Time.timeScale = 1;
        GameObject.Find("First Person Controller").GetComponent(FPSInputController).enabled = true;
        GameObject.Find("First Person Controller").GetComponent(MouseLook).enabled = true;
        GameObject.Find("Main Camera").GetComponent(MouseLook).enabled = true;
        GameObject.Find("FPSArms_Axe@Idle").GetComponent(PlayerAnimation).enabled = true;
    //  GameObject.Find("Main Camera").GetComponent(RayCastCollect).enabled = true;
    }
}

function OnGUI()
{
    if(showGUI == true)
    {//inv menu ki gui sari bn ri ha idhr
        GUI.skin = menuSkin;
            GUI.BeginGroup(new Rect(Screen.width / 2 - 150, Screen.height / 2 - 150, 300, 300));
                GUI.Box(Rect(0, 0, 300, 300), "Basic Inventory");

                //Resources collected
                GUI.Label(Rect(10, 50, 50, 50), "Wood");
                GUI.Box(Rect(60, 50, 20, 20), "" + wood);

                GUI.Label(Rect(90, 50, 50, 50), "Stone");
                GUI.Box(Rect(130, 50, 20, 20), "" + stone);

                GUI.Label(Rect(170, 50, 50, 50), "Clay");
                GUI.Box(Rect(200, 50, 20, 20), "" + clay);


                //Empty holders
                GUI.Label(Rect(10, 130, 50, 50), "Fish");
                GUI.Box(Rect(60, 130, 20, 20), "" + fish);

                GUI.Label(Rect(10, 150, 50, 50), "Bottle");
                GUI.Box(Rect(60, 150, 20, 20), "" + bottle);

                //Edible items
                GUI.Label(Rect(10, 190, 50, 50), "CFish");//label
                GUI.Box(Rect(60, 190, 20, 20), "" + cookedFish);//text box type thingy
                if(GUI.Button(Rect(100, 190, 100, 20), "Eat Fish"))//button bn ra ha
                {
                    if(cookedFish >= 1)
                    {
                        cookedFish--;
                        Eat();
                    }
                }

                GUI.Label(Rect(10, 210, 50, 50), "BWater");
                GUI.Box(Rect(60, 210, 20, 20), "" + bottledWater);
                if(GUI.Button(Rect(100, 210, 100, 20), "Drink Water"))
                {
                    if(bottledWater >= 1)
                    {
                        bottledWater--;
                        Drink();
                    }
                }

                GUI.Label(Rect(10, 240, 50, 50), "Heal");
                GUI.Box(Rect(60, 240, 20, 20), "" + bandage);
                if(GUI.Button(Rect(100, 240, 100, 20), "Use Bandage"))
                {
                    if(bandage >= 1)
                    {
                        bandage--;
                        Heal();
                    }
                }
                GUI.EndGroup();
    }
}

function Eat()
{
    playerGUI.hungerBarDisplay += 0.1;
}

function Drink()
{
    playerGUI.thirstBarDisplay += 0.1;
}

function Heal()
{
    playerGUI.healthBarDisplay += 0.1;
}

1 个答案:

答案 0 :(得分:0)

错误是因为播放器对象为null,因为它没有附加Inv脚本。正如我所看到的,你没有在你的脚本中设置播放器的值,所以检查它是否在编辑器中分配,并且指定的游戏对象是否有一个inv脚本。为避免此错误,您可以在分配值之前尝试检查null,替换:

player.GetComponent(Inv).cookedFish += 1;

if(player != null && player.GetComponent(Inv)!= null){
 player.GetComponent(Inv).cookedFish += 1;
}