Added overlay to view nutrient mapping

This commit is contained in:
2025-08-06 22:08:15 -07:00
parent 3a909fda70
commit a30cbca5c9
9 changed files with 496 additions and 223 deletions
@@ -1,10 +1,14 @@
using UnityEditor.TextCore.Text;
using UnityEngine;
using static UnityEngine.GraphicsBuffer;
using static UnityEngine.UIElements.UxmlAttributeDescription;
public class NutrientController : MonoBehaviour
{
private float[,] nutrientMap;
[SerializeField, Range(10, 100)] int sizeX;
[SerializeField, Range(10, 100)] int sizeY;
[SerializeField] MeshRenderer meshRenderer;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
@@ -40,4 +44,63 @@ public class NutrientController : MonoBehaviour
nutrientMap[locX, locY] -= used;
}
public void AddNutrients(float x, float y, float added)
{
int locX = Mathf.FloorToInt(x * sizeX);
int locY = Mathf.FloorToInt(y * sizeY);
nutrientMap[locX, locY] += added;
}
private void Render()
{
Texture2D texture = new Texture2D(sizeX, sizeY);
for (int r = 0; r < sizeX; r++)
{
for (int c = 0; c < sizeY; c++)
{
float colorValue = nutrientMap[r, c];
texture.SetPixel(r, c, new Color(colorValue, colorValue, colorValue));
}
}
texture.Apply();
meshRenderer.material.mainTexture = texture;
}
private void ConsoleDump()
{
string toPrint = "\n";
for (int r = 0; r < sizeX; r++)
{
for (int c = 0; c < sizeY; c++)
{
toPrint += nutrientMap[r, c] + " ";
}
toPrint += "\n";
}
Debug.Log(toPrint);
}
#if UNITY_EDITOR
[UnityEditor.CustomEditor(typeof(NutrientController))]
public class NutrientControllerEditor: UnityEditor.Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
if (GUILayout.Button("Sample Button"))
{
(target as NutrientController).Render();
}
if(GUILayout.Button("Dump it"))
{
(target as NutrientController).ConsoleDump();
}
}
}
#endif
}
+12 -6
View File
@@ -7,6 +7,7 @@ public class Plant : MonoBehaviour
private float healthCurrent;
private float nutrientNeed;
private float growthRate;
private float nutrientsConsumed;
public bool isAlive;
private GameObject visualPrefab;
@@ -29,6 +30,7 @@ public class Plant : MonoBehaviour
{
visual = Instantiate(visualPrefab, transform);
healthCurrent = healthMax;
nutrientsConsumed = 0;
isAlive = true;
}
@@ -37,22 +39,26 @@ public class Plant : MonoBehaviour
{
Terrain terrain = Core.instance.ground;
NutrientController nutrientCont = Core.instance.nutrientCont;
float x = transform.position.x / terrain.terrainData.size.x;
float y = transform.position.y / terrain.terrainData.size.y;
float nutrientsAvailable = nutrientCont.GetNutrients(x, y);
if(nutrientNeed > nutrientsAvailable)
float x = transform.position.x / terrain.terrainData.size.x;
float y = transform.position.z / terrain.terrainData.size.z;
float nutrientsAvailable = nutrientCont.GetNutrients(x, y);
float nutrientsNeededFrame = (nutrientNeed * Time.deltaTime);
if (nutrientsNeededFrame > nutrientsAvailable)
{
healthCurrent -= Time.deltaTime * (0.1f * healthMax);
healthCurrent -= Time.deltaTime * 0.1f * healthMax;
}
else
{
visual.transform.localScale += visual.transform.localScale * (growthRate * Time.deltaTime);
nutrientCont.UseNutrients(x, y, (nutrientNeed * Time.deltaTime));
nutrientCont.UseNutrients(x, y, nutrientsNeededFrame);
nutrientsConsumed += nutrientsNeededFrame;
}
if (healthCurrent <= 0)
{
nutrientCont.AddNutrients(x, y, (nutrientsConsumed * 0.9f));
isAlive = false;
}
}
+3 -2
View File
@@ -17,11 +17,12 @@ public class PlantController : MonoBehaviour
Terrain terrain = Core.instance.ground;
xBound = terrain.GetComponent<Terrain>().terrainData.size.x;
zBound = terrain.GetComponent<Terrain>().terrainData.size.z;
for (int i = 0; i < 100; i++)
{
GameObject newPlant = Instantiate(plantPrefab, transform);
GameObject newPlant = Instantiate(plantPrefab);
newPlant.GetComponent<Plant>().SetVisual(plantModels[Random.Range(0, plantModels.Count - 1)]);
newPlant.GetComponent<Plant>().SetValues(Random.Range(10f, 100f), Random.Range(0f, 0.5f), Random.Range(0f, 0.5f));
newPlant.GetComponent<Plant>().SetValues(Random.Range(10f, 100f), Random.Range(0.1f, 0.2f), Random.Range(0.1f, 0.25f));
float x = Random.Range(0, xBound);
float z = Random.Range(0, zBound);
float y = terrain.SampleHeight(new Vector3(x, 0, z));