unity关于文本显示与隐藏,报空错误的解决(避坑)

  1. 这个问题一直卡了我许多天的,浪费了很多时间,现在终于解决了,发出来让大家避免此坑

写了个碰撞脚本,当人物获得到目标物品时,显示文本内容

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


public class Destroyed : MonoBehaviour
{
    public static GameObject txt ; //定义txt,将文本内容所在的“gain”层赋值到txt上
    
    void Start ()
    {
        txt = GameObject.Find("gain");
        txt.SetActive(false);//隐藏文本
        
    }
    
    void Update () {
        
    }
    public void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == "bs")//人物触碰到宝石,宝石消失,文本显示
        {
             
             Destroy(collision.gameObject);    
             txt.SetActive(true);
        }
    }

}


这个脚本写完后,控制台一直报错这个

NullReferenceException: Object reference not set to an instance of an object
Destroyed.Start () (at Assets/Destroyed.cs:12)

然后我去百度,csdn,b站等上搜了很多,但都没卵用,一直没解决

直到三个月后我再贴吧看到了这个

【问题求助】关于SetActive的疑问【unity3d吧】_百度贴吧 (baidu.com)

我看了下自己的发现正好自己canvas上有这个脚本

移除后发现竟然能运行成功了,nb

 这个也是我经过了无数次失败后才得以解决掉一个错误

因为多绑了一个脚本在canvas上导致的错误

刚刚开始写这个的时候,好像是我写的脚本是绑在宝石上的,宝石遇到人物时触发消失脚本Destroyed

但是后来我发现无论怎么改这个,哪怕canvas上也没多绑这个脚本也会出错,很可能跟我设计的多个宝石数量有关,(因为修改后destroyed脚本只绑一个人物上,多绑的话会报空),而我设计的宝石却有多个,没错我就是把宝石绑了6个脚本,这下子我无论怎么样改都会报空

于是我修改了脚本,绑在了人物上,然后就变成了上面所说的

之前一度以为网上所写的脚本有问题,因为一直报空,结果发现是我的问题.....

最后再附一个关于如何显示与隐藏文本的教程:

交互游戏设计与开发unity_20.1触发后显示文字的方法_哔哩哔哩_bilibili

Unity中,你可以通过创建一个简单的交互式流程来实现这个功能。通常会使用脚本控制游戏状态和用户界面的更新。以下是步骤: 1. 创建UI控件:首先,在Canvas中创建十个`Button`或`Image`等控件,每个代表一道题目,并给它们分配唯一的ID。 2. 存储题目数据:将十道选择题作为字符串或对象数组存储在变量里,比如List或Dictionary。 3. 遍历显示题目:编写一个脚本,初始化时隐藏所有按钮,然后按顺序遍历题目列表,依次将每个题目的内容赋值给对应的按钮文本。 4. 答题逻辑:为每个按钮添加点击事件处理函数,当用户点击某个按钮时,检查是否答对并更新显示。答对后可以显示下一个题目,答错则保持原样。如果答完所有题目,则可以考虑结束当前环节或跳转到下一部分。 5. 隐藏显示:在答题逻辑中,每次答对或答错后,调用`gameObject.SetActive(false)`隐藏当前题目,调用`SetActive(true)`显示下一个题目,直到所有的题目都显示完毕或达到特定条件。 ```csharp public class QuizManager : MonoBehaviour { public List<string> questions; public Button[] buttons; private int currentQuestionIndex = 0; void Start() { HideAllButtons(); ShowQuestion(currentQuestionIndex); } void ShowQuestion(int index) { if (index < questions.Count) { buttons[index].text = questions[index]; buttons[index].SetActive(true); buttons[currentQuestionIndex].SetActive(false); currentQuestionIndex = index; } } void OnButtonClick(Button button) { // 检查答案,更新得分,切换题目... if (button.index == currentQuestionIndex) { if (IsAnswerCorrect(button)) { currentQuestionIndex++; if (currentQuestionIndex < questions.Count) ShowQuestion(currentQuestionIndex); else EndQuiz(); } else { // 错误处理 } } } private bool IsAnswerCorrect(Button button) // 这部分需要你自己实现判断逻辑 { return true; // 例如这里的示例代码返回默认真 } void HideAllButtons() { foreach (var button in buttons) button.SetActive(false); } void EndQuiz() { // 结束或切换到下一部分 } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值