unity 获取预制体_Unity基础教程-对象管理(二)——对象多样化(Fabricating Shapes)...

这篇教程介绍了如何在Unity中实现对象多样化的形状管理,包括创建形状工厂来支持不同材质和颜色的立方体、球体和胶囊。通过ShapeFactory类,实现了根据标识获取或随机创建形状。此外,还涵盖了如何保存和加载形状ID,以及添加材质多样性,创建三种不同的材质,并在加载旧版保存文件时保持向后兼容。最后,教程还展示了如何设置形状的颜色,并利用GPU实例化提升效率。
摘要由CSDN通过智能技术生成

9ee261a340679ee5c3a05cedd3dcf069.png

200+篇教程总入口,欢迎收藏:

放牛的星星:[教程汇总+持续更新]Unity从入门到入坟——收藏这一篇就够了​zhuanlan.zhihu.com
86447a3d7b2a0fb835341c20f5f87377.png

0a793b7e0df41da2735a7ce8b455472c.png
本文重点:
1、为形状创建一个工厂
2、保存和加载形状的id
3、支持多个材质和随机颜色
4、启用GPU实例化

这是关于对象管理系列的第二篇教程。在这一部分中,我们将添加对不同材质和颜色的多种形状的支持,同时保持游戏向后兼容,即兼容游戏的前一个版本。

本教程使用Unity 2017.4.1f1编写。

3751d10b734790976c34ce97f52f68a8.png
这些立方体在游戏结束之后仍然能“幸存”

1 形状工厂

本教程的目标是让我们的游戏更有趣,通过允许创建其他的形状,而不仅仅是白色的立方体。就像位置、旋转和缩放一样,我们将在玩家每次生成一个新形状时随机创建形状。

1.1 形状类

我们需要具体说明游戏会生成什么样的东西。游戏本身只会产生形状,而不是通常的可持久化对象。因此应该创建一个新的Shape类,它表示几何3D形状。目前来说它只是继承自PersistableObject,尚没有添加任何新东西。

3ac9ef96d3189cfb4cf11d3ebb9c0921.png

从Cube预制件中删除PersistableObject组件,并为其提供Shape组件。它不能同时具有两者,因为我们为PersistableObject提供了DisallowMultipleComponent属性,该属性也会作用于Shape。

163d0b567a969f9e8ec8206b028e5804.png
带有Shape组件的Cube

但这破坏了游戏对象对预制件的引用。但因为Shape也是一个PersistableObject,所以我们可以重新分配它。

437f77318d3c3f85206a005d1398bef2.png
Game中的Prefab重新获得引用

1.2 多个不同的形状

创建一个默认的球体和胶囊对象,给它们每人一个Shape组件,并把它们也变成预制件。这些是我们的游戏将支持的其他形状。

ab165e071fb8204199cb7da01bb5d39f.png
球体和胶囊体形状预制
那圆柱体呢?
当然,你还可以添加一个圆柱体对象,但我省略了它,因为圆柱体没有自己的碰撞器类型。相反,他们使用的是一个胶囊碰撞器,但并不适合。这虽然不是现在的问题,但以后可能会成为问题。

1.3 工厂Asset

当前,Game只能生成一件事,因为它仅具有对预制件的引用。要支持所有三种形状,将需要三个预制引用。这需要三个字段,但这并不灵活。更好的方法是使用数组。当然,也许以后我们会想出另一种方式来创建形状。但这只会让Game变得更加复杂,因为它还需要负责用户输入,跟踪对象并触发保存和加载等。

为了简化Game,我们将在他们自己的类中支持形状的创建。此类就像工厂一样,按需创建形状,而其用户不必知道如何制作这些形状,甚至不必知道有多少种不同的选择。我们将此类命名为ShapeFactory。

8d2a23fa96c97474daa00ffdc10e4b9f.png

工厂的唯一责任是交付形状实例。它不需要位置,旋转或缩放,也不需要Update方法来更改其状态。因此,它不必是组件,不需要将其附加到游戏对象上。相反,它可以单独存在,不是作为特定场景的一部分,而是作为项目的一部分。换句话说,它是一种资产。可以继承自ScriptableObject而不是MonoBehaviour。

51d55d0b9c0d6f9b48794621f95eacb9.png

我们现在有了一个自定义资产类型。为了将这样的资产添加到我们的项目中,我们必须为它添加一个条目到Unity的菜单中。最简单的方法是将CreateAssetMenu属性添加到类中。

f878009a950362a1552e36beda7e8b3a.png

不现在可以通过资产创建形状工厂来创建我们的工厂。但只需要一个。

b2522c01f4a981da5776d7713571fdde.png
形状工厂资产

为了让我们的工厂了解形状预制件,可以给它一个shape[]预制件数组字段。我们不希望这个字段是公开的,因为它的内部工作不应该公开给其他类。所以要保密。为了让数组在检查器中显示并被Unity保存,可以添加SerializeField属性给它。

3446e80fd439dceff106a44abed9accd.png

字段出现在检查器中之后,将所有三个形状预置拖放到它上面,这样对它们的引用就会被添加到数组中。确保立方体是第一个元素。第二个元素使用球体,第三个元素使用胶囊。

4bd2792442398b6e522f44c56a5b2eb7.png
带有各个预制件引用的工厂

1.4 获取形状

要使工厂发挥作用,必须有一种方法可以从它获得shape实例。给它一个公共Get方法。客户端可以通过形状标识符参数指出它想要的形状类型。为此,我们将简单地使用一个整数。

3b1f93e2402c402588e11ccf0deb9ab5.png
为什么不使用枚举?
这当然是可以的,所以你可以这样做。但是我们并不真正关心在代码中确定确切的形状类型&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值