尝试在另一个脚本中检查布尔值是否为真

时间:2019-10-18 22:11:18

标签: c# unity3d

我正在尝试用Unity编写游戏代码。我的计划是编写一个脚本,在脚本与玩家碰撞对象时使bool变量为true,然后,另一个脚本将每次都检查bool是否为true。如果是这样,我将打印“ Leper Jump”。由于bool变量在另一个脚本中,因此我需要实例化它,并且代码看起来完全正确,但是控制台在第17行说“ NullReferenceException:对象引用未设置为对象的实例”。 抱歉,如果这听起来有些愚蠢,但我已经尝试解决了几个小时,但仍未找到解决方法,请您帮我吗?

以下是我将布尔值转换为true的播放器碰撞的代码:

Set-ADUser -Identity suser -Add @{msExchDelegateListLink='CN=Customer Care,OU=Onlinetenent.onmicrosoft.com,OU=Microsoft Exchange Hosted Organizations,DC=NMPR19A04,DC=PROD,DC=OUTLOOK,DC=COM'}

Set-ADUser : The name reference is invalid
At line:3 char:77
+ ... rt.com'}  | Set-ADUser -Add @{msExchDelegateListLink='CN=Customer Car ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (CN=user test...=proddom,DC=net:ADUser) [Set-ADUser], ADException
    + FullyQualifiedErrorId : ActiveDirectoryServer:8373,Microsoft.ActiveDirectory.Management.Commands.SetADUser

这是我尝试检查布尔值是否正确的脚本(错误在这里):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LeperTrigger : MonoBehaviour
{
    public GameObject Leper;
    public GameObject trigger;
    public bool IsOnLeper = false;

    void Update()
    {

    }

     private void OnCollisionEnter2D(Collision2D collision)
         {
                if (collision.gameObject.tag == "Player")
                {
                Debug.Log("IsOnLeper comes true");
                IsOnLeper = true;
                }
        }
}

错误是:NullReferenceException:对象引用未设置为对象的实例(第17行)

使用using System.Collections; using System.Collections.Generic; using UnityEngine; public class LeperAI : MonoBehaviour { public LeperTrigger lepertriggerinstance; void Start() { lepertriggerinstance = GameObject.FindWithTag("enemy").GetComponent<LeperTrigger>(); } void Update() { if(lepertriggerinstance.GetComponent<LeperTrigger>().IsOnLeper == true) { Debug.Log("Leper jump"); } } } 不会更改错误。

4 个答案:

答案 0 :(得分:0)

变量lepertriggerinstance已经是LeperTrigger的实例,因此在尝试获取bool的值时,请勿使用

if(lepertriggerinstance.GetComponent<LeperTrigger>().IsOnLeper == true)

使用if(lepertriggerinstance.IsOnLeper == true)

第二种选择是,如果场景中只有LeperTrigger的一个实例,或者该值可以用于所有实例,则只需将bool IsOnLeper设为静态即可。这样,您就可以使用if(LeperTrigger.IsOnLeper)

答案 1 :(得分:0)

您不应该在LeperTrigger中已经获得的LeperTrigger对象上寻找另一个Start()组件。我更改了下面的第17行。

如果仍然遇到相同的错误,请确保进行检查:

  • 您确实在场景中有一个带有标签enemy的物体
  • 标记为enemy的对象具有附加的LeperTrigger脚本。

最后,如果在场景开始后 实例化enemy对象,请记住Start()的{​​{1}}方法不会再次运行,因此将LeperAI对象保留为空。

lepertriggerinstance

答案 2 :(得分:0)

好像您是在LeperTrigger寻找LeperAI之后创建LeperTrigger的。我会设置与您当前的工作方式相反的方式。

我会用 LeperAI 标记打开的GameObject LeperAI,然后在LeperTrigger中找到LeperAI并设置其lepertriggerinstance的值本身:

void Start()
{
    GameObject.FindWithTag("LeperAI").GetComponent<LeperAI>().lepertriggerinstance = this;
}

然后在LeperAI中,如下更改if语句:

public LeperTrigger lepertriggerinstance; 

void Start() 
{
    lepertriggerinstance = null; 
} 

void Update()
{ 
    if( lepertriggerinstance != null && lepertriggerinstance.IsOnLeper )
    {
        Debug.Log("Leper jump");
    } 
}

...,以便LeperAI检查是否创建了LeperTrigger实例,如果已经创建,则检查其值IsOnLeper

答案 3 :(得分:0)

看,这更简单,我不知道你是否找到了解决方案,假设你的 LeperTrigger 脚本是你的 Leper 游戏对象的一个​​组件,我认为这可能是你需要的:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LeperAI : MonoBehaviour
{
     void Update()
    {
        if (GameObject.Find("Leper").GetComponent<LeperTrigger>().IsOnLeper == true)
        {
            Debug.Log("LeperJump");
        }
    }
}