Unity脚本(2) --- 脚本生命周期以及脚本的控制台调试

news2024/11/26 20:35:56

1.什么是脚本生命周期?

首先什么是脚本 --- 脚本的本质其实就是类,而脚本生命周期其实就是脚本对应的那个类从开始工作到最后销毁这么一个周期 (或者说是Unity脚本从唤醒到销毁的过程

(消息,必然事件,脚本生命周期这三个是一样的)


第一部分 --- 脚本的一些细节介绍

一.在脚本中创建的字段权限不同,会在编译器(Unity)中有不同的显示

二.我们可以通过Unity的一些独特代码来调整脚本中字段在编译器(Unity)中的显示

(比如强制显示,强制隐藏以及规定范围)

三.脚本中不要写属性(用不上)和构造函数(子线程中不能够调用主线程成员,否则会出错)

 1.当我们在脚本类中创建一个访问权限为 public 的变量后,如果我们把这个脚本挂载到游戏对象上的话(生成脚本对象),在游戏对象的inspector界面会出现一个和组件框相似的脚本框

1.而我们设置为公开权限的字段会在这个脚本框中显示出来,并且具有可直接修改的接口

2.另外如果我们在类中创建字段的同时初始化了字段的话,在脚本框中该字段不会显示为0,而是显示初始化的值

1.如果我们想让私有权限的字段和具有公共权限的字段一样,在脚本框中可以显示和进行修改的话,也不是没有办法 

相关的操作就是在对应字段上面补上一行代码 --- [SerializeField] --- 序列化字段 

除了将私有权限字段在编译器中显示和变为可修改,我们还能够在编译器中将公共权限字段变为不可显示以及不可修改,方法是在公共权限字段上面补一行代码 --- [HideInInspector]  --- 在inspector界面中隐藏

加了这段代码之后我们就只能通过代码来访问这个字段(依然是公共权限),但是无法在编译器中访问这个字段(HideInInspector)

如果我们想在编译器中(脚本框中)给字段设置一个取值范围的话,只需要在对应字段的上面加一行代码 --- [Range(a,b)] --- a和b分别是范围的上界和下界 

 

 上面这种代码可以叠加使用,但都只对位于自己下方且离自己最近的一个字段起作用

1.如果脚本中的类继承了MonoBehaviour类,且需要往物体上挂载的话,则这个类中只写字段就可以了,不需要写对应的属性,反之则在写了字段后要写属性

 (不要在脚本中写构造函数,原因是不能在子线程中访问主线程成员)


第二部分 --- 初始阶段

将初始阶段的时候首先要记住的就是 Awake函数

其次介绍另一个方法 --- Debug.Log() --- 这个方法需要传一个字符串作为参数,它就相当于Console.Writeline()方法,作用是在Unity控制台中输出我们传的字符串

1.Awake方法会在游戏开始后创建游戏对象时被执行  --- 其实就相当于游戏一开始方法就会被执行

1.第二个方法 --- Start()方法,它在Awake方法执行后就会被执行

2.当有多个游戏物体上挂载了脚本的话,游戏开始时,会先将所有游戏物体挂载的脚本中的 Awake()执行一遍,然后将所有游戏物体挂载的脚本中的 Start() 方法执行一遍

 3.当存在有多个游戏物体中都挂载了脚本时,脚本的执行顺序在Unity中是定好的,我们可以进行修改,但不推荐去修改

4.Awake方法和Start方法都是用来实现初始化这个功能的,其中Awake方法先执行,Start方法后执行,如果实际初始化的时候没有先后顺序之分的话用那个方法都可以,如果有先后顺序之分的话 --- 先初始化的放Awake方法,后初始化的方法Start方法

5.小技巧:如果没有执行初始化的时候没有先后顺序之分的话,建议使用Start()方法来实现,这样做的好处是:如果哪一天我们想加入一部分先初始化的内容的时候,直接放Awake方法里就可以了,这样能省很多事

6.Awake 方法的执行时机:游戏物体被创建的时候立即执行,Strat方法执行时机:游戏物体被创建,脚本被启用后才执行,两个方法的作用都是初始化,Awake方法中实现先初始化的部分,Start方法实现后初始化的部分,两个方法都只会被执行一次

1.第三个方法OnEnable方法,它的特点如下:

一.当脚本对象被启用的时候就会被调用 --- 也就是如果出现多次关闭和启用脚本对象的话就会多次调用OnEnable方法

二.这个方法和Strat方法,Awake方法都要执行的话,则该方法早于 Start 方法,晚于 Awake 方法执行

1.this.enable为true的时候脚本被启用,为false的时候脚本关闭


第二部分 --- 物理阶段

1.默认的时间是0.02s ,一般不建议修改

2.在这个固定时间调用的方法中我们可以让物体运动,旋转等(模拟那些要不断变化的操作),不会受到渲染影响

渲染:将摄像机拍摄到的画面显示在屏幕上。渲染的时间不固定,如果画面复杂则渲染的时间长,画面简单则渲染的时间短,并且渲染时间还会受到硬件性能影响(显卡好坏)

 1.Updata方法每渲染一帧画面就执行一次,执行时间不固定,原因是渲染的时间不固定

 

1.这些也是在满足一定条件后就会被调用的方法的方法名,使用这些方法的大前提是对应的游戏物体具有碰撞器组件

1.看见Mesh Renderer那一帧执行visble方法,否则执行Invisible方法

1.OnDisable方法在对象每一次被禁用或者说是不可用的时候就会被调用一次

如果对一个组件或者是方法感到疑惑的话,可以点击任意一个组件旁边的问号,点击后就会自动跳转到Unity文档中,文档里有对组件和方法的详细介绍。 

2.查询示例 --- 比如我们想去找MoniBehaviour类中的一个方法,我们只需要在Unity文档中搜 MonoBehaviour 这个类名,然后点进与其对应的索引,就能看到所有在这个类中的字段和方法


最后一部分 --- 调试

 控制台如何打开?

1.第一种方法是点击Windows然后选择Console即可;第二种则是利用快捷键:ctrl + shift + c 

2.对之前的内容做一个修正 --- 我们需要给Debug.Log()方法传一个参数,这个参数可以是任意类型的变量,该方法执行的时候会将传进来的变量的数据以字符串的形式在Unity控制台中输出

关于控制台的一些功能的介绍:

1.Clear --- 清除控制台中所有已显示的内容

2. Collapse --- 折叠相同项 --- 将在控制台中输出的相同项折叠起来

3.Clear on play --- 将上一次运行时在控制台中输出的内容清空

4.Error pause -- 在Unity中如果游戏开始(程序开始)执行的时候出现了异常,它不会停下来,而是跳过异常部分,继续执行可执行部分,如果我们希望Unity在遇到异常之后就将停止的话,可以将这一个选项选上

 这个从左到右分别是:控制台中输出的信息(选中这个后,控制台中才会显示信息)

运行过程中的警告,以及运行过程中的错误

(补充 --- Unity中调出控制台的方法 --- 快捷键 ctrl + shift + c)

1.我们如何查看脚本的源代码呢?

答案是通过反编译来实现 --- 通过ILSpy将脚本编译而成的中间语言文件反编译为C#源代码(也可以反编译为其它的语言的源代码),反编译成功后我们就能够看到C#源代码了

操作步骤如下:

一.找到我们要进行反编译的中间语言文件,并将其拖入到ILSpy中

中间语言文件所在的路径为:项目文件\Library(图书馆)\ScriptAssemblies(脚本程序集\脚本中间语言集合)\Assembly-CSharp.dll(当前项目所有的脚本中间语言都在这个文件中)

二.找到之后直接拖进ILSpy中即可

拖进去后会生成这样一个文件,点击第四个找到我们需要进行反编译的脚本即可

(如何知道一个类的中间语言文件存储路径 --- 选中类然后按F12就能进到这个类的详情页,这个详情页中就有其中间语言文件的存储路径)

补充:在ILSpy中,如果我们想知道某个方法具体是怎么实现的,可以直接点击这个方法的方法名,此时就会跳到这个方法所在类的详情页,在这里面找到方法展开即可得知 --- 这样做的前提是这个类的中间语言文件已经在ILSpy中进行了反编译,如果没进行的话是无法跳转的

让我们回到最开始的问题:Debug.Log() 和 print() 方法的区别是什么 --- print方法是MonoBehaviour类中的一个静态方法,其本质是调用Debug.Log方法来实现在控制台中输出内容 

如果方法被 extern(外面的,外来的) 关键字修饰的话,就说明这个方法是外部引入的方法,我们无法查看其详情(未开源的方法)

(C#的底层实现是C++)

1.检测面板其实就是Inspector面版

2.这个调试方法适合用来查看某个不断变化的量的变化规律 

3.方法做法如下:

在脚本类中创建一个public字段,然后在方法中将这个不断变化的量赋值给我们创建的字段,赋值完后程序运行(PS:脚本要挂载到一个游戏物体上),此时我们就能够在游戏物体的Inspector界面的脚本“组件”框处查看字段的变化了

Unity的控制台调试只适用于游戏逻辑较为简单的情况,当游戏逻辑较为复杂的时候,需要我们使用VS自带的调试工具进行调试

注意!使用了控制台调试之后一定要记得删除我们为了调试而写的代码,避免无效代码造成性能损耗

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Node.js计算机毕业设计儿童成长记录与分享系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

【Vue实践】尚硅谷张天禹Vue学习笔记(更新至第86课)-20221126~20221212

004_尚硅谷Vue技术_搭建Vue开发环境 搭建Vue.js devtools 允许访问文件网址 https://blog.csdn.net/sunhl951/article/details/80185628 阻止 vue 在启动时生成生产提示。 Vue.config.productionTip false 目测没有用 https://blog.csdn.net/DIUDIUjiang/article/details/…

这些车企在企业微信里,装上高速的“组织引擎”

“这真是一场惊险之旅。” 今年7月,胡先生一家疾驶在若羌县罗布泊镇国道上,迎面突然冲出一辆大型货车……为了避让,胡太太驾驶的极氪001撞上了路边的石墩,两个轮胎直接报废。 在人迹罕至的无人区,保险公司鞭长莫及&a…

C++ 基础篇之如何进行数据封装

📒博客主页: ​​开心档博客主页​​ 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由开心档原创! 📆51CTO首发时间:🌴2022年12月12日🌴 ✉…

rocketmq源码-producer启动流程

前言 DefaultMQProducer producer new DefaultMQProducer("please_rename_unique_group_name"); producer.setNamesrvAddr("127.0.0.1:9876");producer.setNamesrvAddr("127.0.0.1:9876");producer.start();创建、启动producer的逻辑&#xff…

[附源码]Node.js计算机毕业设计电影推荐网站Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

对长尾识别任务中解耦方法的改进

来源:投稿 作者:TransforMe 编辑:学姐 贡献 在长尾识别任务上,解耦(二阶段)的方法取得了巨大的进步,详情参考https://blog.csdn.net/weixin_41246832/article/details/115718084。本文详细分析…

Android实现SSH Client

本文实现的是如何使用JSCH在Android上实现一个简易版本的ssh client,来远程执行ssh命令。 1、启动ssh服务,本文以mac为例。 打开设置-->共享-->选择远程登录 2、检验ssh server是否开启成功。 打开shell ssh dongxuliip 输入dongxuli账户的密码&…

P3884 [JLOI2009]二叉树问题——树化图Floyd+dfs

[JLOI2009]二叉树问题 题目描述 如下图所示的一棵二叉树的深度、宽度及结点间距离分别为: 深度:444宽度:444结点 8 和 6 之间的距离:888结点 7 和 6 之间的距离:333 其中宽度表示二叉树上同一层最多的结点个数&…

[附源码]Python计算机毕业设计Django高校体育场馆管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

web前端期末大作业——基于HTML+CSS+JavaScript蓝色的远程监控设备系统后台管理界面模板

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

6-1和6-2矩阵键盘

江科大自动化单片机学习记录使用到的设备以及软件今天的学习内容弱上拉和强下拉代码LCD1602.cMatrixKey.c生成.h文件调用主函数main总结记录学习单片机的过程学习内容的视频链接:江科大自化协:51单片机入门教程-2020版,程序全程纯手打 使用到的设备以及软件 普中科技的嵌入式…

DC-2靶机教程

masscan -p1-65535 192.168.250.180 --rate10000nmap -sC -sV -p- -A -T4 192.168.250.180扫描看到80需要添加解析 C:\Windows\System32\drivers\etc添加记录:192.168.250.180 dc-2 同时我们也可以用cmseek扫描到用户名和相关的漏洞 或者使用 wpscan --url htt…

【图像处理OpenCV(C++版)】——2.3 灰度/彩色图像数字化

前言: 😊😊😊欢迎来到本博客😊😊😊 🌟🌟🌟 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快…

基于无人机的移动边缘计算网络(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 空中无人机(UAV)长期以来一直被用作移动网络中的网络处理器,但它们现在被用作移动边缘计算…

29-Vue之ECharts-散点图

ECharts-散点图前言散点图特点散点图实现步骤散点图常见效果气泡效果涟漪动画效果完整代码前言 本篇来学习散点图的实现 散点图特点 散点图可以帮助我们推断出不同维度数据之间的相关性, 比如:看得出身高和体重是正相关, 身 高越高, 体重越重散点图也经常用在地图…

解决 AssertionError Torch not compiled with CUDA enabled

最近在矩池云的的Tesla K80机子上跑MMYOLO,跟着MMYOLO官方文档《自定义数据集 标注训练测试部署 全流程 》操作到 “2.1.1 软件或者算法辅助”时,利用预训练模型官方脚本去辅助标注时,一按下回车就报错: 报错信息 AssertionError…

技巧分享:你知道视频转文字怎么操作?

随着科技的发展,很多东西都开通了“线上”这个渠道,例如线上教学、线上问诊等等。而我们也越来越习惯“线上”,因为它不仅方便,还更节省时间。例如我,学习一些知识或技能时,我会在网上寻找教学视频或报线上…

flink单机部署和简单使用

flink单机部署 Java版本:1.8.0_45 flink下载:https://archive.apache.org/dist/flink/flink-1.7.2/flink-1.7.2-bin-scala_2.11.tgz 解压安装包: [rootvm-9f-mysteel-dc-ebc-test03 opt]# tar -zxvf flink-1.7.2-bin-scala_2.11.tgz flin…

莽荒纪人物出场数据统计

今天继续给大家介绍Python相关知识,本文主要内容莽荒纪人物出场数据统计。 一、中文文本词频统计思路 在上文Python英文词频统计(哈姆雷特)程序示例中,我们进行了英文单词的统计。今天,我们进行中文人物出场频率统计…