93 lines
2.3 KiB
C#
93 lines
2.3 KiB
C#
using Unity.Entities;
|
|
#if RUKHANKA_WITH_NETCODE
|
|
using Unity.NetCode;
|
|
#endif
|
|
using UnityEngine;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
namespace Rukhanka.Samples
|
|
{
|
|
public class PrefabSpawner: MonoBehaviour
|
|
{
|
|
public GameObject[] prefabPool;
|
|
public int count;
|
|
public float spawnRadius;
|
|
public float spawnDelayInSeconds;
|
|
public bool spawnUnityObjects;
|
|
public bool initialSpawn;
|
|
|
|
void Start()
|
|
{
|
|
if (spawnUnityObjects)
|
|
Spawn();
|
|
}
|
|
|
|
public void Spawn()
|
|
{
|
|
for (int i = 0; i < prefabPool.Length; ++i)
|
|
{
|
|
var scc = new SpawnCommandComponent() { spawnCount = count / prefabPool.Length };
|
|
var p = prefabPool[i];
|
|
for (int l = 0; l < scc.spawnCount; ++l)
|
|
{
|
|
var g = GameObject.Instantiate(p);
|
|
var randomPos = new Vector2(Random.value, Random.value) * 2 - new Vector2(1, 1);
|
|
var position = new Vector3(randomPos.x, 0, randomPos.y) * spawnRadius;
|
|
var rot = Quaternion.Euler(new Vector3(0, Random.value * 360, 9));
|
|
g.transform.position += position;
|
|
g.transform.rotation = rot;
|
|
|
|
var a = g.GetComponent<Animator>();
|
|
var randomSpeedVal = (Random.value * 2 - 1) * 0.5f + 1;
|
|
a.SetFloat("Crowd_AnimationSpeed", randomSpeedVal);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
public class PrefabSpawnerBaker: Baker<PrefabSpawner>
|
|
{
|
|
public override void Bake(PrefabSpawner a)
|
|
{
|
|
for (int i = 0; i < a.prefabPool.Length; ++i)
|
|
{
|
|
var p = a.prefabPool[i];
|
|
|
|
var spc = new SpawnPrefabComponent()
|
|
{
|
|
prefabToSpawn = GetEntity(p, TransformUsageFlags.Dynamic),
|
|
spawnRadius = a.spawnRadius,
|
|
};
|
|
|
|
var scc = new SpawnCommandComponent()
|
|
{
|
|
spawnCount = a.count / a.prefabPool.Length,
|
|
spawnTime = Time.time + a.spawnDelayInSeconds,
|
|
spawnerPos = a.transform.position,
|
|
boneVisualizationOn = true
|
|
};
|
|
|
|
if (!a.spawnUnityObjects)
|
|
{
|
|
var e = CreateAdditionalEntity(TransformUsageFlags.Dynamic);
|
|
AddComponent(e, spc);
|
|
if (a.initialSpawn)
|
|
AddComponent(e, scc);
|
|
|
|
#if RUKHANKA_WITH_NETCODE
|
|
if (p.GetComponent<GhostAuthoringComponent>() != null)
|
|
{
|
|
var netObjTag = default(NetworkedPrefab);
|
|
AddComponent(e, netObjTag);
|
|
}
|
|
#endif
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|