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

[Unity] 基础的编程思想, 组件式开发

熟悉 C# 开发的朋友, 在刚进入 Unity 开发时, 不可避免的会有一些迷惑, 例如不清楚 Unity 自己的思想, 如何设计与架构一个应用程序之类的. 本篇文章简要的介绍一下 Unity 的基础编程思想.


独立

Unity 很少使用 C# 的标准库, 例如 C# 的网络, 事件驱动, 对象模型, 这些概念在 Unity 中几乎不会被用到. 甚至于, 连标准的 System 命名空间都很少被引用.

Unity 自己实现了一套较为完善的标准库, 以适用于游戏开发. 例如最简单的 “随机数”, 在 Unity 中, UnityEngine.Random 类实现了随机数生成. 并且它是一个静态类, 不需要我们创建随机数对象, 即可使用.

Unity 用到的, 最多是 C# 中的集合, LINQ 查询这些. 甚至于, Unity 中的 UI 事件处理器, 都不是一个标准的 C# EventHandler. 完完全全算得上邪教.


命名

刚开始使用 Unity 的你, 肯定会疑惑, 为什么 Unity 的脚本中, 用于获取 Transform 组件的属性, 叫做 transform, 而不是 Transform. 一个公开的属性, 却不使用大驼峰命名法, 而是使用小驼峰?

事实上, Unity 压根不用 C# 的命名规范, 只有一部分与 C# 的命名规范统一. 例如, 它的类型还是大驼峰的, 它的接口也是以 I 开头的大驼峰命名. 不过单单属性命名与 C# 不统一这件事, 就已经能让大多数注重优雅的 C# 程序员火冒三丈了.


对象

刚刚也提到了, Unity 自己单独实现了一整套标准库, 只有少部分是使用 C# 的东西. 事实上, 在 Unity 中, 所有 Unity 可引用的对象都是由 UnityEngine.Object 派生而来的. 例如游戏对象 UnityEngine.GameObject, 还有诸如 Camea, RigidBody 这些各种各样的组件.

Unity 的对象封装了很多静态方法, 例如克隆一个对象, 销毁一个对象, 在场景中查找某个类型的对象. 由于我们在 Unity 中编辑的 C# 代码大多是一个继承了 UnityEngine.MonoBehavior 的脚本, 而它又间接继承 UnityEngine.Object, 所以我们在代码中访问这些方法的时候, 就不需要写类名, 直接调用即可.


游戏对象与组件

在 C# 中, 实现功能的拓展是通过继承来实现的, 例如 Button 继承 Control, 并在 Control 的基础上拓展出自己的功能, 但是 Unity 不是这样.

Unity 中, 每一个场景中的对象, 就单纯只是一个 GameObject, 它自己本身没有任何功能. 如果要给一个对象添加一些功能, 就要为它挂载一些组件. 例如游戏中原始的一个 Sphere 物体, 它由 Transform, MeshFilter, MeshRenderer, SphereCollider 这些组件构成, 他们分别负责承载 “物体的变换, 包括位置, 旋转, 缩放”, “网格的存储”, “网格的渲染”, “碰撞相关功能”.

不过, Unity 中的组件本身还是存在继承关系的. 例如 SphereColliderBoxCollider 都是 Collider 的派生类.

只要理解了任何游戏中的物体都有一个最基本的游戏对象和提供功能的组件构成, 就可以理解大部分问题了. 根据这一点, 如果你想自己手动创建一个 Sphere, 也可以先创建一个空对象, 然后按照 Sphere 的构成, 将所需要的组件逐个添加上去, 并正确的设置好属性, 就可以完美的复制出和自带的 Sphere 一模一样的物体了.


组件之间的依赖与互斥

组件也是有相互的关系的, 就像我们所用的 控制反转 中的服务一样, 我们将功能抽成一个个服务, 而服务之间存在依赖关系. Unity 的组件也是如此.

如果要使功能正常运行, 就需要同时添加组件所依赖的组件. 例如要实现物理效果, 我们需要添加一个 RigidBody 组件, 但是要使物体之间能够产生碰撞, 就需要再添加一个 Collider. 如果单独添加 RigidBody, 虽然物体会受重力影响, 但是因为不会产生碰撞, 所以会直接穿过其他物体.

至于组件的互斥, 有两种, 一种是完全不能共存的, 例如无法为一个物体同时添加 BoxColliderBoxCollider2D, 如果尝试添加, 编辑器中会提示 “组件冲突”. 另一种则是, 可以同时添加, 但是会产生一些奇怪效果的. 例如 CharacterControllerRigidBody 同时添加到物体中时, 就会引起移动相关的问题.


全局单例与静态类

Unity 中很少使用静态类, 除非你要用静态类承载一些工具方法. 但如果是一些逻辑相关的东西, 那它基本都是像普通的脚本一样是非静态的, 而想要全局访问, 在 Unity 中更多使用的是 “单例模式”.

在平常的开发中, 我们大抵是很少用到单例的. 因为直接用静态就可以解决问题. 但是 Unity 中使用静态的话, 我们就没办法将它作为组件挂载到游戏对象上, 而且也不能通过 Unity 的编辑器对它的一些变量进行赋值, 不是很方便. 所以 Unity 单例用的更多.

需要注意的是, 平常编程中所使用的单例是没办法直接应用在 Unity 上的, Unity 的对象产生与销毁都与平常的开发有所不同, 需要做一点针对 Unity 的 “本地化” 才能正确使用.


管理类

Unity 会使用大量的 “管理类” 用来集中管理逻辑. 甚至于, 当你创建一个名字为 GameManager 的脚本时, 它的图标不是一个 C# 脚本图标, 而是一个特殊的齿轮图标. 由此可见 Unity 开发中有多重视这个.

相比较我们平常的桌面开发, 后端开发, 之所以 Unity 更常使用所谓的管理类, 是因为 Unity 游戏对象的通信是比较麻烦的, 而且一整个游戏的逻辑也更加复杂, 例如一场战斗的进行, 这时使用一个 “战斗管理” 的类来记录战斗相关的数据, 调用角色进行战斗, 要更加方便些.

相关文章:

[Unity] 基础的编程思想, 组件式开发

熟悉 C# 开发的朋友, 在刚进入 Unity 开发时, 不可避免的会有一些迷惑, 例如不清楚 Unity 自己的思想, 如何设计与架构一个应用程序之类的. 本篇文章简要的介绍一下 Unity 的基础编程思想. 独立 Unity 很少使用 C# 的标准库, 例如 C# 的网络, 事件驱动, 对象模型, 这些概念在 …...

SVN 项目管理笔记

SVN 项目管理笔记 主要是介绍 SVN 管理项目的常用操作,方便以后查阅!!! 一、本地项目提交到SVN流程 在SVN仓库下创建和项目名同样的文件夹目录;选中本地项目文件,选择SVN->checkout,第一个是远程仓库项…...

Android获取手机已安装应用列表JAVA实现

最终效果: 设计 实现java代码: //获取包列表private List<String> getPkgList() {List<String> packages new ArrayList<String>();try {//使用命令行方式获取包列表Process p Runtime.getRuntime().exec("pm list packages");//取得命令行输出…...

【校招VIP】有一个比赛获奖项目和参与的开源小项目,秋招项目竞争力够不够?三个标准,自己都可以估算

有个24届的学生问我&#xff1a;现在没有实习&#xff0c;能不能参与大厂秋招&#xff1f;手里有两个项目&#xff0c;一个是比赛的获奖项目&#xff0c;一个是CSDN上博主做的开源小项目&#xff0c;这两个项目竞争力够不够&#xff1f; 其实项目这块&#xff0c;无非就是三个…...

量化开发学习入门-概念篇

1.网格交易法 网格交易法&#xff08;Grid Trading&#xff09;是一种基于价格波动和区间震荡的交易策略。它适用于市场处于横盘或震荡的情况下。 网格交易法的基本思想是在设定的价格区间内均匀地建立多个买入和卖出水平&#xff08;网格&#xff09;&#xff0c;并在价格上…...

【草稿】关于文本句子分割(中文+英文)以及向量处理

获取文本 主函数 Main # -*- encoding: utf-8 -*- # Author: SWHL # Contact: liekkaskono163.com from pathlib import Path from typing import Dict, List, Unionimport filetypefrom ..utils import logger from .image_loader import ImageLoader from .office_loader i…...

【瑞吉外卖】所遇问题及解决方法

太菜了实习之余瑞吉外卖补充一下基础知识&#xff08;&#xff0c;不然真啥也不会了。 请输入正确的手机号&#xff01; 是因为我测试了我的手机号&#xff0c;爆红&#xff0c;以为方法有错。但其实是前端代码检查手机号是否符合规范的语句有点&#xff08;&#xff09;啊啊…...

【Hugo入门】基础用法

检查Hugo是否安装 hugo version显示所有可用命令 hugo help显示指定命令的可用子命令&#xff0c;例如查询server的所有子命令 hugo server --help建立你的网站&#xff0c;cd进入你的项目根目录运行 hugo默认发布内容到自动创建的public文件夹。 覆盖hugo或hugo server的默…...

Java实现一个简单的图书管理系统(内有源码)

简介 哈喽哈喽大家好啊&#xff0c;之前作者也是讲了Java不少的知识点了&#xff0c;为了巩固之前的知识点再为了让我们深入Java面向对象这一基本特性&#xff0c;就让我们完成一个图书管理系统的小项目吧。 项目简介&#xff1a;通过管理员和普通用户的两种操作界面&#xff0…...

网络安全等级保护2.0

等保介绍 信息系统运维安全管理规定&#xff08;范文&#xff09;| 资料 等保测评是为了符合国家法律发挥的需求&#xff0c;而不是安全认证&#xff08;ISO&#xff09; 一般情况没有高危安全风险一般可以通过&#xff0c;但若发现高位安全风险则一票否决 二级两年一次 三…...

【sql】MongoDB 增删改查 高级用法

【sql】MongoDB 增删改查 高级用法 相关使用文档 MongoDB Query API — MongoDB Manual https://www.mongodb.com/docs/manual/reference/sql-comparison //增 //新增数据2种方式 db.msg.save({"name":"springboot&#x1f600;"}); db.msg.insert({&qu…...

怎么做才能有效更新和优化产品手册文档

更新和优化产品手册文档是确保用户获得准确和最新信息的重要步骤。如果不及时地更新和优化信息&#xff0c;很容易导致我们的产品有滞后性&#xff0c;不能满足客户最新的需求。所以looklook总结了一些相关内容&#xff0c;以下是一些建议来更新和优化产品手册文档&#xff1a;…...

#P0867. 小武老师的烤全羊

问题描述 小武老师特别喜欢吃烤全羊&#xff0c;小武老师吃烤全羊很特别&#xff0c;为什么特别呢&#xff1f;因为他有 1010 种配料&#xff08;芥末、孜然等&#xff09;&#xff0c;每种配料可以放 11 到 33 克&#xff0c;任意烤全羊的美味程度为所有配料质量之和。 现在&…...

视频汇聚/视频云存储/视频监控管理平台EasyCVR提升网络稳定小tips来啦!

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...

C 语言学习

数组的指针 在c中&#xff0c;几乎所以使用数组名的表达式中&#xff0c;数组名的值是一个指针常量&#xff0c;也就是数组 第 一个元素的地址。注意这个值是指针常量&#xff0c;不是变量。 int a[10]{ ….....}; int *q; q&a[0] ; <>…...

TCP网络连接异常情况的处理

在网络连接中&#xff0c;经常会出现一些意外情况&#xff0c;导致TCP连接不能正常工作&#xff0c;对于这些意外情况&#xff0c;TCP内部有自己的解决方法 一.进程崩溃 在网络通讯时可能会出现进程突然崩溃的情况&#xff0c;当进程崩溃后进程就没了&#xff0c;就会导致进程…...

单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.10语句

1 表达式语句 表达式语句由表达式加上分号“;”组成。其一般形式为&#xff1a; 表达式; 执行表达式语句就是计算表达式的值。例如 caa; 2 函数调用语句 由函数名、实际参数加上分号“;”组成。其一般形式为&#xff1a; 函数名(实际参数表); 例如 printf(“Hello !”);…...

Windows 通过服务名称搜索软件启动路径启动软件

文章目录 Windows 通过服务名称搜索软件启动路径启动软件 Windows 通过服务名称搜索软件启动路径启动软件 注意&#xff1a;QQ管家和360安全&#xff0c;正常情况下使用 taskkill 无法停止&#xff0c;因为在安全设置中有个“自保护”&#xff0c;正常情况下会默认勾选上&#…...

如何更高效的写出更健全的代码,一篇文章教会你如何拥有一个良好的代码风格

前言&#xff1a;在平常的写代码的过程中&#xff0c;或多或少的遇到很多奇怪的 bug &#xff0c;尤其是一些大的程序&#xff0c;明明上一部分都是好好的&#xff0c;写下一块的时候突然多几百个 bug 的情况&#xff0c;然后这一块写完了后编译的时候直接傻眼了&#xff0c;看…...

Java如何调用接口API并返回数据(两种方法)

Java如何调用接口API并返回数据&#xff08;两种方法&#xff09; java处理请求接口后返回的json数据-直接处理json字符串 处理思路&#xff1a; 将返回的数据接收到一个String对象中&#xff08;有时候需要自己选择性的取舍接收&#xff09; 再将string转换为JSONObject对象 …...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

HTTPS证书一年多少钱?

HTTPS证书作为保障网站数据传输安全的重要工具&#xff0c;成为众多网站运营者的必备选择。然而&#xff0c;面对市场上种类繁多的HTTPS证书&#xff0c;其一年费用究竟是多少&#xff0c;又受哪些因素影响呢&#xff1f; 首先&#xff0c;HTTPS证书通常在PinTrust这样的专业平…...

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...

中国政务数据安全建设细化及市场需求分析

(基于新《政务数据共享条例》及相关法规) 一、引言 近年来,中国政府高度重视数字政府建设和数据要素市场化配置改革。《政务数据共享条例》(以下简称“《共享条例》”)的发布,与《中华人民共和国数据安全法》(以下简称“《数据安全法》”)、《中华人民共和国个人信息…...

使用VMware克隆功能快速搭建集群

自己搭建的虚拟机&#xff0c;后续不管是学习java还是大数据&#xff0c;都需要集群&#xff0c;java需要分布式的微服务&#xff0c;大数据Hadoop的计算集群&#xff0c;如果从头开始搭建虚拟机会比较费时费力&#xff0c;这里分享一下如何使用克隆功能快速搭建一个集群 先把…...