Brak opisu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ObjectSpawner.cs 3.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // Code adapted from Arnaud's SRP Batcher
  2. using UnityEngine;
  3. using UnityEngine.Rendering;
  4. public class ObjectSpawner : MonoBehaviour
  5. {
  6. public Material[] m_MaterialList;
  7. public Transform m_SpawnOrigin;
  8. public GameObject m_LongTriangleObject;
  9. public int m_SpawnSize = 32;
  10. public int m_LongTriangleSize = 50;
  11. public string m_MaterialColorPropName = "_BaseColor";
  12. public bool m_CreateNewMaterials = true;
  13. GameObject[] m_GameObjects;
  14. Vector3[] m_Positions;
  15. float m_Clock;
  16. void Start()
  17. {
  18. m_GameObjects = new GameObject[m_SpawnSize * m_SpawnSize];
  19. m_Positions = new Vector3[m_SpawnSize * m_SpawnSize];
  20. float offset = (m_SpawnSize / 2);
  21. Vector3 spawnOrigin = m_SpawnOrigin.position;
  22. Vector3 spawnPos = new Vector3(spawnOrigin.x - offset, spawnOrigin.y, spawnOrigin.z - offset);
  23. Random.InitState((int)Time.time);
  24. PrimitiveType[] primitiveTypes = {PrimitiveType.Capsule, PrimitiveType.Cube, PrimitiveType.Sphere, PrimitiveType.Cylinder};
  25. int index = 0;
  26. for (int i = 0; i < m_SpawnSize; ++i)
  27. {
  28. for (int j = 0; j < m_SpawnSize; ++j)
  29. {
  30. int primitiveIndex = Random.Range(0, primitiveTypes.Length);
  31. Vector3 spawnPosition = new Vector3(spawnPos.x + i, spawnPos.y, spawnPos.z + j);
  32. GameObject instance = GameObject.CreatePrimitive(primitiveTypes[primitiveIndex]);
  33. SetupInstance(instance);
  34. m_GameObjects[index] = instance;
  35. m_Positions[index] = spawnPosition;
  36. index++;
  37. }
  38. }
  39. spawnPos = new Vector3(spawnOrigin.x, spawnOrigin.y - (m_LongTriangleSize / 2), spawnOrigin.z);
  40. for (int i = 0; i < m_LongTriangleSize; ++i)
  41. {
  42. Vector3 pos = new Vector3(spawnPos.x, spawnPos.y + i * 0.5f, spawnPos.z);
  43. GameObject instance = GameObject.Instantiate(m_LongTriangleObject, pos, Quaternion.Euler(0.0f, (360.0f * i) / m_LongTriangleSize, 0.0f));
  44. SetupInstance(instance);
  45. }
  46. }
  47. void SetupInstance(GameObject instance)
  48. {
  49. instance.transform.parent = m_SpawnOrigin;
  50. DestroyImmediate(instance.GetComponent<Collider>());
  51. MeshRenderer renderer = instance.GetComponent<MeshRenderer>();
  52. //renderer.lightProbeUsage = LightProbeUsage.Off;
  53. //renderer.reflectionProbeUsage = ReflectionProbeUsage.Off;
  54. if (m_CreateNewMaterials)
  55. {
  56. renderer.material = new Material(m_MaterialList[Random.Range(0, m_MaterialList.Length)]);
  57. renderer.material.SetColor(m_MaterialColorPropName, Random.ColorHSV(0.3f, 1f, 0.3f, 1f, 0.3f, 1f));
  58. }
  59. else
  60. renderer.sharedMaterial = m_MaterialList[Random.Range(0, m_MaterialList.Length)];
  61. }
  62. void Update()
  63. {
  64. m_Clock += Time.fixedDeltaTime;
  65. int index = 0;
  66. float t0 = m_Clock * 2.0f;
  67. for (int i = 0; i < m_SpawnSize; ++i)
  68. {
  69. float t1 = t0;
  70. for (int j = 0; j < m_SpawnSize; ++j)
  71. {
  72. Vector3 pos = m_Positions[index] + new Vector3(0.0f, Mathf.Sin(t1), 0.0f);
  73. m_GameObjects[index].transform.position = pos;
  74. t1 += 0.373f;
  75. index++;
  76. }
  77. t0 += 0.25f;
  78. }
  79. m_SpawnOrigin.transform.Rotate(Vector3.up * Time.fixedDeltaTime);
  80. }
  81. }