Unity技术笔记1

本文介绍了Unity游戏开发中的几个关键概念,包括不同Update函数的作用及应用场景、StaticCollider与DynamicCollider的区别及优化方法等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Unity技术笔记

之前也用过一段时间Unity,大概过了一年基本上都忘得差不多了,再加上之前不是很系统地对Unity进行学习,这次通过官方的教学和自己的实验结合来好好对Unity有个深入的理解和认识。

今天看了官方面向新手的最基本最基本的教学——Roll a Ball,内容是控制一个球去吃附近的小方块,吃完就算赢。

原教程的链接:https://unity3d.com/cn/learn/tutorials/projects/roll-ball-tutorial

游戏本身实现起来很简单,实现起来完全不用花费脑力。但是再简单的示例,也有几处我之前并不知道的东西,所以我还得学习一个...为了提高姿势水平,在这里把新学到的东西先给记下来了。


1. 三种Update()函数

教程中提到了三种Update()函数,分别是Update(),FixedUpdate(),LateUpdate()。以前我基本都是直接无脑用Update(),发现有东西实现不了就换成其他的,基本算是无的放矢,随便乱试,并没有去想三种Update本质上的区别。在教程中对这三类Update做了解释,是这样子的:

Update()函数是发生在每一帧渲染之前,FixedUpdate()函数是发生在每一次进行物理计算之前,LateUpdate()函数是发生在每一帧所有Item的处理结束之后。注意,Update和LateUpdate是每一帧,FixedUpdate是每一次。

稍微解释一下的话就是说,FixedUpdate()发生的时候,一切物理计算都还没有开始进行。物理计算是什么?就比如说Rigidbody.AddForce()这个给刚体加力的函数就是一个。事实上对于刚体的处理都是物理计算。那么FixedUpdate()的间隔是多少呢?Edit->Project Setting->time下的Fixed timestep中可以进行修改。比如设置成0.02的话就是每0.02秒进行一次物理计算,在进行物理计算之前运行FixedUpdate()中的代码。

这么说的话虽然理解了,但其实还是一脸懵逼,既然FixedUpdate()是固定时间更新,又是每一次更新都会重新进行一次物理计算,那我为什么还要用Update()这个函数呢?想想,游戏是实时渲染的,每一次要渲染出来展示给玩家看画面的时间间隔不是这个固定时间,而是我们所说的帧率。玩家只有在看到屏幕上的东西动了,才会知道这个东西真的动了吧(怎么感觉像说了句废话= =)。要是我所有处理都是放在FixedUpdate()里的话,那就会导致玩家真实看到的和游戏里正在发生的,虽然很小,但是会存在差距。举个栗子,有一个特别特别高端的动作类游戏玩家,能做到在敌人的武器离看到砍到自己还有0.00001秒的时候做出反应来回避,也就是能做到在没被砍到的那一帧和被砍到的那一帧之前做出回避反应,然而如果对玩家的伤害判定是放在FixedUpdate()里面,又恰巧在刚刚上述的两帧里进行了一次更新,而且物理计算后碰撞成立,这时候会造成的结果就是,这个高端玩家明明看到自己没有被砍到并进行闪避,但是结果是自己被砍到了。如果理解不了这个例子或者想吐槽说这个高端玩家实际上就是被砍到了,再读一下刚刚那句废话,玩家只有在看到屏幕上的东西动了,才会知道这个东西真的动了。

再说说实际上的操作,简单的来说,所有物理计算相关的都放在FixedUpdate中,所有游戏逻辑有关的都放在Update中。LateUpdate的话,现在除了移动相机之外暂时还想不出有啥应用,总之它是在渲染完成以后才会被调用的。


2. 关于Static Collider和Dynamic Collider

这是一个和优化有关的问题,先解释一下,我们一般希望把墙,房子,山这类不会动的物件作为Static Collider,而把车子,人之类的会动的作为Dynamic Collider。在Unity里,如果一个物体只有Collider但没有Rigidbody,那么Unity就会把这个物体认为是Static Collider。而如果两个都有的话就认为是Dynamic Collider。

然后是重点,这里涉及到Unity自身的优化问题。Unity 会把所有的它认为是Static Collider的物体在一开始进行计算并缓存成cache,这样之后如果没必要再进行计算了。而对于Dynamic Collider则是会每帧进行一次计算。容易出现的问题就是,如果Static Collider中,一旦有一个物体位置发生了改变,那么Unity会将所有的Static Collider重新进行一次计算并缓存。所以一旦有哪个会动的物体没有变成Dynamic Collider的话,它每一次移动都会让Unity重新把所有静态的东西全部再算一次,那就变成真·全部·实时渲染了。

然后解决办法当然是给那些不会动的东西加上刚体Rigidbody,但是会有一个随之而来的小问题,那就是一旦加上了刚体,这个东西就会收到各种物理因素影响而各种起飞,各种下落,就算把受重力影响勾掉也是没卵用的。这时候也很简单,如果你不希望这个物体真的受到物理影响,只要把IsKinamic的选项勾上就行了,Unity就会知道你只是想把它当做一个Dynamaic Collider来处理。


基本上这两个是比较重要的两点,其他的都是些比较基础的东西,不过也是很适合我来重温和热身的。之后打算写一个3D的贪吃蛇来练习一下作为实践,写完以后会更新这篇文章,或者再写一篇文章吧。

### Unity手写笔记与学习资料 #### 关于Unity中的C#基础知识 在Unity开发过程中,掌握C#编程语言是非常重要的。根据一份针对初学者到就业的Unity学习笔记[^1],其中提到的内容涵盖了从基础语法到实际项目应用的知识点。这份笔记不仅包含了官方教程的核心内容,还加入了许多作者个人的理解和实践经验。对于希望快速入门并应用于工作的开发者来说,这类笔记非常有价值。 #### 统合手写功能的相关技术 如果目标是实现带有手写功能的应用程序,则可以参考某些具体案例来了解其实现方式。例如,在一款名为“Unity手写签名工具”的项目中[^2],提供了灵活的笔触设置以及丰富的颜色选项等功能模块。此工具有助于提升用户体验,并且其易用性和良好的兼容性使得它成为许多场景下的理想解决方案。 然而值得注意的是,当涉及到更高级别的操作比如文字识别时,仅依靠Unity本身可能无法完全满足需求。有经验表明尝试单独利用Unity来进行汉字或其他复杂字符形式转换存在困难——主要原因是现有插件可能会引起冲突等问题[^3]。因此一种可行方案就是借助外部应用程序(如WinForm),并通过UDP协议等方式建立两者之间的通讯桥梁从而顺利完成整个过程。 #### 制作视觉效果所需的Shader知识 除了交互逻辑之外,美观也是吸引玩家的重要因素之一。为了定制独一无二的画面风格,《Unity Shader学习笔记》提供了一个清晰的学习路径[^4]:先创建一个新的Material材料;接着编写自定义Shaders脚本并将它们关联起来;最后再把这些组合好的组件分配给目标物体即可开始调试直至获得预期成果。 --- ```python // 示例代码展示如何加载外部DLL用于处理特定任务(假设为OCR) using System; using System.Runtime.InteropServices; public class OCRManager { [DllImport("ExternalOCRLibrary.dll", CallingConvention = CallingConvention.Cdecl)] public static extern string RecognizeText(byte[] imageBytes); public void ProcessImage() { byte[] imageData = GetImageData(); // 获取图像数据的方法 string result = RecognizeText(imageData); Console.WriteLine($"Recognized Text: {result}"); } } ``` 以上片段展示了怎样通过P/Invoke机制调用由其他语言编写的库函数执行图片转文本的任务。这对于构建跨平台或者多功能性的游戏引擎附加特性特别有用。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值