1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- // Code adapted from Arnaud's SRP Batcher
- using UnityEngine;
- using UnityEngine.Rendering;
-
- public class ObjectSpawner : MonoBehaviour
- {
- public Material[] m_MaterialList;
- public Transform m_SpawnOrigin;
- public GameObject m_LongTriangleObject;
- public int m_SpawnSize = 32;
- public int m_LongTriangleSize = 50;
- public string m_MaterialColorPropName = "_BaseColor";
- public bool m_CreateNewMaterials = true;
-
- GameObject[] m_GameObjects;
- Vector3[] m_Positions;
-
- float m_Clock;
-
- void Start()
- {
- m_GameObjects = new GameObject[m_SpawnSize * m_SpawnSize];
- m_Positions = new Vector3[m_SpawnSize * m_SpawnSize];
-
- float offset = (m_SpawnSize / 2);
- Vector3 spawnOrigin = m_SpawnOrigin.position;
- Vector3 spawnPos = new Vector3(spawnOrigin.x - offset, spawnOrigin.y, spawnOrigin.z - offset);
-
- Random.InitState((int)Time.time);
- PrimitiveType[] primitiveTypes = {PrimitiveType.Capsule, PrimitiveType.Cube, PrimitiveType.Sphere, PrimitiveType.Cylinder};
-
- int index = 0;
- for (int i = 0; i < m_SpawnSize; ++i)
- {
- for (int j = 0; j < m_SpawnSize; ++j)
- {
- int primitiveIndex = Random.Range(0, primitiveTypes.Length);
- Vector3 spawnPosition = new Vector3(spawnPos.x + i, spawnPos.y, spawnPos.z + j);
-
- GameObject instance = GameObject.CreatePrimitive(primitiveTypes[primitiveIndex]);
- SetupInstance(instance);
- m_GameObjects[index] = instance;
- m_Positions[index] = spawnPosition;
- index++;
- }
- }
-
- spawnPos = new Vector3(spawnOrigin.x, spawnOrigin.y - (m_LongTriangleSize / 2), spawnOrigin.z);
- for (int i = 0; i < m_LongTriangleSize; ++i)
- {
- Vector3 pos = new Vector3(spawnPos.x, spawnPos.y + i * 0.5f, spawnPos.z);
- GameObject instance = GameObject.Instantiate(m_LongTriangleObject, pos, Quaternion.Euler(0.0f, (360.0f * i) / m_LongTriangleSize, 0.0f));
- SetupInstance(instance);
- }
- }
-
- void SetupInstance(GameObject instance)
- {
- instance.transform.parent = m_SpawnOrigin;
- DestroyImmediate(instance.GetComponent<Collider>());
- MeshRenderer renderer = instance.GetComponent<MeshRenderer>();
- //renderer.lightProbeUsage = LightProbeUsage.Off;
- //renderer.reflectionProbeUsage = ReflectionProbeUsage.Off;
- if (m_CreateNewMaterials)
- {
- renderer.material = new Material(m_MaterialList[Random.Range(0, m_MaterialList.Length)]);
- renderer.material.SetColor(m_MaterialColorPropName, Random.ColorHSV(0.3f, 1f, 0.3f, 1f, 0.3f, 1f));
- }
- else
- renderer.sharedMaterial = m_MaterialList[Random.Range(0, m_MaterialList.Length)];
- }
-
- void Update()
- {
- m_Clock += Time.fixedDeltaTime;
- int index = 0;
- float t0 = m_Clock * 2.0f;
-
- for (int i = 0; i < m_SpawnSize; ++i)
- {
- float t1 = t0;
- for (int j = 0; j < m_SpawnSize; ++j)
- {
- Vector3 pos = m_Positions[index] + new Vector3(0.0f, Mathf.Sin(t1), 0.0f);
- m_GameObjects[index].transform.position = pos;
- t1 += 0.373f;
- index++;
- }
-
- t0 += 0.25f;
- }
-
- m_SpawnOrigin.transform.Rotate(Vector3.up * Time.fixedDeltaTime);
- }
- }
|