Unity全面入门笔记14-预制体

预制体

Prefab

  • 创建Prefab

Prefab的作用是保存一个GameObject的外观、组件及其属性,在需要用的时候方便快捷的将其复制,并且统一管理。Prefab作为被序列化的GameObject保存在硬盘中,它既可以作为布置场景时使用的模板物体,又可以作为在脚本中动态生成物体的模板。

要创建Prefab,可以先在场景中创建想要作为Prefab的GameObject,在Hierarchy中选中它,然后将它拖动到Project面板中。一般来说,我们会先将空物体保存为Prefab,然后再给Prefab设置用于外观或逻辑的子物体。

由于Prefab物体会经常在游戏进程中被动态调用,这些需要在代码中动态调用的Prefab应该被放到Resources文件夹里。

  • 使用Prefab

在编辑模式下将Prefab从Project面板拖动到Hierarchy面板或Scene面板,来以这个Prefab为模板创建一个GameObject。如果一个GameObject是基于Prefab生成的,它在Hierarchy中的图标和名称会被显示为蓝色,且最右方有一个”>”符号。

Prefab可以作为一个GameObject被赋值给属性,如:

class BulletShooter : MonoBehaviour
{
    [SerializeField]
    private GameObject m_bullet;
    
    void shoot(Vector3 direction)
    {
        if(m_bullet == null) throw new ReferenceNotInitialized();
        GameObject bullet = Instantiate(m_bullet, transform.position, Quaternion.identity);
        bullet.getComponent<Bullet>().MoveTowards(direction);
    }
}

在Inspector中我们可以将Prefab拖动赋值给m_bullet属性,这样之后使用Instantiate函数时就可以以预制体为模板创建物体了。

除此之外,我们还可以直接通过文件夹系统来直接获取Prefab,如下:

class PlayerInstaller : MonoBehaviour
{
    private void Start()
    {
    	GameObject player = Resources.Load("Player/Player_Blue") as GameObject;
    	Instantiate(player);
    }
}
  • 修改Prefab

以一个Prefab为模板生成的GameObject是与该Prefab绑定的,每当Prefab被修改,GameObject都会被同步修改。因此每一个在游戏中多次出现的GameObject都应该制作为Prefab。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qGlVJtQe-1569896851543)(C:\Users\UPiracy\AppData\Roaming\Typora\typora-user-images\1569340952957.png)]

与模板的Prefab相比,图中Animation是新附加的Component,具有一个加号标识。Capsule Collider是被删除的Prefab,具有一个减号标识。而Position和Rotation是修改过的属性,它们显示为粗体。我们可以通过Overrides功能将新增、删减、修改过的组件和属性重载到Prefab中:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DzECI3pZ-1569896851544)(C:\Users\UPiracy\AppData\Roaming\Typora\typora-user-images\1569340990371.png)]

在Overrides面板中可以看到修改过的属性,我们可以点击Revert All来取消所有改动或点击Apply All来应用所有改动,或者在该面板中点击属性,对该属性单独进行Revert或Apply操作。

在Project面板选中Prefab后可以在Inspector面板看到该Prefab的所有组件,我们可以直接在这里修改组件的参数,但不能更改Prefab的子物体。如果要修改Prefab的结构,在Inspector面板点击"Prefab"->"Open"或在Hierarchy面板点击GameObject右侧的”>”符号进入Prefab编辑界面。

在该界面中对Prefab做的所有改动会直接应用到Prefab上,不再需要点击Apply。

在该界面中可以对Prefab的子物体进行修改,包括子物体的树型结构、座标、组件和属性等。

Prefab Varient

  • 预制体分支

在Project面板中右键选择一个Prefab,在右键菜单中点击’Create"->"Prefab Variant"可以生成该预制体的一个分支,预制体分支也可以生成分支的分支。

预制体分支的逻辑在于:

每当一个属性在Prefab Variant中而非Prefab中被修改,这个属性就会被设置为分支属性。

对一个分支属性来说,Prefab Variant中的修改不会应用到它的树干Prefab上,同时,在Prefab中的修改也不会应用到以它为模板的Prefab Variant上。

对一个非分支属性来说,在Prefab中进行修改,会应用到以它为模板的Prefab Variant上。

例子:在设计一套敌人系统时,我希望两个敌人的移动属性保持一致,但其他属性略有不同,这时我就可以把不同的属性设置为分支属性,让两种敌人的属性略有区别,但是在调整移动属性时可以对非分支属性进行修改,这样就可以一次性应用到所有不同的敌人上。

取消Prefab

  • Unpack Prefab

对一个以Prefab为模板的GameObject点击右键菜单可以找到"Unpack Prefab"和"Unpack Prefab Completely"功能。它们的作用都是取消GameObject和Prefab的绑定,取消绑定后,对Prefab的改动不再应用到这个物体。

若父物体和子物体都是Prefab,对父物体使用Unpack Prefab功能会导致父物体取消与Prefab的绑定,但子物体仍保留对Prefab的绑定。而对父物体使用Unpack Prefab Completely功能时,父物体和子物体都将取消与Prefab的绑定。

在Project面板中删除一个Prefab或Prefab Variant,会自动解除所有以它为模板生成的GameObject,这么做之后GameObject的名称会显示为黑红色。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章