This repository has been archived on 2026-01-20. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
AW_2025/Assets/MeshBaker/Examples/SceneDynamicAddDelete/MB_DynamicAddDeleteExample.cs
2025-03-06 10:29:25 +09:00

93 lines
2.7 KiB
C#

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class MB_DynamicAddDeleteExample : MonoBehaviour
{
public GameObject prefab;
List<GameObject> objsInCombined = new List<GameObject>();
MB3_MultiMeshBaker mbd;
GameObject[] objs;
float GaussianValue()
{
float x1, x2, w, y1;
do
{
x1 = 2.0f * Random.Range(0f, 1f) - 1.0f;
x2 = 2.0f * Random.Range(0f, 1f) - 1.0f;
w = x1 * x1 + x2 * x2;
} while (w >= 1.0f);
w = Mathf.Sqrt((-2.0f * Mathf.Log(w)) / w);
y1 = x1 * w;
return y1;
}
void Start()
{
mbd = GetComponentInChildren<MB3_MultiMeshBaker>();
// instantiate game objects
int dim = 10;
GameObject[] gos = new GameObject[dim * dim];
for (int i = 0; i < dim; i++)
{
for (int j = 0; j < dim; j++)
{
GameObject go = (GameObject)Instantiate(prefab);
gos[i * dim + j] = go.GetComponentInChildren<MeshRenderer>().gameObject;
float randx = Random.Range(-4f, 4f);
float randz = Random.Range(-4f, 4f);
go.transform.position = (new Vector3(3f * i + randx, 0, 3f * j + randz));
float randrot = Random.Range(0, 360);
go.transform.rotation = Quaternion.Euler(0, randrot, 0);
Vector3 randscale = Vector3.one + Vector3.one * GaussianValue() * .15f;
go.transform.localScale = randscale;
//put every third object in a list so we can add and delete it later
if ((i * dim + j) % 3 == 0)
{
objsInCombined.Add(gos[i * dim + j]);
}
}
}
//add objects to combined mesh
mbd.ClearMesh();
if (mbd.AddDeleteGameObjects(gos, null, true))
{
mbd.Apply();
}
objs = objsInCombined.ToArray();
//start routine which will periodically add and delete objects
StartCoroutine(largeNumber());
}
IEnumerator largeNumber()
{
while (true)
{
yield return new WaitForSeconds(1.5f);
//Delete every third object
if (mbd.AddDeleteGameObjects(null, objs, true))
{
mbd.Apply();
}
yield return new WaitForSeconds(1.5f);
//Add objects back
if (mbd.AddDeleteGameObjects(objs, null, true))
{
mbd.Apply();
}
}
}
void OnGUI()
{
GUILayout.Label("Dynamically instantiates game objects. \nRepeatedly adds and removes some of them\n from the combined mesh.");
}
}