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");
    }
}
相关推荐
郭逍遥23 分钟前
[Godot] C#基于噪声的简单TileMap地图生成
游戏引擎·godot
作孽就得先起床6 小时前
unity UnauthorizedAccessException: 拒绝访问路径
unity·游戏引擎
tealcwu8 小时前
【Unity踩坑】Unity项目提示文件合并有冲突
elasticsearch·unity·游戏引擎
tealcwu1 天前
【Unity小技巧】如何将3D场景转换成2D场景
3d·unity·游戏引擎
全栈陈序员1 天前
用Rust和Bevy打造2D平台游戏原型
开发语言·rust·游戏引擎·游戏程序
鹿野素材屋1 天前
Unity模型中人形角色的嘴巴一直开着怎么办
unity
世洋Blog1 天前
Unity面经-List底层原理、如何基于数组、如何扩容、List存储泛型、List有关在内存中的结构
unity·面试·c#·list
神秘的土鸡1 天前
【CS创世SD NAND征文】为无人机打造可靠数据仓:工业级存储芯片CSNP32GCR01-AOW在飞控系统中的应用实践
嵌入式硬件·游戏引擎·无人机·cocos2d·雷龙
jtymyxmz2 天前
《Unity Shader》6.4.3 半兰伯特模型
unity·游戏引擎
AA陈超2 天前
ASC学习笔记0001:处理目标选择系统中当Actor拒绝目标确认时的调用
c++·笔记·学习·游戏·ue5·游戏引擎·虚幻