前言
官方文档
https://docs.unity3d.com/cn/current/Manual/Input.html
素材商店
https://assetstore.unity.com/?category=2d&orderBy=4
下载
https://unity.cn/releases/full/2022
建议两个都下载,当然可以下载Hub后,在Hub中安装Editor。
这里为什么建议两个都下载,是因为
- 只下载Editor的话,启动的时候会报授权问题。
- 下载Hub安装后,从Hub中下载Editor的话,会下载失败。
所以建议两个都安装后在Hub中指定Editor的位置。
Visual Studio安装开发环境
开发工具
开发工具可以使用
- Visual Studio + ReSahrper
- VSCode + AWS Toolkit
- JetBrains Rider + AWS Toolkit
我最终选择的是 JetBrains Rider + AWS Toolkit
原因如下
Visual Studio
添加ReSahrper
插件后很好用,但是启动很慢,并且无法自动对生命周期方法自动提示。VSCode + AWS Toolkit
整体体验还可以,但是没有支持C#的类似于IDEA中的var
快捷添加定义的方式。JetBrains Rider
本身的代码提醒加上AWS Toolkit
的AI智能完成,使用起来很方便。
后续
Visual Studio不支持Unity方法的提示,现在已经找到原因:
原因是安装ReSharper后导致的,卸载ReSharper之后问题解决。
当然也可以在ReSharper中安装插件解决,但是我这里安装插件失败了,所以综合还是
JetBrains Rider
的体验最好。
ReSharper支持Unity的插件
扩展
> ReSharper
> Extension Manager…
搜索 Unity > 点击Install安装Unity Support
扩展
使用VSCode
默认编辑器是Visual Studio,个人感觉也是更智能的开发工具,
但是如果电脑配置差的话,推荐VSCode作为代码编辑器
VSCode安装C#插件
安装插件后,在设置中取消下面这个的勾选
Window > PackManager >安装vscode编辑器插件
安装后设置编辑器
Edit > Preferences > External Tools > 选择vscode作为项目编辑器
然后点Scipt Editor并选中你安装的vscode的exe
常用对象
以下是一些常见Unity对象的作用和常用属性的简要说明:
GameObject(游戏对象):游戏中的基本构建块,用于表示场景中的实体。
常用属性包括
transform
(变换组件)、name
(名称)、activeSelf
(是否激活)等。物体销毁的时候参数要传这个对象。
Transform(变换):用于控制游戏对象的位置、旋转和缩放等变换属性。
常用属性包括
position
(位置)、rotation
(旋转)、localScale
(缩放)等。Rigidbody(刚体):为游戏对象添加物理属性,使其受到重力、力和碰撞等物理影响。
常用属性包括
mass
(质量)、drag
(阻力)、velocity
(速度)、angularVelocity
(角速度)等。Collider(碰撞器):用于检测游戏对象之间的碰撞和触发事件。
常见的碰撞器类型有
BoxCollider
、SphereCollider
和CapsuleCollider
等。常用属性包括
isTrigger
(是否为触发器)、center
(中心位置)、size
(大小)等。Animator(动画控制器):用于创建和管理动画,实现角色和物体的动态效果。
常用属性包括
runtimeAnimatorController
(运行时动画控制器)、speed
(动画播放速度)等。AudioSource(音频源):用于播放音效和音乐。常用属性包括
clip
(音频剪辑)、volume
(音量)、loop
(是否循环)等。Particle System(粒子系统):用于创建各种视觉效果,如火焰、爆炸和烟雾等。一些常见的属性包括
startSize
(起始大小)、startColor
(起始颜色)、startSpeed
(起始速度)等。UI Elements(用户界面元素):用于创建游戏界面和用户交互的元素。常见的属性包括
text
(文本内容)、color
(颜色)、onClick
(点击事件)等。
生命周期方法
在Unity中,MonoBehaviour是所有脚本的基类,它提供了一系列的生命周期方法,用于在游戏运行过程中管理脚本的行为和状态。以下是一些常用的MonoBehaviour生命周期方法:
Awake():当脚本创建实例时调用,用于初始化脚本和变量。通常用于获取组件引用或设置初始数值。
Start():在脚本实例创建完成后的第一帧调用,用于进行一次性的初始化操作。通常用于设置游戏对象的初始状态。
Update():在每一帧进行更新时调用,用于处理游戏逻辑。这是最常用的生命周期方法之一,用于实时更新游戏对象的行为。
FixedUpdate():在固定时间步长内进行更新,用于处理物理相关的逻辑。与Update()不同,FixedUpdate()的调用频率是固定的,不受帧率的影响。
LateUpdate():在所有Update()方法执行完毕后调用,通常用于在Update()之后进行一些相机跟随或其他对象调整的操作。
OnEnable():当脚本组件被启用时调用,通常在脚本被激活时进行一些初始化操作。
OnDisable():当脚本组件被禁用时调用,通常在脚本被停用时进行一些清理操作。
OnDestroy():当脚本实例被销毁时调用,通常在脚本被销毁时进行一些资源释放或清理操作。
这些生命周期方法可以让你在适当的时机执行相关的代码逻辑,实现游戏对象的行为和状态的控制。你可以根据具体的需求,在这些方法中编写对应的代码来实现你的游戏逻辑。
精灵图切割
一般我们的精灵图都是一组动作的图片
我们要设置切割模式为Multiple
另外如果我们的图片是像素风格
的 Wrap Mode
和Filter Mode
按上图配置才不会变模糊。
查找子物体
在Unity中,有几种方式可以查找子物体。以下是常用的几种方式:
Transform.Find:使用
Transform.Find
方法可以按照层级路径查找子物体。这种方法是最直接的方式,但是只能按照完整的层级路径进行查找,无法进行模糊查找。1
2
3
4Transform child = transform.Find("Parent/Child");
var bullet = transform.Find("Bullet");
bullet.gameObject.SetActive(true);Transform.GetChild:使用
Transform.GetChild
方法可以按照索引查找子物体。这种方式通过索引来访问每一个子物体,索引从0开始,按照子物体在层级中的顺序进行访问。1
Transform child = transform.GetChild(0);
GetComponentsInChildren:使用
GetComponentsInChildren
方法可以获取指定组件类型的所有子物体。它会在当前物体以及其所有子物体中进行递归搜索,并返回符合条件的组件。1
Rigidbody[] rigidbodies = GetComponentsInChildren<Rigidbody>();
GetComponentInChildren:使用
GetComponentInChildren
方法可以获取指定组件类型的第一个子物体。它会在当前物体以及其所有子物体中进行递归搜索,并返回找到的第一个符合条件的组件。1
Rigidbody rigidbody = GetComponentInChildren<Rigidbody>();
关于性能的比较,Transform.Find
和Transform.GetChild
的性能通常会比GetComponentsInChildren
和GetComponentInChildren
高。因为前者只需要按照路径或索引查找,而后者需要做更复杂的递归搜索。所以,如果你能通过路径或索引直接找到子物体,那么使用Transform.Find
或Transform.GetChild
会更高效。但是,性能差距可能在实际使用中并不明显,因此建议根据具体的需求选择适当的查找方法。
按键
旧方式
使用 Input 类的 GetKey/GetKeyDown/GetKeyUp 方法
例如:
1 | void Update() { |
使用 Input 类的 GetButton/GetButtonDown/GetButtonUp 方法需要先在输入管理器中定义按钮名称
然后像 GetKey 一样使用:
移动
1 | float moveX = Input.GetAxisRaw("Horizontal"); |
设计
1 | if(Input.GetButtonDown("Fire1")) { |
在 Edit => Project Settings => Input Manager 我们能看到所有的事件名称
使用新输入系统(Input System)
Unity 的新输入系统(Input System)与旧的 Input 方法相比有以下一些优点:
- 更灵活的事件响应机制
Input System 不仅可以检测简单的按下/抬起事件,还可以检测按键持续时间、多次点击等复杂事件。 - 支持各种输入设备
Input System 可以处理键盘、游戏手柄、触摸屏等各种输入设备,而不仅限于键盘鼠标。 - 输入绑定机制
可以通过输入绑定将输入动作映射到不同按键或按钮,而不需要硬编码按键代码。 - 多个输入设备支持
一个游戏可以同时处理多个键盘或游戏手柄的输入。 - 原生 C# 代码
Input System 是用原生C#实现,没有封装抽象层,性能更高。 - 可编程和可扩展
可以通过代码完全自定义输入和事件处理逻辑。 - 按需分配资源
只需要为当前需要的设备分配资源,优化内存占用。 - 多线程支持
输入检测和事件分发可以多线程进行,提高性能。
总之,Input System 对 Unity 输入管理进行了重构,提供了更灵活、完善和高性能的输入支持。
物理组件
Rigidbody 2D组件:包含重力、摩擦力等
Box Collider 2D组件:包含碰撞(相互作用力)。调整碰撞体积的大小,在Box Collider 2D组件中的Editor Collider中调整(主角只需要下半身发生碰撞,更贴近真实。)。此外还可以使用适应物理形状的多边形碰撞组件Polygon Collider 2D