请选择 进入手机版 | 继续访问电脑版

运行时实例化预设 (Prefabs)

[复制链接]
林雨宣 发表于 2020-12-31 19:00:23 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
文章目录



  一、一般情况

为说明预设 (Prefabs) 的强大,让我们来看看可用得上预设的一些基本情况:

  • 在差别位置,多次使用单块“砖”预设 (Prefab) 创建一堵墙。
  • 发射时,火箭发射器实例化一个飞行的火箭预设 (Prefab)。
  • 预设 (Prefab) 包罗一个网格 (Mesh)、刚体 (Rigidbody)、碰撞器 (Collider) 和带有自己的拖尾粒子系统 (Particle System) 的子游戏对象 (GameObject)。
  • 机器人爆炸成许多碎片。完整的利用机器人已破坏,替换成一个残破的机器人预设 (Prefab)。
  • 该预设 (Prefab) 包罗分成多个部分的机器人,所有部分均设有自己的刚体 (Rigidbodies) 和粒子系统 (粒子系统(Particle Systems))。
    仅用一行代码,将一个对象替换成预设 (Prefab),该技能就可让您将机器人炸成许多碎片。
二、创建一堵墙

该示例说明与使用代码创建对象相比,使用预设 (Prefab) 的优势。
首先,使用代码创建一堵砖墙:
  1. // JavaScriptfunction Start () {for (var y = 0; y < 5; y++) {for (var x = 0; x < 5; x++) {var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);cube.AddComponent(Rigidbody);cube.transform.position = Vector3 (x, y, 0);        }    }}// C#public class Instantiation :MonoBehaviour {        void Start() {                for (int y = 0; y < 5; y++) {                        for (int x = 0; x < 5; x++) {                                GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);                                cube.AddComponent();                                cube.transform.position = new Vector3(x, y, 0);                        }                }        }}
复制代码
1.使用上方脚本

只需保存该脚本,然后将其拖到空游戏对象 (GameObject)。
通过游戏对象 (GameObject)->创建空游戏对象 (Create Empty) 创建一个空游戏对象。
进入播放模式 (Play Mode) 后,如果执行该代码,您将看到步调创建整堵砖墙。有两行与每块砖的功能相关:CreatePrimitive() 行和 AddComponent() 行。现在没有那么糟糕,只是每块砖没有纹理。想在砖上执行的每个附加利用,比方更改纹理、摩擦力或刚体质量,都是额外行。
如果创建预设 (Prefab) 并预先设置好,您将使用一行代码创建和设置每块砖。在决定想要举行修改时,这样可以淘汰维护和更改大量代码。只需要修改预设 (Prefab) 即可,无需修改代码。
如果针对每块砖使用预设 (Prefab),以下则是创建墙所需的代码。
代码如下(示例):
  1. // JavaScriptvar brick :Transform;function Start () {for (var y = 0; y < 5; y++) {for (var x = 0; x < 5; x++) {Instantiate(brick, Vector3 (x, y, 0), Quaternion.identity);        }    }}// C#public Transform brick;void Start() {        for (int y = 0; y < 5; y++) {                for (int x = 0; x < 5; x++) {                        Instantiate(brick, new Vector3(x, y, 0), Quaternion.identity);                }        }}
复制代码
2.优势

代码不光非常干净,而且可重复使用。没有什么规范规定,我们要实例化一个立方体,或者它必须包罗刚体。所有这一切都在预设 (Prefab) 中界说,且可以在编辑器 (Editor) 中快速创建。
现在我们只需在编辑器 (Editor) 中创建预设 (Prefab)。
方法如下:

  • 选择游戏对象 (GameObject)->创建其他对象 (Create Other)->立方体 (Cube)
  • 选择组件 (Component)->物理 (Physics)->刚体 (Rigidbody)
  • 选择资源 (Assets)->创建 (Create)->预设 (Prefab)
  • 在工程视图 (Project View) 中,将新预设 (Prefab) 的名称更改为“砖 (Brick)”
  • 将您在层级视图 (Hierarchy) 中创建的立方体拖到工程视图 (Project View) 中的“砖 (Brick)” 预设 (Prefab) 上
  • 创建预设 (Prefab) 后,可以从层级视图 (Hierarchy) 安全删除立方体 (Cube)(Windows 上的删除 (Delete),Mac 上的回退下令 (Command-Backspace))
  • 我们已经创建砖预设 (Brick Prefab),现在需将其附加到脚本的砖变量上。选择包罗脚本的空游戏对象 (GameObject)。请注意,检视器 (Inspector) 中将出现一个新变量,名为“砖”。

这个变量可以担当任何游戏对象 (GameObject) 或预设 (Prefab)
现在从工程视图 (Project View) 将“砖 (Brick)” 预设 (Prefab) 拖到检视器 (Inspector) 中的砖变量上。按下“播放 (Play)”,将会看到使用预设创建的墙。
这是工作流模式,可在 Unity 中重复使用。在刚开始,您大概想知道为什么如此方便,因为脚本创创建方体只需 2 行代码。
但是由于现在使用预设 (Prefab),您可以在数秒之内调解预设。
1.想要更改所有实例的质量?
只需在预设 (Prefab) 中调解一次刚体 (Rigidbody)。
2.想为所有实例使用差别的材质 (Material)?
只需将材质 (Material) 拖到预设 (Prefab) 上一次。
3.想要更改摩擦力?
在预设 (Prefab) 碰撞器中使用差别的物理材质 (Physic Material)。
4.想为所有立方体添加一个粒子系统 (Particle System)?
向预设 (Prefab) 添加一次子对象。
三、实例化火箭和爆炸

以下是预设 (Prefabs) 适合该应用场景的方式:
用户按下“发射”时,火箭发射器实例化一个火箭预设 (Prefab) 。预设 (Prefab) 包罗一个网格 (Mesh)、刚体 (Rigidbody)、碰撞器 (Collider) 和包罗拖尾粒子系统的子游戏对象 (GameObject)。
火箭撞击后,实例化一个爆炸预设 (Prefab)。该爆炸预设 (Prefab) 包罗一个粒子系统 (Particle System)、一个随时间渐暗的光源和一个向周围游戏对象 (GameObjects) 施加破坏的脚本。
只管有大概完全用代码创建一个火箭游戏对象 (GameObject),手动添加组件 (Components) 并设置属性,实例化预设 (Prefab) 要简单得多。不管火箭预设 (Prefab) 多么复杂,可以只用一行代码实例化火箭。实例化预设 (Prefab) 后,还可以修改实例化的对象的任何属性(比方设置火箭刚体 (Rigidbody) 的速度)。
除了使用方便之外,随后还可以更新预设。因此,创建火箭之后,无需立刻给它添加粒子 (Particle) 拖尾,可在以后添加。将拖尾作为子游戏对象 (GameObject) 添加到预设 (Prefab) 后,所有实例化的火箭将拥有粒子拖尾。最后,可以在检视器 (Inspector) 中快速调治火箭预设 (Prefab) 的属性,使得微调游戏变得更简单。
该脚本演示如何使用 Instantiate() 函数发射火箭。
代码如下(示例):
  1. data = pd.read_csv(    &#39;https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv&#39;)print(data.head())
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )