实例化静态网格体组件可以实现大批量的渲染相同的模型,并且每个模型可以拥有自己独有的位置。
之前,只是学习过如何使用实例化静态网格体,但是没有仔细研究如何使用,也没有应用到项目里,最近有时间,便专门学习了一下随便记录一下心得。
创建实例管理器
使用组件,首先创建一个管理器,用来管理实例的创建和取消。我们先创建一个Actor

然后再组件这里添加实例化静态网格体组件

然后在细节这里设置好使用的模型,如果不需要碰撞,记得将碰撞关闭。

材质也要记得选择支持实例化静态网格体

基础使用
基础的使用方式是添加,更新,和删除。
添加实例是增加一个需要渲染的模型,或者增加多个,增加单个可以传入一个位置变换返回当前模型当前的索引。(这里模型的索引会变化的,你不能通过添加的索引一直找到对应的模型实例,注意 ),或者通过数组传入多个变换,返回多个模型实例的索引。

以下是两个添加实例节点的区别

正常使用我们不可能就使用一个模型,那是没有意义的,这里我使用方式是,Actor的实例不带模型,而是通过网格体实例管理器创建,所以有了以下节点

然后是更新,这里小伙伴们就要问了,为什么还有一个数组,这个数组的作用就是用于记录当前Actor实例的索引,静态网格体组件的索引和数组的一致,所以我们就可以通过单独创建一个数组来维护需要渲染的实例的索引,有些需要更新位置,我们就可以通过索引找到对应网格体实例进行更新。

最后是在Actor实例销毁时,进行删除,这里注意,数组和静态网格体组件必须同时删除,才可以保持它们对索引的更新保持一致 。

有了添加删除和更新的函数,使用起来也很简单,在Actor中,我们在事件开始,调用添加函数,实现网格体实例的添加。我将网格体管理器挂在了GameMode上面,方便获取。

在销毁Actor之前,调用Remove事件,清除实例化网格体

如果Actor修改了位置,那么,也需要调用更新

以上,我们就实现了一个基础的使用,当然还有管理器,连带Actor一起管理的。
Actor的管理器实现
实现了基础使用,接着,我们实现一个进阶版本,在进阶版本里,可以避免Actor频繁的创建和销毁,在使用完成后,我们将其移出视角外,并在使用的时候,将其激活并显示到对应的位置上。
这样,我们就无法使用UE的函数生成和销毁,必须接管整个Actor的生命周期,之前,我们使用内置的创建

如果接管整个周期,就无法通过Spawn Actor去实现
我们将创建一个生成函数,首先判断数组内是否有空闲的实例,通过变量判断

如果数组内没有空闲的实例,我们将创建一个新的实例,并创建对应的网格体实例,并调用Actor的激活事件

激活事件相当于Actor实例的初始化函数,用于将实例初始化到创建的默认状态

更新位置时,还是要默认更新网格体实例状态

我们在创建实例时,将网格体实例的索引保存了下来,那么,在管理器里更新时,直接通过索引更新即可(没有销毁,索引的顺序不会改变)

在Actor生命周期结束时,我们将不再销毁实例,而是设置值,将其设置为空闲状态,并且不能够被角色获取到,所以,将其位置移动到了特别远的位置

在隐藏时,网格体管理器里,我们也同时更新网格体的位置,并且,将其缩放设置为0

这样,我们实现对Actor实例整个周期的管理。
为了防止后续有清除的需求,我还增加了一个清除所有实例的函数

如果你有疑问或者需要沟通交流的需求,欢迎在下面加群与我沟通。