Untiy基础学习(三)Untiy中编写脚本的基本规则

一、怎么创建脚本

在Project窗口下,右键Create C#Script 即可创建脚本

创建脚本的注意事项 :

1)类名和文件名必须一致,不然不能挂载(因为反射机制创建对象,会通过文件名去找Type)

2)没有特殊需求 不用管命名空间

3)创建的脚本默认继承MonoBehavior

4)可以放在Assets文件夹下的任何位置(建议同一文件夹管理)

二、关于MonoBehavior的介绍

        首先它是一个基类,任何生命周期函数的执行都需要直接或者间接继承这个类,至于生命周期函数是是什么,我们后面讲。所有 Unity 脚本若需要与引擎生命周期事件(如初始化、更新、销毁等)交互,必须直接或间接继承 MonoBehaviour。这是 Unity 设计的基础规则,只有继承此类的脚本才能被引擎识别为“组件”,从而挂载到 GameObject 上并参与游戏逻辑的驱动。它有以下特点:

        ①创建的脚本基本都默认继承MonoBehavior 继承了它才能够挂载在GameObject上。因为Unity 通过继承 MonoBehavior 的类来标记其为“可挂载组件”。Unity 编辑器会扫描脚本是否继承自 MonoBehavior ,只有符合条件的脚本才会出现在“Add Component”菜单中。
        ②继承了MonoBehavior的脚本不能new 只能挂!!!!!!!!继承 MonoBehaviour 的脚本 不能手动实例化如 MyScript script = new MyScript();)。因为Unity 要求组件必须依附于 GameObject而 new 创建的实例未绑定任何对象,无法被引擎管理。生命周期函数(如 AwakeUpdate)由引擎自动触发,未挂载的脚本不会执行这些逻辑。

        ③继承了MonoBehavior的脚本不要去写构造函数,因为我们不会去new它,写构造函数没有任何意义。Unity 不会调用 MonoBehaviour 的构造函数,初始化逻辑应由 Awake 或 Start 实现。构造函数可能在非预期时机执行(如编辑器加载时),导致不可控行为。等后面学习了生命周期函数,就知道一般是使用Awake和Start进行初始化了。

        ④继承了MonoBehavior的脚本可以在一个对象上挂多个(如果没有加DisallowMultipleComponent特性)例如,为敌人挂载多个“攻击效果”脚本,每个脚本控制不同的攻击逻辑。或为 UI 元素挂载多个“动画控制器”脚本,分别处理不同状态的动画。

        ⑤继承MonoBehavior的类也可以再次被继承,遵循面向对象继承多态的规则。MonoBehaviour 的子类可以进一步被继承,遵循面向对象的基本原则。子类可以重写父类的生命周期方法(如 Update),并通过 base.Method() 调用父类逻辑。当然这些都是后话。

了解小知识:为什么会这样设计呢?

组件化开发

        每个脚本代表一个独立功能模块,通过组合不同组件构建复杂对象(如角色 = 移动组件 + 动画组件 + 攻击组件)。

        避免“上帝脚本”(一个脚本处理所有逻辑),提升代码可维护性。

引擎控制权

        Unity 引擎完全掌控组件的生命周期(如创建、更新、销毁),开发者只需填充逻辑,无需手动管理内存或执行顺序。

事件驱动模型

        通过生命周期方法和事件回调(如 OnCollisionEnter)响应游戏状态变化,而非传统的主循环控制。

三、关于不继承Mono的类

        ①不继承MonoBehavior的类 不能挂载在GameObject上。因为上面提到了,Unity 编辑器通过反射检查脚本是否继承 MonoBehaviour,只有符合条件的类才会出现在“Add Component”菜单中,只有继承了的才有组件成为权!
        ②不继承MonoBehavior的类 想怎么写就怎么写 如果要使用需要自己new。非 MonoBehaviour 类本质是普通的 C# 类,不依赖 Unity 的组件系统,因此:

  • 无需遵循 Unity 的约束:可以随意定义构造函数、静态方法或字段。

  • 实例化方式:必须通过 new 关键字手动创建对象(如 MyClass obj = new MyClass();)。

        ③不继承MonoBehavior的类一般是单例模式的类(用于管理模块,全局管理游戏状态、资源、配置等。)或者数据结构类(用于存储数据,纯粹用于存储和操作数据。)
        ④不继承MonoBehavior的类 不用保留默认出现的那几个函数。因为Unity 的生命周期方法(如 AwakeUpdate)是 MonoBehaviour 提供的特性。非 MonoBehaviour 类不具备这些功能,因此:无需保留默认函数:如 Start 或 Update 不会被 Unity 调用,定义它们无意义。

四、关于脚本的执行先后顺序

五、默认脚本内容

        你有没有每次发现我们创建的脚本都长得一样,这是因为Untiy自己配置了模版,当然,这模版它Untiy配的,我们就配不得吗,走,我们去看看在哪里配置。 

首先:先得来到这个Untiy hub中,点击这个在资源管理器中查看

然后走这个路径:就可以看到很多很多的txt文件,这些就是模版文件

 不建议自己随意修改 

来来来,做几道题目练练手!!

问题一:MonoBehaviour 的构造函数问题

        在 Unity 中,为什么继承 MonoBehaviour 的脚本不应定义构造函数?如果在构造函数中初始化变量,可能会导致什么问题?

        参考答案:Unity 不会调用 MonoBehaviour 的构造函数,初始化逻辑应由 Awake 或 Start 完成。构造函数可能在编辑器模式下意外触发(如脚本重新编译时),导致不可控行为。

        可能存在的问题:若在构造函数中初始化组件引用(如 GetComponent<T>()),此时 GameObject 可能未完全初始化,导致空引用异常。构造函数中的逻辑可能破坏 Unity 的组件依赖链,引发初始化顺序混乱。

问题二:单例模式的选择

        在 Unity 中,实现单例模式时,为何通常选择不继承 MonoBehaviour 的普通类,而不是通过挂载到 GameObject 的 MonoBehaviour 脚本实现?请比较两种方式的优缺点。

        参考答案:

普通类单例(非 MonoBehaviour)

  • 优点

    无需依赖 GameObject,内存占用更低。

    生命周期完全由代码控制,跨场景时更稳定。

  • 缺点

    无法直接使用 Unity 的生命周期方法(如 Update)。

    需要手动管理初始化和销毁逻辑

MonoBehaviour 单例

  • 优点

    可方便使用 Unity 生命周期方法(如 Awake 初始化)。

    可在 Inspector 中配置公开变量。

  • 缺点

    依赖 GameObject,跨场景时需通过 DontDestroyOnLoad 防止销毁。

    可能因场景切换或对象失活导致单例失效。

        结论:若单例需要与 Unity 生命周期或场景对象交互(如 UI 管理),使用 MonoBehaviour;若仅需全局逻辑管理(如配置读取),优先使用普通类单例。

问题三:数据类的设计选择

        假设需要设计一个 PlayerData 类,用于存储玩家的血量、等级和装备信息。为什么这个类不应继承 MonoBehaviour?如果需要在 Inspector 中编辑该类的数据,如何实现?

        参考答案:

不继承 MonoBehaviour 的原因

PlayerData 是纯粹的数据容器,无需与 GameObject 绑定或参与 Unity 生命周期。

继承 MonoBehaviour 会引入不必要的开销(如组件内存占用),破坏代码简洁性。

在 Inspector 中编辑数据

        将 PlayerData 声明为可序列化的普通类:

[System.Serializable]  
public class PlayerData {  public int health;  public int level;  public List<string> equipment;  
}  

        在某个 MonoBehaviour 脚本中声明 PlayerData 的字段,即可在 Inspector 中编辑:

public class Player : MonoBehaviour {  public PlayerData data;  
}  

这样子就可以了

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

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

相关文章

VBA宏即根据第一列的内容和第二列的数字,按照数字数量生成对应内容并依次放在第三列、第四列等

打开你的 Excel 工作表。按下 Alt F11 组合键&#xff0c;打开 VBA 编辑器。在 VBA 编辑器中&#xff0c;点击 插入 -> 模块。在模块窗口中&#xff0c;输入以下 VBA 代码&#xff1a; Sub GenerateItems()Dim lastRow As LongDim i As Long, j As LongDim item As String…

深度学习系统学习系列【1】之基本知识

文章目录 说明基础知识人工智能、机器学习、深度学习的关系机器学习传统机器学习的缺陷选择深度学习的原因深度学习的关键问题深度学习的应用深度学习的加速硬件GPU环境搭建主流深度学习框架对比 说明 文章属于个人学习笔记内容&#xff0c;仅供学习和交流。内容参考深度学习原…

论文笔记-基于多层感知器(MLP)的多变量桥式起重机自适应安全制动与距离预测

《IET Cyber-Systems and Robotics》出版山东大学 Tenglong Zhang 和 Guoliang Liu 团队的研究成果&#xff0c;文章题为“Adaptive Safe Braking and Distance Prediction for Overhead Cranes With Multivariation Using MLP”。 摘要 桥式起重机的紧急制动及其制动距离预测是…

DeepSeek实战--各版本对比

1.对比 版本参数量优势劣势使用场景竞品DeepSeek-V36710亿&#xff08;MoE架构&#xff0c;激活370亿&#xff09;开源、高效推理&#xff08;60 TPS&#xff09;、低成本&#xff08;API费用低&#xff09;、中文处理能力突出&#xff08;90%准确率多模态能力有限通用任务&am…

从0开始建立Github个人博客(hugoPaperMod)

从0开始建立Github个人博客(hugo&PaperMod) github提供给每个用户一个网址&#xff0c;用户可以建立自己的静态网站。 一、Hugo hugo是一个快速搭建网站的工具&#xff0c;由go语言编写。 1.安装hugo 到hugo的github标签页Tags gohugoio/hugo选择一个版本&#xff0c…

【AI论文】WebThinker:赋予大型推理模型深度研究能力

摘要&#xff1a;大型推理模型&#xff08;LRMs&#xff09;&#xff0c;如OpenAI-o1和DeepSeek-R1&#xff0c;展示了令人印象深刻的长期推理能力。 然而&#xff0c;他们对静态内部知识的依赖限制了他们在复杂的知识密集型任务上的表现&#xff0c;并阻碍了他们生成需要综合各…

Linux_sudo命令的使用与机制

1、sudo命令的作用 sudo&#xff08;全称 superuser do&#xff09;是 Linux/Unix 系统中权限管理的核心工具。 允许普通用户在授权下以其他用户&#xff08;默认是 root&#xff09;的权限执行命令&#xff0c;而无需直接登录账户。 2、sudo命令的典型使用场景 sudo 覆盖了系…

Scrapy框架之 中间件的使用

爬虫中间件 特点&#xff1a;主要处理蜘蛛&#xff08;Spider&#xff09;和下载器&#xff08;Downloader&#xff09;之间的请求和响应。可以对蜘蛛生成的请求进行拦截、修改或过滤&#xff0c;也可以对下载器返回给蜘蛛的响应进行处理。适用场景&#xff1a; 请求过滤与修改…

供应链算法整理(一)--- 销量预估

在供应链管理领域有较多的预估场景&#xff0c;例如送达时长预估、销量预估、用电量预估。特别的在智能供应链领域&#xff0c;销量和库存的管理的智能化也依赖销量预估&#xff0c;因此在本文我们整理了 销量预估的算法详细的技术方案。 时间序列预测在最近两年内发生了巨大的…

第4篇:服务层抽象与复用逻辑

在业务系统复杂度指数级增长的今天&#xff0c;服务层&#xff08;Service Layer&#xff09;的合理设计直接影响着系统的可维护性和扩展性。本文将深入剖析 Egg.js 框架中的服务层架构设计&#xff0c;从基础实现到高级封装&#xff0c;全方位讲解企业级应用的开发实践。 一、…

Java学习手册:Spring 数据访问

一、Spring JDBC JdbcTemplate &#xff1a;Spring JDBC 提供了 JdbcTemplate 类&#xff0c;它简化了数据库操作&#xff0c;提供了丰富的 API 来执行数据库访问任务。JdbcTemplate 可以自动处理数据库连接的获取、释放&#xff0c;SQL 语句的执行&#xff0c;结果集的处理等…

递归、搜索和回溯算法《递归》

在之前的优选算法当中我们已经学习了一些基本的算法&#xff0c;那么接下来我们就要来学习算法当中的一大重要章节——递归、搜索和回溯算法&#xff0c;其实也就是大家常常听到的dfs、bfs&#xff1b;其实本质就是递归&#xff0c;在学习搜索、回溯等算法的过程当中我们会先来…

Java进阶--设计模式

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编制真正工程化&#xff0c;设计模式是软件工程的基石&#xff0c;如同大厦的一块块砖石一样&#xff0…

如何禁止AutoCAD这类软件联网

推荐二、三方法&#xff0c;对其他软件影响最小 一、修改Hosts文件 Hosts文件是一个存储域名与IP地址映射关系的文本文件&#xff0c;通过修改Hosts文件可以将AutoCAD的域名指向本地回环地址&#xff08;127.0.0.1&#xff09;&#xff0c;从而实现禁止联网的目的。具体步骤如…

深度学习框架搭建(Vscode/Anaconda/CUDA/Pytroch)

目录 ​​​​​​一 Vscode安装 二、Anaconda安装 三、更新显卡驱动 四、安装CUDA 五、安装Pytorch 六、Vscode配置 七、出现的问题汇总 ​​​​​​一 Vscode安装 在 Windows 上安装 访问 VS Code 官网 https://code.visualstudio.com/&#xff0c;点击 "Downl…

结构模式识别理论与方法

我们在前文《模式识别的基本概念与理论体系》中就已经提及“模式分类”。 具体内容看我的CSDN文章&#xff1a;模式识别的基本概念与理论体系-CSDN博客 模式的识别方法主要有统计模式识别方法和结构模式识别方法两大类。统计模式识别方法提出得较早&#xff0c;理论也较成熟…

12.多边形的三角剖分 (Triangulation) : Fisk‘s proof

目录 1.Fisks proof Trangulation Coloring Domination Pigeon-Hold Principle Generation 2.Orthogonal Polygons (正交多边形) Necessity of floor(n4) Sufficiency by convex Quadrilateralization Generalization 1.Fisks proof Trangulation 引入内对角线&…

面经-计算机网络——OSI七层模型与TCP/IP四层模型的对比详解

OSI七层模型与TCP/IP四层模型的对比详解 一、图示解析&#xff1a;分层封装结构 你提供的图清晰展示了网络通信中从应用层到物理层的封装过程&#xff0c;每一层都会对上层的数据加上自己的头部信息&#xff08;Header&#xff09;&#xff1a; 应用层&#xff1a; 应用…

React Native本地存储方案总结

1. AsyncStorage&#xff08;键值对存储&#xff09; 适用场景&#xff1a;简单键值对存储&#xff08;如用户配置、Token、缓存数据&#xff09;。特点&#xff1a;异步、轻量、API 简单&#xff0c;但性能一般&#xff0c;不推荐存储大量数据。安装&#xff1a;npm install …

Arduino程序函数详解与实际案例

一、Arduino程序的核心架构与函数解析 Arduino程序的核心由两个函数构成:setup() 和 loop()。这两个函数是所有Arduino代码的骨架,它们的合理使用决定了程序的结构和功能。 1.1 setup() 函数:初始化阶段 setup() 函数在程序启动时仅执行一次,用于完成初始化配置,例如设置…