Unity2D开发入门-环境安装及素材导入

前言

官方文档

https://docs.unity3d.com/cn/current/Manual/Input.html

素材商店

https://assetstore.unity.com/?category=2d&orderBy=4

下载

https://unity.cn/releases/full/2022

image-20230715180902195

建议两个都下载,当然可以下载Hub后,在Hub中安装Editor。

这里为什么建议两个都下载,是因为

  • 只下载Editor的话,启动的时候会报授权问题。
  • 下载Hub安装后,从Hub中下载Editor的话,会下载失败。

所以建议两个都安装后在Hub中指定Editor的位置。

Visual Studio安装开发环境

image-20230715183946176

开发工具

开发工具可以使用

  • 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#插件

image-20230718225202064

安装插件后,在设置中取消下面这个的勾选

image-20230718225648468

Window > PackManager >安装vscode编辑器插件

image-20230718224229057

安装后设置编辑器

Edit > Preferences > External Tools > 选择vscode作为项目编辑器

然后点Scipt Editor并选中你安装的vscode的exe

常用对象

以下是一些常见Unity对象的作用和常用属性的简要说明:

  1. GameObject(游戏对象):游戏中的基本构建块,用于表示场景中的实体。

    常用属性包括transform(变换组件)、name(名称)、activeSelf(是否激活)等。

    物体销毁的时候参数要传这个对象。

  2. Transform(变换):用于控制游戏对象的位置、旋转和缩放等变换属性。

    常用属性包括position(位置)、rotation(旋转)、localScale(缩放)等。

  3. Rigidbody(刚体):为游戏对象添加物理属性,使其受到重力、力和碰撞等物理影响。

    常用属性包括mass(质量)、drag(阻力)、velocity(速度)、angularVelocity(角速度)等。

  4. Collider(碰撞器):用于检测游戏对象之间的碰撞和触发事件。

    常见的碰撞器类型有BoxColliderSphereColliderCapsuleCollider等。

    常用属性包括isTrigger(是否为触发器)、center(中心位置)、size(大小)等。

  5. Animator(动画控制器):用于创建和管理动画,实现角色和物体的动态效果。

    常用属性包括runtimeAnimatorController(运行时动画控制器)、speed(动画播放速度)等。

  6. AudioSource(音频源):用于播放音效和音乐。常用属性包括clip(音频剪辑)、volume(音量)、loop(是否循环)等。

  7. Particle System(粒子系统):用于创建各种视觉效果,如火焰、爆炸和烟雾等。一些常见的属性包括startSize(起始大小)、startColor(起始颜色)、startSpeed(起始速度)等。

  8. UI Elements(用户界面元素):用于创建游戏界面和用户交互的元素。常见的属性包括text(文本内容)、color(颜色)、onClick(点击事件)等。

生命周期方法

在Unity中,MonoBehaviour是所有脚本的基类,它提供了一系列的生命周期方法,用于在游戏运行过程中管理脚本的行为和状态。以下是一些常用的MonoBehaviour生命周期方法:

  1. Awake():当脚本创建实例时调用,用于初始化脚本和变量。通常用于获取组件引用或设置初始数值。

  2. Start():在脚本实例创建完成后的第一帧调用,用于进行一次性的初始化操作。通常用于设置游戏对象的初始状态。

  3. Update():在每一帧进行更新时调用,用于处理游戏逻辑。这是最常用的生命周期方法之一,用于实时更新游戏对象的行为。

  4. FixedUpdate():在固定时间步长内进行更新,用于处理物理相关的逻辑。与Update()不同,FixedUpdate()的调用频率是固定的,不受帧率的影响。

  5. LateUpdate():在所有Update()方法执行完毕后调用,通常用于在Update()之后进行一些相机跟随或其他对象调整的操作。

  6. OnEnable():当脚本组件被启用时调用,通常在脚本被激活时进行一些初始化操作。

  7. OnDisable():当脚本组件被禁用时调用,通常在脚本被停用时进行一些清理操作。

  8. OnDestroy():当脚本实例被销毁时调用,通常在脚本被销毁时进行一些资源释放或清理操作。

这些生命周期方法可以让你在适当的时机执行相关的代码逻辑,实现游戏对象的行为和状态的控制。你可以根据具体的需求,在这些方法中编写对应的代码来实现你的游戏逻辑。

精灵图切割

image-20230718235612604

一般我们的精灵图都是一组动作的图片

我们要设置切割模式为Multiple

另外如果我们的图片是像素风格Wrap ModeFilter Mode按上图配置才不会变模糊。

查找子物体

在Unity中,有几种方式可以查找子物体。以下是常用的几种方式:

  1. Transform.Find:使用Transform.Find方法可以按照层级路径查找子物体。这种方法是最直接的方式,但是只能按照完整的层级路径进行查找,无法进行模糊查找。

    1
    2
    3
    4
    Transform child = transform.Find("Parent/Child");

    var bullet = transform.Find("Bullet");
    bullet.gameObject.SetActive(true);
  2. Transform.GetChild:使用Transform.GetChild方法可以按照索引查找子物体。这种方式通过索引来访问每一个子物体,索引从0开始,按照子物体在层级中的顺序进行访问。

    1
    Transform child = transform.GetChild(0);
  3. GetComponentsInChildren:使用GetComponentsInChildren方法可以获取指定组件类型的所有子物体。它会在当前物体以及其所有子物体中进行递归搜索,并返回符合条件的组件。

    1
    Rigidbody[] rigidbodies = GetComponentsInChildren<Rigidbody>();
  4. GetComponentInChildren:使用GetComponentInChildren方法可以获取指定组件类型的第一个子物体。它会在当前物体以及其所有子物体中进行递归搜索,并返回找到的第一个符合条件的组件。

    1
    Rigidbody rigidbody = GetComponentInChildren<Rigidbody>();

关于性能的比较,Transform.FindTransform.GetChild的性能通常会比GetComponentsInChildrenGetComponentInChildren高。因为前者只需要按照路径或索引查找,而后者需要做更复杂的递归搜索。所以,如果你能通过路径或索引直接找到子物体,那么使用Transform.FindTransform.GetChild会更高效。但是,性能差距可能在实际使用中并不明显,因此建议根据具体的需求选择适当的查找方法。

按键

旧方式

使用 Input 类的 GetKey/GetKeyDown/GetKeyUp 方法

例如:

1
2
3
4
5
void Update() {
if(Input.GetKeyDown(KeyCode.Space)) {
// 按空格键时的处理
}
}

使用 Input 类的 GetButton/GetButtonDown/GetButtonUp 方法需要先在输入管理器中定义按钮名称

然后像 GetKey 一样使用:

移动

1
2
float moveX = Input.GetAxisRaw("Horizontal");
float moveY = Input.GetAxisRaw("Vertical");

设计

1
2
3
if(Input.GetButtonDown("Fire1")) {
// 按下定义的 Fire1 按钮时的处理
}

在 Edit => Project Settings => Input Manager 我们能看到所有的事件名称

使用新输入系统(Input System)

Unity 的新输入系统(Input System)与旧的 Input 方法相比有以下一些优点:

  1. 更灵活的事件响应机制
    Input System 不仅可以检测简单的按下/抬起事件,还可以检测按键持续时间、多次点击等复杂事件。
  2. 支持各种输入设备
    Input System 可以处理键盘、游戏手柄、触摸屏等各种输入设备,而不仅限于键盘鼠标。
  3. 输入绑定机制
    可以通过输入绑定将输入动作映射到不同按键或按钮,而不需要硬编码按键代码。
  4. 多个输入设备支持
    一个游戏可以同时处理多个键盘或游戏手柄的输入。
  5. 原生 C# 代码
    Input System 是用原生C#实现,没有封装抽象层,性能更高。
  6. 可编程和可扩展
    可以通过代码完全自定义输入和事件处理逻辑。
  7. 按需分配资源
    只需要为当前需要的设备分配资源,优化内存占用。
  8. 多线程支持
    输入检测和事件分发可以多线程进行,提高性能。
    总之,Input System 对 Unity 输入管理进行了重构,提供了更灵活、完善和高性能的输入支持。

物理组件

Rigidbody 2D组件:包含重力、摩擦力等

Box Collider 2D组件:包含碰撞(相互作用力)。调整碰撞体积的大小,在Box Collider 2D组件中的Editor Collider中调整(主角只需要下半身发生碰撞,更贴近真实。)。此外还可以使用适应物理形状的多边形碰撞组件Polygon Collider 2D