【问题标题】:Null Reference exception when accessing variable from different script in Unity从 Unity 中的不同脚本访问变量时出现空引用异常
【发布时间】:2023-04-06 22:33:02
【问题描述】:

我不断收到一个空引用异常,我用谷歌搜索并寻找解决方案,但我只是找不到这里到底出了什么问题。我得到的确切错误是 "NullReferenceException: Object reference not set to an instance of an object 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!");
        }
    }

这是我的 Inventory 类

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;
}

【问题讨论】:

    标签: unity3d unityscript


    【解决方案1】:

    错误是因为播放器对象为空,或者是因为它没有附加 Inv 脚本。如我所见,您没有在脚本中设置玩家的值,因此请检查它是否在编辑器中分配,以及分配的游戏对象是否附加了一个 inv 脚本。为避免此错误,您可以尝试在分配值之前检查 null,替换:

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

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

    【讨论】:

      猜你喜欢
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多