Unity中使用UnityEvent遇到Bug

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

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

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

示例:

创建点击对象方法

cs 复制代码
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:

创建绑定方法:

cs 复制代码
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:

cs 复制代码
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:

cs 复制代码
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:

cs 复制代码
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:

cs 复制代码
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:

cs 复制代码
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");
    }
}
相关推荐
牙膏上的小苏打23331 小时前
Unity Surround开关后导致获取主显示器分辨率错误
unity·主屏幕
Unity大海3 小时前
诠视科技Unity SDK开发环境配置、项目设置、apk打包。
科技·unity·游戏引擎
越学不动啦8 小时前
四、Bug篇+用例篇
软件测试·测试用例·bug·软件工程·测试基础
有时间要学习8 小时前
Test——BUG篇
bug·测试
浅陌sss9 小时前
Unity中 粒子系统使用整理(一)
unity·游戏引擎
维度攻城狮13 小时前
实现在Unity3D中仿真汽车,而且还能使用ros2控制
python·unity·docker·汽车·ros2·rviz2
为你写首诗ge16 小时前
【Unity网络编程知识】FTP学习
网络·unity
神码编程18 小时前
【Unity】 HTFramework框架(六十四)SaveDataRuntime运行时保存组件参数、预制体
unity·编辑器·游戏引擎
菲fay19 小时前
Unity 单例模式写法
unity·单例模式
火一线21 小时前
【Framework-Client系列】UIGenerate介绍
游戏·unity