Unity如何判断对象是否已被Destroy

2023-11-09

熟悉了cocos语法的都知道cc.isValid这个api可以判断节点/组件是否可用(是否已被销毁)

而Unity中却没有这样的API,往往使用==null来进行判断

那么==null到底如何来判断呢?

Part 1

        public int numTest = 998;
        public void Print()
        {
            Debug.Log("TestScriptOfBilly.Print this.gameObject.name " + this.gameObject.name);  //0
            Destroy(gameObject);
            Debug.Log("TestScriptOfBilly this == null 1st " + (this == null).ToString());       //1
            Debug.Log("TestScriptOfBilly this.numTest 1st " + numTest);                         //2
            Debug.Log("TestScriptOfBilly this.gameObject.name 1st " + this.gameObject.name);    //3
            DOVirtual.DelayedCall(1.0f, () =>
            {
                Debug.Log("TestScriptOfBilly DelayedCall callback this == null 2nd " + (this == null).ToString());  //4
                Debug.Log("TestScriptOfBilly DelayedCall callback this.numTest 2nd " + numTest);                    //5
                Debug.Log("TestScriptOfBilly DelayedCall callback this.gameObject.name 2nd" + this.gameObject.name);//6
            });
        }

在这里插入图片描述

结合log可以发现

Destroy之后当前帧内this(MonoBehaviour)与gameObject都未被立即销毁

1,2,3三句log可以佐证

而在延迟回调里面(Destroy之后的帧)

4,5,6三句log十分"诡异"

第4句this==null已经变为了true

第5句却仍然能访问到this.numTest的值998

第6句访问gameObject直接报错

这里大胆推测,this其实并不是null

而是由于

UnityEngine.Object

public static bool operator ==(Object x, Object y);

这里重写了运算符,把已经销毁的Object根据销毁标记在与null判定相等时返回了true

Part 2
为此我们再做一个实验

       void testValid()
        {
            TestScriptOfBilly tsob = imgTest.GetComponent<TestScriptOfBilly>();
            Destroy(imgTest);
            DOVirtual.DelayedCall(1.0f, () =>
            {
                Debug.Log("DelayedCall callback tsob == null " + (tsob == null).ToString());
                Debug.Log("DelayedCall callback tsob.numTest 1st " + tsob.numTest);
                tsob = null;
                Debug.Log("DelayedCall callback tsob.numTest 2nd " + tsob.numTest);
            });
        }

在这里插入图片描述

可以清晰的看到

同样判空==true

1st输出了998

tsob=null赋值之后2nd未输出直接报错

因为索引null的属性报错是必然的

Part 3
再测试一下DestroyImmediate

       void testValid()
        {
            TestScriptOfBilly tsob = imgTest.GetComponent<TestScriptOfBilly>();
            DestroyImmediate(imgTest);
            Debug.Log("testValid imgTest == null " + (imgTest == null).ToString());
            Debug.Log("testValid tsob == null " + (tsob == null).ToString());
            Debug.Log("testValid tsob.numTest " + tsob.numTest);
        }

在这里插入图片描述

结果与预期一致 DestroyImmediate使判空可以立即生效不必等到下一帧

其余逻辑与Destroy一致

Part 4
最后终极测试一下,通过两个文件来操作

TestScriptOfBilly.cs

        public void DoDestroy()
        {
            Debug.Log("TestScriptOfBilly.Print and DestroyImmediate");
            DestroyImmediate(gameObject);
        }

TestSceneOfBilly.cs

        void testValid()
        {
            TestScriptOfBilly tsob = imgTest.GetComponent<TestScriptOfBilly>();
            tsob.DoDestroy();
            Debug.Log("testValid imgTest == null " + (imgTest == null).ToString());
            Debug.Log("testValid tsob == null " + (tsob == null).ToString());
            Debug.Log("testValid tsob.numTest " + tsob.numTest);
        }

结果与之前一致

侧面说明Destroy并未在销毁后对参数赋值为null

无论tsob还是前面的this都是在==操作符重载里根据内部状态来判定的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity如何判断对象是否已被Destroy 的相关文章

  • c#获取cpu序列号

  • UE4 解决景深效果闪烁问题

    原因 1 模型的垂直竖线 造成抗锯齿算法对竖线的渲染计算 处于一种不稳定的状态 因此闪烁 解决办法 使用LOD 用贴图去替代线条模型 2 材质的法线贴图 当法线贴图含有垂直竖线的纹理效果 也会造成闪烁 比如这种幕墙材质 解决办法 关闭或动态
  • Unity中级客户端开发工程师的进阶之路

    上期UWA技能成长系统之 Unity高级客户端开发工程师的进阶之路 得到了很多Unity开发者的肯定 通过系统的学习 可以掌握游戏性能瓶颈定位的方法和常见的CPU GPU 内存相关的性能优化方法 UWA技能成长系统是UWA根据学员的职业发展
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • Unity中实现倒计时的几种方式

    1 Time time using UnityEngine public class TimeTest MonoBehaviour public float secound 10 void Update Timing private flo
  • unity中创建询问弹出窗口

    在开发过程中进程会遇到需要弹出一个窗口询问用户是否进行的操作 今天就来制作一个这样弹出窗口 然后根据弹出窗口的选择内容不同进行不同的操作 本例中主要是为了删除一个数据 而在删除数据操作前需要得到用户的一个确认操作 这里面主要用到了Notif
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函
  • VLC for unity 插件如何使用

    VLC for unity 插件如何使用 先去下载一个VLC播放器 安装完成后 然后导入插件链接https download csdn net my 这个插件我的另一个上传资源里有 或者到商店去下载 这个插件链接下载完是一个txt文档 里面
  • 【Unity】按Esc进入操作菜单

    本文章是基于如下视频的自我总结 https www youtube com watch v JivuXdrIHK0 步骤如下 1 在Canvas 界面添加一个Panel Panel中添加一个按钮 调整按钮的大小为合适大小 调整字体的大小为合
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • unity dots jobSystem 记录

    Looking for a way to get started writing safe multithreaded code Learn the principles behind our Job System and how it w
  • Unity万向节死锁解决方案(2023/12/4)

    1 万向节死锁无法解决 这是因为它的特性就是如此 就像玻璃杯就是玻璃 这不可否认 别钻牛角尖昂 2 大多数情况下欧拉角足够用 例如 CF 摄像机不可能绕z轴旋转 x轴旋转也不会超过九十度 因为那样人物的腰子会被扭断 塔防游戏 保卫萝卜 吃鸡
  • unity3d image组件不显示

    需要将UI组件放到画布下面
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • 游戏开发常见操作梳理之小地图的制作

    游戏中一般存在小地图系统 实际上就是设置一个新的摄像机放置在玩家的正上方 然后在小地图上显示新摄像机看见的东西就可以了 在小地图上一般存在放大地图和缩小地图的按钮可以方便放大和缩小地图 这些操作是如何实现的呢 接下来直接上核心代码 usin

随机推荐

  • 数字图像处理 -灰度变换 之 gamma变换(gamma transformation)

    Reference https blog csdn net zhoufan900428 article details 12709361 The gamma transformation is different from log tran
  • HTTP的8种请求方法和用途

    一 什么是HTTP 超文本传输协议 Hyper Text Transfer Protocol HTTP 是一个简单的请求 响应协议 它通 常运行在TCP之上 它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应 请求 和响应消息的
  • 2023.8.31题目小记

    1 费解的开关 1208 翻硬币 AcWing题库 1 使用位进制优化 2 由于第一行如果已经确定下来则后面的每一行都可以确定 可以将第一行的所有方法全部记录下来PS 32的二进制为100000一共六位 而此就已经可以使用位运算将五位开关全
  • 哪些数组操作会影响vue视图的更新?改变数组本身的方法有哪些?附面试题1

    多选题 在vue中 下列哪些选项对数组的操作触发视图更新 A push B shift C concat D reverse 先独立思考 正确答案 A B D 解析 c选项 concat 返回的是一个新的数组 需要用新数组替换原数组才能实现
  • 乐高选择亚马逊云科技 为客户创造卓越体验

    近日 亚马逊云科技宣布 全球知名玩具制造商乐高集团 the LEGO Group 选择亚马逊云科技作为首选云服务提供商 加速推进数字化战略 打造充满创意 乐趣和互动性的玩乐新体验 基于亚马逊云科技全球一致的基础设施 以及计算 存储 数据库
  • Win7上搭建Linux环境

    自制编程语言的环境搭建 一 C编译器 Windows环境下使用MinGW Minimalist GNU for Windows 安装完成后可以在Windows的命令行窗口中进行测试 并编译C语言代码 下载地址 点击下载 解压安装 并记录下安
  • 数码管循环显示数字

    文章目录 一 前言 二 芯片使用 1 74hc245 2 74ls138译码器 三 硬件连接 四 软件代码 五 效果展示 六 代码链接 一 前言 数码管进行显示成功后 可根据自己的想法进行改进 本设计采用八位数码管进行循环显示0 f 其中涉
  • Jenkins配置Git构建SpringBoot项目

    目录 介绍 环境变量配置 配置jdk 配置git 配置maven 下载jenkins brew下载 war包下载 配置jenkins 配置环境 Jenkins从Git拉取代码构建SpringBoot项目 项目配置 General 源码管理
  • 500 Internal Server Error 原因及解决方案

    服务迁移之后接口响应变慢 而且还有报错 500 Internal Server Error 端上请求报错日志 原因初步分析 数据包比较大的时候 比如参数多 大的对象 或者图片base64等格式之间往服务端发送请求时 1 前后端服务连接超时
  • memset和memcpy函数

    memset函数 原型 void memset void s int ch size t n 作用 将s所指向的内存中的前n个字节的内容全部设置为ch指定的ASCII值 这个函数通常为新申请的内存做初始化工作 一般用于结构体和数组的初始化
  • 如何用eachart来做一个全国地图撒点的效果

  • Thinkphp5.1开发钉钉应用:企业免登陆_移动端demo

    config gt base php
  • Python的应用场景及优越性能

    你是否正在寻找一种能够在各种应用场景中广泛应用的编程语言 你是否希望能够使用一种易学易用 功能丰富 生态系统完善的语言进行开发工作 那么 Python就是你的不二选择 Python已成为广大开发者和企业的首选编程语言之一 其在各个领域的应用
  • Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能

    转载请注明出处 http blog csdn net guolin blog article details 9255575 最近项目中需要用到ListView下拉刷新的功能 一开始想图省事 在网上直接找一个现成的 可是尝试了网上多个版本的
  • 我第一次面试自动化测试就被diss了,人生惨遭滑铁卢…

    如果你恰好刚刚进入一家新公司 领导一上来就让你开展自动化测试 作为一名初出茅庐的测试新人 除了手足无措 你只能默默慨叹自己能力尚欠 眼前只会出现一个又一个无从下手的问题 作为手工测试 如何营造机会和环境解决我们自身提升的瓶颈 好慌 以为自己
  • 广州面试题------万欣科技

    部分答案 4 Unchecked Exception 指得是程序的逻辑错误 程序的疵瑕 并且运行的时候无法恢复 包括Error以及RuntimeException及其子类 如 OutOfMemoryError Checked Excepti
  • 【计算机毕业设计】基于微信小程序的校园生活服务系统 校园生活微信小程序

    毕设帮助 技术解答 源码交流 联系方式见文末 一 系统概述 智慧校园建设近年来发展迅猛 校园生活也是社会生活的一部分 完善校园生活线上产品是便利师生生活的必然趋势 高校也积极上线各类信息化系统代替原本的人工操作 目前很多高等院校的智慧校园系
  • 十四Spark ALS协同过滤java

    API http spark apache org docs 1 6 2 api java index html 机器学习里面包含两个包 org apache spark ml 输入是dataframe sql org apache spa
  • VRF技术

    VRF技术白皮书 1 原理简介 近年来网络VPN技术方兴未艾 日益成为业界关注的焦点 根据VPN实现的技术特点 可以把VPN技术分为以下三类 传统VPN FR和ATM CPE based VPN L2TP和IPSec等 Provider P
  • Unity如何判断对象是否已被Destroy

    熟悉了cocos语法的都知道cc isValid这个api可以判断节点 组件是否可用 是否已被销毁 而Unity中却没有这样的API 往往使用 null来进行判断 那么 null到底如何来判断呢 Part 1 public int numT