愿闻其详 发表于 2024-2-29 20:29:00

Unity报错

为什么Unity报错


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

public class NewBehaviourScript6 : MonoBehaviour
{
    // Start is called before the first frame update
    public Button m_btn;
    public new NewBehaviourScript Scripta;
    public new NewBehaviourScript1 Scriptb;
    public new NewBehaviourScript2 Scriptc;
    public new NewBehaviourScript4 Scriptd;
    public new NewBehaviourScript7 Scripte;
    // Start is called before the first frame update
    void Awake()
    {
      m_btn = GetComponent<Button>();
      Scripta = FindObjectOfType<NewBehaviourScript>();
      Scriptb = FindObjectOfType<NewBehaviourScript1>();
      Scriptc = FindObjectOfType<NewBehaviourScript2>();
      Scriptd = FindObjectOfType<NewBehaviourScript4>();
      Scripte = FindObjectOfType<NewBehaviourScript7>();
    }

    private void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
      m_btn.onClick.AddListener(ClickButton);
    }
    void ClickButton()
    {
      Scripta.module = 1;
      Scriptb.module = 1;
      Scriptc.module = 1;
      Scriptd.module = 1;
      Scripte.module = 1;
    }
}

FishC 发表于 2024-2-29 20:29:22

在Unity中报错有很多原因,可能是代码逻辑错误、组件未赋值、命名空间引用错误等。根据你提供的代码,我注意到一些问题需要解决。

首先,`GetComponent()`方法需要告诉它获取哪个组件类型,并将获取到的组件实例化给m_btn。你可以这样修改:
m_btn = GetComponent<Button>();

其次,`FindObjectOfType()`方法也需要告诉它要找哪个脚本类型的实例。你可以这样修改:
Scripta = FindObjectOfType<NewBehaviourScript>();
Scriptb = FindObjectOfType<NewBehaviourScript1>();
Scriptc = FindObjectOfType<NewBehaviourScript2>();
Scriptd = FindObjectOfType<NewBehaviourScript4>();
Scripte = FindObjectOfType<NewBehaviourScript7>();

最后,你的`Update()`方法每帧都会调用,而你又在其中添加点击事件监听器。这会导致每帧都会添加相同的点击事件监听器,会造成重复执行代码的问题。你可以将代码移到`Start()`方法中来解决:
private void Start()
{
    m_btn.onClick.AddListener(ClickButton);
}

你可以尝试按照以上修改来解决报错问题。如果还有其他报错,请提供具体的错误信息,以便更好地帮助你解决问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

愿闻其详 发表于 2024-2-29 20:35:56

FishC 发表于 2024-2-29 20:29
在Unity中报错有很多原因,可能是代码逻辑错误、组件未赋值、命名空间引用错误等。根据你提供的代码,我注 ...

还是有问题

FishC 发表于 2024-2-29 20:36:31

愿闻其详 发表于 2024-02-29 20:35
还是有问题

非常抱歉,我之前的回答可能有误导性。根据你提供的代码,我注意到以下几个问题:

1. 使用了重复的名称 `NewBehaviourScript`:你在 `NewBehaviourScript6` 类中定义了多个 `NewBehaviourScript` 变量,这可能导致命名冲突。请确保每个变量都有唯一的名称。

2. 没有正确获取组件:在 `Awake()` 方法中,你调用了 `GetComponent()` 方法,但是没有指定要获取的组件类型。你需要在括号中指定要获取的组件类型,例如 `GetComponent<Button>()`。同样,在 `FindObjectOfType()` 方法中也需要指定要查找的脚本类型。

3. 重复添加点击事件监听器:在 `Update()` 方法中,你每帧都会添加点击事件的监听器,这会导致重复执行相同的代码。你应该将点击事件的监听器移动到 `Start()` 方法中,只在开始时添加一次。

下面是根据以上问题进行修正后的代码示例:

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

public class NewBehaviourScript6 : MonoBehaviour
{
    public Button m_btn;
    public NewBehaviourScript Scripta;
    public NewBehaviourScript1 Scriptb;
    public NewBehaviourScript2 Scriptc;
    public NewBehaviourScript4 Scriptd;
    public NewBehaviourScript7 Scripte;

    void Awake()
    {
      m_btn = GetComponent<Button>();
      Scripta = FindObjectOfType<NewBehaviourScript>();
      Scriptb = FindObjectOfType<NewBehaviourScript1>();
      Scriptc = FindObjectOfType<NewBehaviourScript2>();
      Scriptd = FindObjectOfType<NewBehaviourScript4>();
      Scripte = FindObjectOfType<NewBehaviourScript7>();
    }

    private void Start()
    {
      m_btn.onClick.AddListener(ClickButton);
    }

    void Update()
    {
      // 这里不需要再添加点击事件监听器
    }

    void ClickButton()
    {
      Scripta.module = 1;
      Scriptb.module = 1;
      Scriptc.module = 1;
      Scriptd.module = 1;
      Scripte.module = 1;
    }
}

请注意,以上代码仅是根据你提供的情况进行了修正,如果还有其他报错,请提供具体的错误信息,以便更好地帮助你解决问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

愿闻其详 发表于 2024-2-29 20:39:08

FishC 发表于 2024-2-29 20:36
非常抱歉,我之前的回答可能有误导性。根据你提供的代码,我注意到以下几个问题:

1. 使用了重复的 ...

我的代码就是这样写

FishC 发表于 2024-2-29 20:39:40

愿闻其详 发表于 2024-02-29 20:39
我的代码就是这样写

非常抱歉,我之前的回答可能会引起误会。根据你提供的代码,我注意到有一些问题需要解决:

1. 重复使用了相同的脚本名称:你在 `NewBehaviourScript6` 类中定义了多个同名的 `NewBehaviourScript`,这可能导致命名冲突。请确保每个变量都有唯一的名称。

2. 没有正确获取组件:在 `Awake()` 方法中,你调用了 `GetComponent()` 方法,但是没有指定要获取的组件类型。你需要在括号中指定要获取的组件类型,例如 `GetComponent<Button>()`。同样,在 `FindObjectOfType()` 方法中也需要指定要查找的脚本类型。

3. 重复添加点击事件监听器:在 `Update()` 方法中,你每帧都会添加点击事件的监听器,这会导致重复执行相同的代码。你应该将点击事件的监听器移动到 `Start()` 方法中,只在开始时添加一次。

综上所述,以下是对代码进行修正后的示例:

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

public class NewBehaviourScript6 : MonoBehaviour
{
    public Button m_btn;
    public NewBehaviourScript Scripta;
    public NewBehaviourScript1 Scriptb;
    public NewBehaviourScript2 Scriptc;
    public NewBehaviourScript4 Scriptd;
    public NewBehaviourScript7 Scripte;

    void Awake()
    {
      m_btn = GetComponent<Button>();
      Scripta = FindObjectOfType<NewBehaviourScript>();
      Scriptb = FindObjectOfType<NewBehaviourScript1>();
      Scriptc = FindObjectOfType<NewBehaviourScript2>();
      Scriptd = FindObjectOfType<NewBehaviourScript4>();
      Scripte = FindObjectOfType<NewBehaviourScript7>();
    }

    private void Start()
    {
      m_btn.onClick.AddListener(ClickButton);
    }

    void Update()
    {
      // 这里不需要再添加点击事件监听器
    }

    void ClickButton()
    {
      Scripta.module = 1;
      Scriptb.module = 1;
      Scriptc.module = 1;
      Scriptd.module = 1;
      Scripte.module = 1;
    }
}

请注意,以上代码仅是根据你提供的情况进行了修正。如果还有其他报错,请提供具体的错误信息,以便更好地帮助你解决问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

愿闻其详 发表于 2024-2-29 20:41:41

FishC 发表于 2024-2-29 20:39
非常抱歉,我之前的回答可能会引起误会。根据你提供的代码,我注意到有一些问题需要解决:

1. 重复 ...

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

public class NewBehaviourScript5 : MonoBehaviour
{
    public Button m_btn;
    public new NewBehaviourScript Scripta;
    public new NewBehaviourScript1 Scriptb;
    public new NewBehaviourScript2 Scriptc;
    public new NewBehaviourScript4 Scriptd;
    public new NewBehaviourScript7 Scripte;
    // Start is called before the first frame update
    void Awake()
    {
      m_btn = GetComponent<Button>();
    }
    void Start()
    {
      m_btn.onClick.AddListener(ClickButton);
    }

    // Update is called once per frame
    void Update()
    {
      
    }
    void ClickButton()
    {
      Scripta.module = 0;
      Scriptb.module = 0;
      Scriptc.module = 0;
      Scriptd.module = 0;
      Scripte.module = 0;
    }
}

FishC 发表于 2024-2-29 20:42:08

愿闻其详 发表于 2024-02-29 20:41
using System.Collections;
using System.Collection ...

根据你提供的代码,我注意到一些问题已经解决了。在 `Awake()` 方法中,你使用了 `GetComponent()` 方法来获取 `m_btn`,这是正确的。在 `Start()` 方法中,你为按钮的点击事件添加了监听器,这也是正确的做法。

根据你的代码,我猜测你的意图是使用不同的脚本来控制不同的模块。然而,在你的代码中,你用 `new` 关键字给脚本变量赋值,这是错误的。将 `new` 关键字移除。

以下是修正后的代码示例:

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

public class NewBehaviourScript5 : MonoBehaviour
{
    public Button m_btn;
    public NewBehaviourScript Scripta; // 请确保 NewBehaviourScript 类存在并正确命名
    public NewBehaviourScript1 Scriptb; // 请确保 NewBehaviourScript1 类存在并正确命名
    public NewBehaviourScript2 Scriptc; // 请确保 NewBehaviourScript2 类存在并正确命名
    public NewBehaviourScript4 Scriptd; // 请确保 NewBehaviourScript4 类存在并正确命名
    public NewBehaviourScript7 Scripte; // 请确保 NewBehaviourScript7 类存在并正确命名

    void Awake()
    {
      m_btn = GetComponent<Button>(); // 指定获取 Button 组件
    }

    void Start()
    {
      m_btn.onClick.AddListener(ClickButton);
    }

    void Update()
    {
      // 这里留空即可
    }

    void ClickButton()
    {
      Scripta.module = 0;
      Scriptb.module = 0;
      Scriptc.module = 0;
      Scriptd.module = 0;
      Scripte.module = 0;
    }
}

请确保你定义的 `NewBehaviourScript`、`NewBehaviourScript1`、`NewBehaviourScript2`、`NewBehaviourScript4` 和 `NewBehaviourScript7` 类存在并正确命名。另外,确保这些类中都有一个名为 `module` 的公共变量。

如果你仍然遇到问题,请提供具体的错误信息,以便更好地帮助你解决问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

愿闻其详 发表于 2024-2-29 20:43:38

FishC 发表于 2024-2-29 20:42
根据你提供的代码,我注意到一些问题已经解决了。在 `Awake()` 方法中,你使用了 `GetComponent()` 方 ...

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

public class NewBehaviourScript5 : MonoBehaviour
{
    public Button m_btn;
    public NewBehaviourScript Scripta;
    public NewBehaviourScript1 Scriptb;
    public NewBehaviourScript2 Scriptc;
    public NewBehaviourScript4 Scriptd;
    public NewBehaviourScript7 Scripte;
    // Start is called before the first frame update
    void Awake()
    {
      m_btn = GetComponent<Button>();
    }
    void Start()
    {
      m_btn.onClick.AddListener(ClickButton);
    }

    // Update is called once per frame
    void Update()
    {
      
    }
    void ClickButton()
    {
      Scripta.module = 0;
      Scriptb.module = 0;
      Scriptc.module = 0;
      Scriptd.module = 0;
      Scripte.module = 0;
    }
}

FishC 发表于 2024-2-29 20:44:04

愿闻其详 发表于 2024-02-29 20:43
using System.Collections;
using System.Collection ...

根据你提供的代码,我注意到你为按钮的点击事件添加了监听器,并且在点击事件中给脚本变量的 `module` 属性赋值。这看起来是正确的做法。然而,根据你的代码,我猜测你可能遗漏了一些关键的步骤。以下是你可能需要检查和完善的几个方面:

1. 确保 `m_btn` 的 GameObject 上有一个 Button 组件。如果没有,你需要手动将此脚本组件拖放到一个包含 Button 组件的 GameObject 上,或者通过代码动态添加 Button 组件。

2. 确保 `Scripta`、`Scriptb`、`Scriptc`、`Scriptd` 和 `Scripte` 变量引用了正确的脚本实例。你需要确保这些脚本实例存在,并且已附加到与此脚本所在的 GameObject 或其他 GameObject 相同的对象上。

3. 确保 `Scripta`、`Scriptb`、`Scriptc`、`Scriptd` 和 `Scripte` 类中都定义了名为 `module` 的公共变量。你可以检查这些脚本类文件是否存在,并确保其中包含一个名为 `module` 的公共变量。

如果你确认了以上几点并且仍然遇到问题,请提供更具体的错误信息,以便更好地帮助你解决问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

愿闻其详 发表于 2024-2-29 20:46:59

FishC 发表于 2024-2-29 20:44
根据你提供的代码,我注意到你为按钮的点击事件添加了监听器,并且在点击事件中给脚本变量的 `module`...

NullReferenceException: Object reference not set to an instance of an object
NewBehaviourScript6.ClickButton () (at Assets/NewBehaviourScript6.cs:42)
UnityEngine.Events.InvokableCall.Invoke () (at <be91ca7e8f3b464890ab1d48b84e94ea>:0)
UnityEngine.Events.UnityEvent.Invoke () (at <be91ca7e8f3b464890ab1d48b84e94ea>:0)
UnityEngine.UI.Button.Press () (at ./Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/Button.cs:70)
UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at ./Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/Button.cs:114)
UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at ./Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:57)
UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents+EventFunction`1 functor) (at ./Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:272)
UnityEngine.EventSystems.EventSystem:Update() (at ./Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:530)

FishC 发表于 2024-2-29 20:47:21

愿闻其详 发表于 2024-02-29 20:46
NullReferenceException: Object reference not set t ...

根据提供的错误信息,问题出现在 `NewBehaviourScript6` 类中的 `ClickButton()` 方法的第42行。具体地说,这个错误是 `NullReferenceException`,意味着你引用的对象为空,即没有被实例化。

根据你的代码,这个问题可能出现在以下几个地方:
1. 检查 `m_btn` 变量是否已经赋值为一个有效的按钮组件。确保你在 `Awake()` 方法中正确获取了按钮组件并将其赋值给 `m_btn`。
2. 确保 `Scripta`、`Scriptb`、`Scriptc`、`Scriptd` 和 `Scripte` 这些变量已经引用了正确的脚本实例。请仔细检查这些脚本是否已经附加到适当的 GameObject 上,并且这些脚本都有名为 `module` 的公共变量。
3. 如果你使用了 `FindObjectOfType()` 方法来查找脚本实例,确保这些脚本确实存在于场景中,否则它们将返回空值,导致空引用异常。
4. 最后,确保你的按钮确实被点击了,以触发 `ClickButton()` 方法。

检查并解决以上可能的问题,应该能够修复这个错误。如果仍然有问题,请提供相关代码的第42行以及其他相关代码,以便更好地帮助你找到问题所在。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

愿闻其详 发表于 2024-2-29 20:48:21

FishC 发表于 2024-2-29 20:47
根据提供的错误信息,问题出现在 `NewBehaviourScript6` 类中的 `ClickButton()` 方法的第42行。具体地 ...

Scripte.module = 1;

FishC 发表于 2024-2-29 20:48:42

愿闻其详 发表于 2024-02-29 20:48
Scripte.module = 1;

根据你提供的错误信息,问题可能出现在 `Scripte` 对象上的 `module` 属性上。你试图将其赋值为1,但出现了空引用异常。这意味着 `Scripte` 对象是空的,没有被实例化。

确保你正确地获得(或创建)了 `NewBehaviourScript7` 类的实例,并将其赋值给 `Scripte` 变量。你可以检查以下几个方面:

1. 确保 `NewBehaviourScript7` 类已经附加到一个 GameObject 上,并且该 GameObject 在场景中处于激活状态。
2. 确保你使用了正确的获取方法来获取 `NewBehaviourScript7` 实例。例如,可以使用 `FindObjectOfType<NewBehaviourScript7>()` 来查找场景中的唯一一个 `NewBehaviourScript7` 实例。
3. 如果你使用其他方式获取 `Scripte` 的实例,请确保该方式正确获取了实例。

检查并解决以上问题后,再次运行你的代码,应该能够成功将 `Scripte.module` 赋值为1,避免空引用异常。如果问题仍然存在,请提供更多相关的代码和错误信息,以便进一步帮助你解决问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: Unity报错