当前位置: 首页 > news >正文

Unity学习笔记--EventSystem事件系统在使用上需要注意的地方(很基础,但是很多人会忘记!!!)

目录

    • 前言
    • 代码
    • Unity 场景配置
    • 运行
    • 报错分析
    • 解决办法
    • 拓展(预告)

前言

之前有写过一篇关于事件系统实现以及使用的文章
Unity学习笔记–C#事件系统的实现与应用
最近在使用的时候遇到了一些问题,所以在此记录下,也为看到这篇文章的人提个醒。

代码

先给大家上一些代码,大家可以看看哪里会出问题

Tips:这里就不上 EventSystem 的代码了,直接拿上面文章里面写好的。

GameManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Util;public class GameManager : MonoBehaviour
{private int cnt = 0;private void Awake(){}private void Update(){if (Input.GetKeyDown(KeyCode.W)){cnt++;Util.EventSystem.Dispatch("EnemyDead", new EventData(new Dictionary<string, object>(){{ "cnt", cnt }}));}}
}

Enemy.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Util;public class Enemy : MonoBehaviour
{public int id;public void Start(){Util.EventSystem.AddEventListener("EnemyDead", Dead);}private void Dead(EventData ev_data){print($"------Enemy Dead {ev_data.parms["cnt"]} ------");print($"MonoBehaviour : {this}, id = {id}");print($"gameobject = { this.gameObject}");}
}

Unity 场景配置

在这里插入图片描述

运行

在这里插入图片描述
在这里插入图片描述

此时并没有什么问题,接下来看我操作
在这里插入图片描述
在这里插入图片描述

报错分析

根据报错提示和打印,我们发现有一个 Enemy 组件为 null 。

我们的操作时:删掉了对应 Enemy 的 GameObject ,导致该对象所挂的 Enemy 组件也被删掉了。
但是我们在 Enemy.cs 中的 Start 函数中注册了对应的事件,所以当我们按下 W 键的时候, EventSystem 还是会找到所注册的函数并且调用它,但是对应的脚本已经被删掉了,所以打印出来是 null。
理所当然 this.gameobject 就报错了。

解决办法

解决办法就是写一个 OnDestory 函数,在这个函数里面注销掉对应的函数就好了。
在这里插入图片描述
在这里插入图片描述

拓展(预告)

但是!!!
我们发现可以打印出 Enemy.cs 的 id 属性。

可以看之前报错的图,被删掉之后,还是可以打印出 id 属性,并且值也是正确的

这里就有点东西了。

接下来一篇文章我们将会一起去研究这一块。

因为我现在也不是很清楚原因(笑)但是我猜测应该是和 C++ 层相关。

http://www.lryc.cn/news/94212.html

相关文章:

  • 高手必备:JVM调优的常用命令和参数一网打尽!
  • Uniapp 开发 ①(快速上手)
  • 【数据库原理与实践】知识点归纳(下)
  • 代码随想录day34
  • CSS知识点汇总(八)--Flexbox
  • ASCII、Unicode、UTF-8、GBK
  • 【安全】使用docker安装Nessus
  • 【Hadoop综合实践】手机卖场大数据综合项目分析
  • 服务器技术(三)--Nginx
  • OpenCV——总结《车牌识别》之《常用的函数介绍》
  • chatgpt赋能python:如何利用Python进行自动化办公
  • linux-2.6.22.6内核网卡驱动框架分析
  • 机器学习7:特征工程
  • coverage代码覆盖率测试介绍
  • 使用 Debian、Docker 和 Nginx 部署 Web 应用
  • Redis原理 - 内存策略
  • 【计算机网络】IP 地址处理函数
  • 9i物联网浏览器(cef_114.2.110114.2.100支持H264视频)WinForm-CefSharp114(5735)视频版本体验
  • 如何在本地运行一个已关服但具有客户端的游戏
  • C语言编程—预处理器
  • 使用 Maya Mari 设计 3D 波斯风格道具(p1)
  • Redis分布式问题
  • synchronized原理
  • 10G光模块能兼容千兆光口吗
  • css 显示省略号 和 动态显示省略号
  • LeetCode 1253. 重构 2 行二进制矩阵
  • 【八股】【C++】内存
  • 数据库G等待
  • PCB封装设计指导(一)基础知识
  • Flask框架之Restful--介绍--下载--基本使用