Unity中使用UnityEvent遇到Bug

UnityEvent绑定过程中,放在Start()中绑定会报错(通过脚本添加UnityEvent事件脚本,绑定)

绑定事件放在OnEnable()中不会报错,但是依然不可以立刻添加UnityEvent事件脚本紧接着立刻绑定事件。

或者在Start()添加UnityEvent事件的脚本与绑定间隔时间长一些也不会报错。

示例:

创建点击对象方法

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class My3DObjOnClick : MonoBehaviour
{
    public UnityEvent events;
    private void OnMouseUpAsButton()
    {
       // if (EventSystem.current.IsPointerOverGameObject()) return;
        events.Invoke();
    }
}

报错案例1: 

创建绑定方法:

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

public class Test : MonoBehaviour
{
    public Transform tar;//
    private void Start()
    {
        add_click_listener(Redian1_Click);
    }
    public void add_click_listener( UnityAction onclick)
    {
        tar.gameObject .AddComponent<My3DObjOnClick>();
         tar.GetComponent<My3DObjOnClick>().events.AddListener(onclick);
    }
    private void Redian1_Click()
    {
        Debug.Log("Redian1_Click");
    }
}

报错案例2:  

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

public class Test : MonoBehaviour
{
    public Transform tar;
    private void Start()
    {  
        add_click_listener(Redian1_Click);
    }
    public void add_click_listener( UnityAction onclick)
    {
        tar.gameObject .AddComponent<My3DObjOnClick>(); 
        StartCoroutine("ceshi", onclick);
    }
    IEnumerator ceshi(UnityAction onclick)
    {
        yield return new WaitForEndOfFrame  ();
        //如果将时间延长,延长到5s则不会报错
       //  yield return new WaitForSeconds (5);
        tar.GetComponent<My3DObjOnClick>().events.AddListener(onclick);
    }
    private void Redian1_Click()
    {
        Debug.Log("Redian1_Click");
        // panelModel1_UICtrl.Open_Redian1();
    }
}

 报错案例3:  

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

public class Test : MonoBehaviour
{
    public Transform tar;
    private void OnEnable()
    {   
        add_click_listener(Redian1_Click);
    }
    public void add_click_listener( UnityAction onclick)
    {
        tar.gameObject .AddComponent<My3DObjOnClick>();
        tar.GetComponent<My3DObjOnClick>().events.AddListener(onclick);
    }
    private void Redian1_Click()
    {
        Debug.Log("Redian1_Click");
    }
}

  不报错案例1:  

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class Test : MonoBehaviour
{
    public Transform tar;
    private void OnEnable()
    {
        add_click_listener(Redian1_Click);
    }
    public void add_click_listener( UnityAction onclick)
    {
        tar.gameObject .AddComponent<My3DObjOnClick>();
         StartCoroutine("ceshi", onclick);
    }
    IEnumerator ceshi(UnityAction onclick)
    {
        yield return new WaitForEndOfFrame  ();
        tar.GetComponent<My3DObjOnClick>().events.AddListener(Redian1_Click);
    }
    private void Redian1_Click()
    {
        Debug.Log("Redian1_Click");
    }
}

不报错案例2:   

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

public class Test : MonoBehaviour
{
    public Transform tar;
    private void Start()
    {  
        add_click_listener(Redian1_Click);
    }
    public void add_click_listener( UnityAction onclick)
    {
        tar.gameObject .AddComponent<My3DObjOnClick>(); 
        StartCoroutine("ceshi", onclick);
    }
    IEnumerator ceshi(UnityAction onclick)
    {
       yield return new WaitForSeconds (5);
        tar.GetComponent<My3DObjOnClick>().events.AddListener(onclick);
    }
    private void Redian1_Click()
    {
        Debug.Log("Redian1_Click");
        // panelModel1_UICtrl.Open_Redian1();
    }
}

 不报错案例3:   

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

public class Test : MonoBehaviour
{
    public Transform tar;
    private void OnEnable()
    {
        tar.gameObject .AddComponent<My3DObjOnClick>();
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            tar.GetComponent<My3DObjOnClick>().events.AddListener(Redian1_Click);
        }
    }
    private void Redian1_Click()
    {
        Debug.Log("Redian1_Click");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/898622.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GeoWebCache1.26调用ArcGIS切片

GeoServer GeoWebCache (osgeo.org) 一、版本需要适配&#xff1a;Geoserver与GeoWebCache、jdk等的版本适配对照 ​ 查看来源 二、准备工作 1、数据&#xff1a;Arcgis标准的切片&#xff0c;通过ArcGIS Server发布的切片文件&#xff0c;注意切片的存储格式为exploded&…

rust入门基础总结

文章目录 前言1、输出格式规范一、占位符相关&#xff08;一&#xff09;{}与{:?} 二、参数替换方式&#xff08;一&#xff09;位置参数&#xff08;二&#xff09;具名参数 三、格式化参数&#xff08;一&#xff09;宽度&#xff08;二&#xff09;对齐&#xff08;三&…

电脑异常情况总结

文章目录 笔记本无症状息屏黑屏 笔记本无症状息屏黑屏 &#x1f34e; 问题描述&#xff1a; 息屏导致黑屏&#xff1b;依次操作计算机--》右键--》管理--》事件查看器--》Windows日志--》系统&#xff1b;从息屏到异常黑屏之间出现了很多错误&#xff0c;如下&#xff1a;事件…

如何区别医疗器械唯一标识(UDI)、医用耗材统一标识码(HCBS)和医保医用耗材编码

医疗器械唯一标识&#xff08;UDI&#xff09;、医用耗材统一标识码&#xff08;HCBS&#xff09;和医保医用耗材编码三种重要标识&#xff0c;在医疗领域发挥着举足轻重的作用。 医疗器械唯一标识UDI码是被比喻成医疗器械产品的“身份证”&#xff08;每个人都有&#xff09;…

「AIGC」n8n AI Agent开源的工作流自动化工具

n8n AI Agent 是一个利用大型语言模型(LLMs)来设计和构建智能体(agents)的工具,这些智能体能够执行一系列复杂的任务,如理解指令、模仿类人推理,以及从用户命令中理解隐含意图。n8n AI Agent 的核心在于构建一系列提示(prompts),使 LLM 能够模拟自主行为。 传送门→ …

鸿蒙软件开发中常见的如何快速自动生成二维码?QRCode组件

QRCode 用于显示单个二维码的组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 二维码组件的像素点数量与内容有关&#xff0c;当组件尺寸过小时&#xff0c;可能出现无法展示内容的情况&…

电脑输入账号密码后,屏幕黑屏只有鼠标解决办法

最近办公电脑出现了两次输入密码后,屏幕黑屏之后鼠标能动的问题,只能有手机查一些资料尝试自己解决,具体什么原因导致的暂时还不清楚。解决这个问题大概有两个方案吧&#xff0c;第一次黑屏用的第一个方案&#xff0c;第二次发现第一个方案不好用了就用的第二个方案。 方案一 …

【Python-AI篇】人工智能机器学习

1. 机器学习简介 1.1 机器学习流程 获取数据 SKLEARN数据集查看数据分布数据集分类 数据基本处理 缺省值处理缩小数据范围异常数据处理数据分割类别不平衡数据处理方式 特征工程机器学习(算法) K-近邻算法线性回归线性回归的改进-岭回归逻辑回归(分类)决策树朴素贝叶斯SVMEM算…

创建型模式-----(单例模式)

目录 基本概念 饿汉式&#xff1a; 懒汉式&#xff1a; 上锁双判空版本 std::call_once版本&#xff1a; C11标准后局部静态变量版本&#xff1a; 项目中单例模板的应用 基本概念 单例模式&#xff1a;在程序运行期间只有一份&#xff0c;与程序生存周期一样&#xff0c;…

记一行代码顺序引起的事故

01 前情回顾 在这里跟同学们分享一个前几天在线上遇见的 bug… bug描述&#xff1a;客户端轮询服务端接口获取数据做打字机效果展示&#xff0c;会偶现输出到一半就停止不动了&#xff0c;但是数据还没输出完&#xff08;如下图&#xff0c;到红色部分就卡住了&#xff09;。…

【Axure高保真原型】移动案例

今天和大家分享多个常用的移动案例的原型模板&#xff0c;包括轮盘滑动控制元件移动、页面按钮控制元件移动、鼠标单击控制元件移动、元件跟随鼠标移动、鼠标拖动控制元件移动、键盘方向键控制元件移动&#xff0c;具体效果可以点击下方视频观看或打开下方预览地址查看哦 【原…

虚拟装配解决方案:在虚拟现实中实现移动零件与三维模型碰撞检测

装配过程占产品开发时间和成本的很大一部分。在投入生产前对产品装配进行碰撞检测能够有效的降低因设计疏忽所导致的重复试错所导致的成本增加&#xff0c;并进一步降低设计审核整体流程所需时间。 选择、移动和操作3D模型的各个部分 TechViz多通道软件具有通用零件识别引擎&am…

Core webapi<1>特性 Route、Bind、HttpGet、Consumes、Produces

微软资料 Consumes Produces 让 API 返回 text/json 类型的数据。因为默认情况下&#xff0c;API 返回数据使用 application/json 格式&#xff0c;所以&#xff0c;咱们要改为 text/json&#xff0c;就得用 Produces 特性。

Java最全面试题->Java基础面试题->JavaEE面试题->Web应用服务器面试题

文章目录 Web应用服务器面试题Tomcat是什么?Tomcat缺省端口是多少&#xff0c;如何修改&#xff1f;Tomcat 有那几种Connector 运行模式&#xff1f;什么是Servlet&#xff1f;Servlet请求过程&#xff1f;Tomcat执行流程&#xff1f;Tomcat部署方式?什么是JBoss ?在JBoss 7…

UG NX12.0建模入门笔记:1.1 UG界面编辑

文章目录 一、用户默认设置&#xff1a;修改新建零件时的默认存储路径。二、用户默认设置&#xff1a;修改默认图纸的尺寸单位。三、如何移除不需要的工具栏&#xff1f;四、如何将角色设置成高级&#xff0c;以使用更多的功能&#xff1f;五、如何修改软件背景颜色&#xff1f…

w~自动驾驶合集9

我自己的原文哦~ https://blog.51cto.com/whaosoft/12320882 #自动驾驶数据集全面调研 自动驾驶技术在硬件和深度学习方法的最新进展中迅速发展&#xff0c;并展现出令人期待的性能。高质量的数据集对于开发可靠的自动驾驶算法至关重要。先前的数据集调研试图回顾这些数据集&…

取得六西格玛绿带培训证书有什么用?

六西格玛作为一套科学的管理方法和工具&#xff0c;已被广泛应用于各个行业。而六西格玛绿带培训证书&#xff0c;作为这一体系中的基础认证&#xff0c;不仅是对个人专业能力的认可&#xff0c;更是职业生涯中的一大助力。本文&#xff0c;天行健企业管理咨询公司旨在分享取得…

山东济南杰出思想家颜廷利:升命学说,当今世界前沿哲学思想

颜廷利教授的"升命学说"是一个将现代科技发展与中华传统文化相结合的当今世界前沿哲学教育理论框架&#xff0c;它是在传统哲学基础上的一种目前社会创新性思想体系。为了理解"升命学说"与传统哲学的不同之处&#xff0c;我们可以从以下几个方面来探讨&…

通过docker desktop拉取镜像打包镜像传输到其它服务器中

通过docker desktop拉取镜像打包镜像传输到其它服务器中 使用 docker save 命令将镜像保存为 tar 文件 docker save -o <path-for-tar-file> <image-name-with-tag>例如&#xff0c;如果想要保存名为 myimage:latest 的镜像&#xff0c;并将其保存到当前目录的 m…

【K8S系列】Kubernetes node节点NotReady问题及解决方案详解【已解决】

Kubernetes 集群中的每个节点都是运行容器化应用的基础。当节点状态显示为 NotReady 时,意味着该节点无法正常工作,这可能会导致 Pod 无法调度,从而影响整个应用的可用性。本文将深入分析节点不健康的各种原因、详细的排查步骤以及有效的解决方案。 一、节点不健康的原因 节…