About | Features | Getting Started | Terminology | Best Practices | F.A.Q.
General Features
Automatic 2D Billboard Generation System
Prefab Instancing Features
Automatically Add-Remove prefab instances without any aditional code
1. Easiest way is to enable Auto. Add/Remove Instances option in the prototype options. When enabled, the Prefab Manager will add a script called "GPUInstancerPrefabRuntimeHandler" to the prefab object and handle all runtime changes automatically.
2. Optionally you can add prefab instances through our API methods with the AddPrefabInstance and RemovePrefabInstance methods. Keep in mind that Add/Remove Instances At Runtime option should be enabled in the prototype definition for this API methods to work. Also Extra Buffer Size should have high enough number to add all the prefab instances generated at runtime.
3. Another option is to register the prefab instances and reinitialize the Prefab Manager with first calling RegisterPrefabInstanceList method and then calling InitializeGPUInstancer method.
using System.Collections.Generic;
using UnityEngine;
namespace GPUInstancer.Extras
{
public class GPUIRegisterPrefabInstances : MonoBehaviour
{
// Keeping a static reference to the manager so it can be shared between scenes.
public static GPUInstancerPrefabManager prefabManager;
// The list of prefab instances in scene
public List<GPUInstancerPrefab> prefabInstanceList;
// In this example we fill the list in the Reset method which works when adding the component for the first time (or using the reset command in the inspector).
// You can fill the list in any way you want.
public void Reset()
{
// Add prefabs in the scene to the list
prefabInstanceList = new List<GPUInstancerPrefab>(FindObjectsOfType<GPUInstancerPrefab>());
}
void Start()
{
// Find the prefab manager and set it to the static property
if(prefabManager == null && GPUInstancerAPI.GetActiveManagers() != null)
{
GPUInstancerManager manager = GPUInstancerAPI.GetActiveManagers().Find(m => m is GPUInstancerPrefabManager);
prefabManager = (GPUInstancerPrefabManager)manager;
}
// Register the prefab instance list to the manager
if (prefabManager != null && prefabManager.isActiveAndEnabled)
{
GPUInstancerAPI.RegisterPrefabInstanceList(prefabManager, prefabInstanceList);
GPUInstancerAPI.InitializeGPUInstancer(prefabManager);
}
}
}
}
Nested Prefabs support (Unity 2018.3 and later)
Add-Remove-Update prefab instances with or without instantiating GameObjects
With GPU Instancer, you can render prefab instances without instantiating GameObjects by supplying an array of Matrix4x4s.
using UnityEngine;
using GPUInstancer;
public class NoGameObject : MonoBehaviour
{
// reference to Prefab Manager
public GPUInstancerPrefabManager prefabManager;
// reference to prefab
public GPUInstancerPrefab prefab;
// size of array and buffers
public int bufferSize;
// transform data array
private Matrix4x4[] _matrix4x4Array;
// Use this for initialization
void Awake ()
{
// initialize the array with the max size
_matrix4x4Array = new Matrix4x4[bufferSize];
// set the data of the array
for (int i = 0; i < _matrix4x4Array.Length; i++)
_matrix4x4Array[i] = Matrix4x4.TRS(Random.insideUnitSphere * 15, Quaternion.identity, Vector3.one);
// initialize the buffers with array
GPUInstancerAPI.InitializeWithMatrix4x4Array(prefabManager, prefab.prefabPrototype, _matrix4x4Array);
}
private void Update()
{
if (Input.anyKeyDown)
{
// change the data of the array
for (int i = 0; i < _matrix4x4Array.Length; i++)
_matrix4x4Array[i] = Matrix4x4.TRS(Random.insideUnitSphere * 15, Quaternion.identity, Vector3.one);
// update buffers
GPUInstancerAPI.UpdateVisibilityBufferWithMatrix4x4Array(prefabManager, prefab.prefabPrototype, _matrix4x4Array);
}
}
}
Detail Instancing Features
Tree Instancing Features
Third Party Integrations