using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using System.Globalization;
public class AsteroidFieldGenerator : MonoBehaviour
{
public bool GizmosOn = false;
public bool SpawnIceAsteroids = false;
public GameObject[] AsteroidPrefabs;
public GameObject[] OrePickUpsPrefabs;
public GameObject[] LargeOrePickUpsPrefabs;
public string[] ResourceTypes;
public float[] ResourceProbabilities;
public Vector3 Extents;
public float Density; //this is asteroids per 100m3
public void EDITOR_GenerateAsteroidField()
{
SpawnAsteroids();
}
public void EDITOR_DestroyExistingField()
{
DestroyAllChildren();
}
public void DestroyAllChildren()
{
GameObject[] children = new GameObject[transform.childCount];
for (int i = 0; i < transform.childCount; i++)
{
children[i] = transform.GetChild(i).gameObject;
}
for (int i = 0; i < children.Length; i++)
{
DestroyImmediate(children[i]);
}
}
public string GetAsteroidName()
{
int n1 = Random.Range(0, 10000);
int n2 = Random.Range(0, 26) + 65;
int n3 = Random.Range(0, 26) + 65;
int n4 = Random.Range(0, 100);
char n2char = (char)n2;
char n3char = (char)n3;
return n1.ToString() + " " + n2char + n3char + n4.ToString();
}
public void SpawnAsteroids()
{
//determine how many we want
float volume = Extents.x * Extents.y * Extents.z;
float per100m3 = volume / (100*100*100);
int numAsteroids = Mathf.CeilToInt(per100m3 * Density);
int seed = GetSeed();
Vector3[] asteroidPositions = new Vector3[numAsteroids];
Random.InitState(seed);
for (int i = 0; i < numAsteroids; i++)
{
//world rot
//asteroidPositions[i] = new Vector3(transform.position.x + Random.Range(-Extents.x/2f, Extents.x/2f),
// transform.position.y + Random.Range(-Extents.y/2f, Extents.y/2f),
// transform.position.z + Random.Range(-Extents.z/2f, Extents.z/2f));
//local
asteroidPositions[i] = transform.position
+ transform.right * Random.Range(-Extents.x/2f, Extents.x/2f)
+ transform.up * Random.Range(-Extents.y/2f, Extents.y/2f)
+ transform.forward * Random.Range(-Extents.z/2f, Extents.z/2f);
}
//spawn the actual asteroids
for (int i = 0; i < numAsteroids; i++)
{
int asteroidSeed = seed + Mathf.RoundToInt(asteroidPositions[i].x + asteroidPositions[i].y + asteroidPositions[i].z);
SpawnAsteroid(asteroidSeed, asteroidPositions[i]);
}
}
//TODO: rotation
public void SpawnAsteroid(int seed, Vector3 pos)
{
Random.InitState(seed);
int index = Random.Range(0,AsteroidPrefabs.Length);
GameObject go = Instantiate(AsteroidPrefabs[index]);
go.transform.position = pos;
go.transform.rotation = transform.rotation * Random.rotation;
go.transform.SetParent(this.transform);
Asteroid a = go.GetComponent<Asteroid>();
a.Name = GetAsteroidName();
Vector3 scale = new Vector3(Random.Range(0.8f, 1.2f), Random.Range(0.8f, 1.2f), Random.Range(0.8f, 1.2f));
float scaleFactor = Random.Range(0.5f, 1.5f);
scale *= scaleFactor;
go.transform.localScale = scale;
float massDec = Random.Range(0.01f, 10f);
int massExp = 0;
if (scaleFactor <= 0.833333f)
{
massExp = 17;
}
else if (scaleFactor >= 1.166666f)
{
massExp = 19;
}
else
{
massExp = 18;
}
string massString = massDec.ToString("F2", new CultureInfo("en-US")) + "e" + massExp.ToString() + " kg";
a.Mass = massString;
int resourceTypeIndx = 0;
if (SpawnIceAsteroids)
{
resourceTypeIndx = Random.Range(0, ResourceTypes.Length);
}
else
{
resourceTypeIndx = Random.Range(0, ResourceTypes.Length - 1);
}
float ProbTest = Random.Range(0f,1f);
if (ProbTest <= ResourceProbabilities[resourceTypeIndx])
{
a.OreAmount = Random.Range(1, 51);
a.OreType = ResourceTypes[resourceTypeIndx];
a.PickUpChance = 0.85f;
a.SuperPickUpChance = 0.98f;
a.PickUpPrefab = OrePickUpsPrefabs[resourceTypeIndx];
a.SuperPickUpPrefab = LargeOrePickUpsPrefabs[resourceTypeIndx];
}
else
{
a.OreType = "";
}
}
public int GetSeed()
{
int sceneInt = GetIntFromString(SceneManager.GetActiveScene().name);
int posInt = Mathf.RoundToInt(transform.position.x + transform.position.y + transform.position.z);
return sceneInt + posInt;
}
public int GetIntFromString(string s)
{
int cumulative = 0;
for (int i = 0; i < s.Length; i++)
{
char c = s[i];
cumulative += (int)c;
}
return cumulative;
}
void OnDrawGizmos()
{
if (GizmosOn)
{
Gizmos.matrix = transform.localToWorldMatrix;
Gizmos.color = Color.white;
Gizmos.DrawWireCube(new Vector3(0f, 0f, 0f), Extents);
}
}
}
////////////////////////////////////////////////////////////
//
//
// SEPARATE EDITOR SCRIPT
//
//
////////////////////////////////////////////////////////////
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(AsteroidFieldGenerator))]
public class AsteroidFieldGeneratorEditor : Editor
{
public override void OnInspectorGUI()
{
DrawDefaultInspector();
AsteroidFieldGenerator script = (AsteroidFieldGenerator)target;
if (GUILayout.Button("Generate field"))
{
script.EDITOR_GenerateAsteroidField();
}
if (GUILayout.Button("Destroy field"))
{
script.EDITOR_DestroyExistingField();
}
}
}