为Unity3D创建素材(3):预设物体(Prefab)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为Unity3D创建素材(3):预设物体(Prefab)相关的知识,希望对你有一定的参考价值。

参考技术A

我们知道,资源和我们用在场景中的game object(游戏物体)还是不一样的,一个fbx文件是一个“资源”,而将拖到场景中就变成了一个“带有各种组件的节点”。在从“资源”到“带组件的节点”的转化过程中我们需要手动做一些设置,一些修改,甚至需要添加一些新的组件以满足我们的需求,或者将多个节点组合成新的游戏物体(比如用多个模型道具组合成一个NPC的家)。

从“资源的重复利用”的角度来看,直接使用素材资源来搭建场景是低效的,更好更高效的方法是重复利用在场景中已经完成了设置、修改、组合等工作的游戏物体。于是Unity3D就开发了 Prefab(预设物体) 这个功能。

Prefab可以被看做是对scene(场景)中game object(游戏物体)的描述文件,可以被储存在Assets文件夹内,以方便在其他scene中重复利用。Prefab实际上并不包含任何模型、贴图等真正的素材文件,只是一个虚拟的“参考”。

我们可以把prefab当做一种特殊的“资源素材”,在场景中引用prefab,相当于按照这个prefab所描述的规范引用其涉及到的“真实素材”。如果我们不小心删除掉了这些“真实素材”,那么prefab就失去了作用。

将场景中的单个game object用鼠标拖到Project面板中的Assets目录下,就可以创建这个game object的prefab。

要使用Prefab,将其拖到Scene View或者Hierarchy面板即可。

普通的game object在Hierarchy中显示为白色,而与prefab相联的game object在Hierarchy中显示为蓝色。

同时,与prefab相联的game object在Inspector面板中会多出一行关于Prefab的按钮,其中 Select 可以选择其所对应的prefab资源文件, Revert 可以将该game object恢复到原prefab资源文件的样子, Apply 可以将在此game object上做的修改应用的prefab资源文件中去(这样场景中其他关联于此prefab资源的game objects就都会自动更新)。

可以选择菜单 GameObject > Break Prefab Instance 来断开game object与prefab之间的联接关系。

小白错误—未达到预设子弹生命时间,子弹自动消失

如需转载,请保留本文链接。

出现问题:子弹正常出现,偶尔几枚子弹会有,没有存活到5秒钟,也没有碰到物体,就自动消失的问题.

解决关键函数:

错误代码如下:

public class BulletBase : MonoBehaviour
{
    public float Speed;
    float lifeTime;
    private void Awake()
    {
        lifeTime = 0;
    }
    private void Start() {        }
    private void Update()
    {
        Run();
        disable();
    }
    //子弹运动方式
    public virtual void Run() { }
    //子弹生存5秒后死亡
    private void disable()
    {
        lifeTime += Time.deltaTime;
        if (lifeTime >= 3)
        {
            gameObject.SetActive(false);
            Pool.DeadBulletList.Add(gameObject);//将子弹加入死亡池,预备集中处理
            lifeTime = 0;
        }
    }
}

正确代码如下:

public class BulletBase : MonoBehaviour
{
    public float Speed;
    float lifeTime;
    private void Awake()
    {
        lifeTime = 0;
    }
    private void OnEnable()
    {
        lifeTime = 0;
    }
    private void Start() {        }
    private void Update()
    {
        Run();
        disable();
    }
    //子弹运动方式
    public virtual void Run() { }
    //子弹生存5秒后死亡
    private void disable()
    {
        lifeTime += Time.deltaTime;
        if (lifeTime >= 3)
        {
            gameObject.SetActive(false);
            Pool.DeadBulletList.Add(gameObject);//将子弹加入死亡池,预备集中处理
            lifeTime = 0;
        }
    }
}

问题所在:

当gameobject setactive(true)时,会调用OnEnable()方法,不会调用Awake()方法.

Awake()初始化lifeTime=0后,不再进行调用,再次使用gameobject时会调用OnEnable()方法,所以lifeTime=0也需要在OnEnable()中调用一次.

以上是关于为Unity3D创建素材(3):预设物体(Prefab)的主要内容,如果未能解决你的问题,请参考以下文章

Unity3d实现幸运转盘

unity3d中间获取不在场景中的物体的组件

Unity3D怎么让地形中随机出现物体?

Unity3D 多层血条特效

Unity3D 多层血条特效

unity3D中动态加载物体的常用的方法