public void Initialize(float maxLength, float width, Vector3 rotation, float growthSpeed, Color colour, bool instantGrowth) { lineRenderer = GetComponent <LineRenderer>(); lineRenderer.startColor = colour; lineRenderer.endColor = colour; lineRenderer.startWidth = width; lineRenderer.endWidth = width; grown = false; currLength = 0; this.maxLength = maxLength; this.width = width; this.rotation = rotation; collider.transform.eulerAngles = rotation; this.growthSpeed = growthSpeed; worldEndPos = PlantGenerator.RotatePointAroundPivot(transform.position + Vector3.up * maxLength, transform.position, rotation); if (instantGrowth) { lineRenderer.enabled = true; lineRenderer.SetPositions(new Vector3[] { transform.position, worldEndPos }); collider.enabled = true; // Place collider in centre of branch and with proper length collider.transform.localPosition = worldEndPos - transform.position; collider.size = new Vector2(Mathf.Max(width, 0.01f), maxLength); grown = true; } else { collider.size = new Vector2(Mathf.Max(width, 0.01f), 0); lineRenderer.SetPositions(new Vector3[] { transform.position, transform.position }); } }
public Segment(Node node, PlantGenerator plantGenerator) { this.nodes = new List <Node>(); nodes.Add(node); segMesh = new Mesh(); this.plantGenerator = plantGenerator; }
/// <summary> /// OnGeneratorStart calculate the positions of the terrain tops based on the terraingenerator settings /// </summary> /// <param name="plantGenerator"></param> public override void OnGeneratorStart(PlantGenerator plantGenerator) { terrainGenerator = plantGenerator.gameObject.GetComponent <TerrainGenerator>(); possibleXValues = new List <float>(); //float period = sinePeriod * x; //float sine = (sin(period) * halfSineAmplitude) + halfSineAmplitude; period = (Mathf.PI * 2f) / terrainGenerator.sinPeriod; Vector3 fieldCenter = plantGenerator.gameObject.transform.position; float halfWidth = terrainGenerator.terrainWidth / 2f; float minOffset = Mathf.Repeat(halfWidth - (period * 0.75f), period); float minXValue = (fieldCenter.x - terrainGenerator.terrainWidth / 2) + minOffset; float maxXValue = (fieldCenter.x + terrainGenerator.terrainWidth / 2); string log = ""; for (float i = minXValue; i <= maxXValue; i += period) { possibleXValues.Add(i); log += " " + i.ToString(); } Debug.Log(log); }
void Awake() { AddRule('X', "F-[[X]+X]+F[+FX]-X"); AddRule('X', "F+[[X]-X]-F[-FX]+X"); AddRule('F', "FF"); generator = GetComponent <PlantGenerator>(); }
public override void OnInspectorGUI() { PlantGenerator plantGenerator = (PlantGenerator)target; serializedObject.Update(); EditorGUILayout.PropertyField(_plantSpawnSettings); foreach (PlantSpawnSettings spawnSetting in plantGenerator.plantSpawnSettings) { AbstractPlacementStrategy placementStrategy; if (spawnSetting.placementStrategy.GetClass().IsSubclassOf(typeof(AbstractPlacementStrategy))) { placementStrategy = Activator.CreateInstance(spawnSetting.placementStrategy.GetClass()) as AbstractPlacementStrategy; } else { throw new Exception($"[PlantGenerator] The Random Placement script on plant #{plantGenerator.plantSpawnSettings.IndexOf(spawnSetting)} does not extend from AbstractPlacementStrategy!"); } placementStrategy.OnInspectorGUI(plantGenerator); } //EditorGUILayout.PropertyField(_xMinVal, new GUIContent("Minimum X bound")); //EditorGUILayout.PropertyField(_xMaxVal, new GUIContent("Maximum X bound")); //EditorGUILayout.PropertyField(_zMinVal, new GUIContent("Minimum Z bound")); //EditorGUILayout.PropertyField(_zMaxVal, new GUIContent("Maximum Z bound")); //EditorGUILayout.PropertyField(_amountOfPlantsToSpawn, new GUIContent("Amount of plants to spawn")); serializedObject.ApplyModifiedProperties(); }
void Start() { pg = PlantGenerator.Instance; cg = CreatureGenerator.Instance; Camera.main.orthographicSize = (float)height / 2; back.transform.localScale = new Vector3(width, height, 0f); }
// Renders any editable points in the plant generator void OnSceneGUI() { PlantGenerator generator = target as PlantGenerator; for (int i = 0; i < generator.editablePoints.Length; i++) { // Render each piont with a purple handle Handles.color = new Color(1.0f, 0.0f, 1.0f, 0.1f); generator.editablePoints[i] = generator.transform.InverseTransformPoint(Handles.DoPositionHandle(generator.transform.TransformPoint(generator.editablePoints[i]), Quaternion.identity)); } }
public Bud(Vector3 pos, Vector3 dir, int age, int order, PlantGenerator plantGenerator) { this.pos = pos; this.direction = dir; this.die_prob = plantGenerator.dieProbability; this.pause_prob = plantGenerator.pauseProbability; this.age = age; this.order = order; this.isDead = false; this.plantGenerator = plantGenerator; }
/// <summary> /// Inspector spot for a maxRowOffset where a plant can be a little offset on a row top. /// TODO: fix the variable storage problem here /// </summary> /// <param name="plantGenerator"></param> public override void OnInspectorGUI(PlantGenerator plantGenerator) { //float maxRowOffset = plantGenerator.getVarFromPlacementVarStorage<float>("maxRowOffset"); //float offset = EditorGUILayout.FloatField(new GUIContent("Maximum offset"), maxRowOffset); //if (offset != maxRowOffset) //{ // plantGenerator.placementStrategyVars["maxRowOffset"] = offset; //} }
/// <summary> /// Randomizes position of a plant on the targeted chunk. /// </summary> /// <param name="plantGenerator"></param> /// <param name="chunk"></param> /// <param name="xmin"></param> /// <param name="xmax"></param> /// <param name="zmin"></param> /// <param name="zmax"></param> /// <returns>Vector3 with randomized position</returns> public override Vector3 RandomizePosition(PlantGenerator plantGenerator, TerrainChunk chunk, float xmin, float xmax, float zmin, float zmax) { float randomXOffset = Random.Range(xmin, xmax); float randomZOffset = Random.Range(zmin, zmax); Vector3 position = new Vector3(randomXOffset, plantGenerator.transform.position.y, randomZOffset); Vector2 mappedPlantPosition = new Vector2(position.x, position.z); position.y = chunk.GetHeightFromPosition(mappedPlantPosition); return(position); }
public override Vector3 RandomizePosition(PlantGenerator plantGenerator, TerrainChunk chunk, float xmin, float xmax, float zmin, float zmax) { List <float> possibleXValuesForThisChunk = possibleXValues.Where(x => x >= (chunk.gridXPos - chunk.size.x / 2f) && x <= (chunk.gridXPos + chunk.size.x / 2f)).ToList(); int randomRowIndex = Random.Range(0, possibleXValuesForThisChunk.Count); float randomZOffset = Random.Range(zmin, zmax); Vector3 position = new Vector3(possibleXValuesForThisChunk[randomRowIndex], plantGenerator.transform.position.y, randomZOffset); Vector2 mappedPlantPosition = new Vector2(position.x, position.z); position.y = chunk.GetHeightFromPosition(mappedPlantPosition); return(position); }
void Start() { pg = GameObject.FindWithTag("Logic").GetComponent <PlantGenerator>(); ui = GameObject.FindWithTag("Logic").GetComponent <myUI>(); timer = Time.time; lastTime = timer; nextTime = Random.Range(pg.minNextTime, pg.maxNextTime); int s = Mathf.RoundToInt(pg.initSize); if (s < pg.maxSize) { size = s; } else { size = pg.maxSize; } }
void Start() { ui = myUI.Instance; pg = PlantGenerator.Instance; txt = GetComponent <Text>(); }
/// <summary> /// Gets called after all plants have been generated. /// </summary> /// <param name="plantGenerator"></param> public abstract void OnGeneratorFinish(PlantGenerator plantGenerator);
/// <summary> /// Exposed Inspector GUI capability /// </summary> /// <param name="plantGenerator"></param> public abstract void OnInspectorGUI(PlantGenerator plantGenerator);
/// <summary> /// Gets called before plants are gnerated. /// </summary> /// <param name="plantGenerator"></param> public abstract void OnGeneratorStart(PlantGenerator plantGenerator);
/// <summary> /// Gets called for each plant to randomize their position based on this current placement strategy. /// </summary> /// <param name="plantGenerator"></param> /// <param name="chunk"></param> /// <param name="xmin"></param> /// <param name="xmax"></param> /// <param name="zmin"></param> /// <param name="zmax"></param> /// <returns></returns> public abstract Vector3 RandomizePosition(PlantGenerator plantGenerator, TerrainChunk chunk, float xmin, float xmax, float zmin, float zmax);
public override void OnInspectorGUI(PlantGenerator plantGenerator) { }
public override void OnGeneratorFinish(PlantGenerator plantGenerator) { }
/// <summary> /// OnGeneratorFinish reset the positions that plants can be placed on /// </summary> /// <param name="plantGenerator"></param> public override void OnGeneratorFinish(PlantGenerator plantGenerator) { possibleXValues = null; }
public override void OnGeneratorStart(PlantGenerator plantGenerator) { }
public override void OnInspectorGUI() { serializedObject.Update(); TerrainUtility terrainUtility = (TerrainUtility)target; TerrainGenerator terrainGenerator = terrainUtility.GetComponent <TerrainGenerator>(); PlantGenerator plantGenerator = terrainUtility.GetComponent <PlantGenerator>(); //Terrain GUILayout.Label("Terrain generation"); terrainGenerator.terrainWidth = EditorGUILayout.FloatField(new GUIContent("Terrain size X"), terrainGenerator.terrainWidth); plantGenerator.xMinVal = -(terrainGenerator.terrainWidth / 2); plantGenerator.xMaxVal = terrainGenerator.terrainWidth / 2; plantGenerator.zMinVal = -(terrainGenerator.terrainLength / 2); plantGenerator.zMaxVal = terrainGenerator.terrainLength / 2; terrainGenerator.terrainLength = EditorGUILayout.FloatField(new GUIContent("Terrain size Z"), terrainGenerator.terrainLength); EditorGUILayout.PropertyField(_chunksPerFrame); GUILayout.BeginHorizontal(); if (GUILayout.Button("Create terrain")) { TerrainGenerator.instance = terrainGenerator; terrainGenerator.buildTerrain(_chunksPerFrame.intValue); } if (GUILayout.Button("Delete terrain")) { TerrainGenerator.instance = terrainGenerator; terrainGenerator.deleteTerrain(); EditorSceneManager.MarkAllScenesDirty(); System.GC.Collect(); Resources.UnloadUnusedAssets(); } GUILayout.EndHorizontal(); //Plants GUILayout.Label("Plant generation"); EditorGUILayout.PropertyField(_plantsPerUnit); plantsToSpawn = (int)Math.Round(_plantsPerUnit.floatValue * terrainGenerator.terrainLength * terrainGenerator.terrainWidth); GUILayout.Label($"This will spawn {plantsToSpawn} plants"); plantGenerator.amountOfPlantsToSpawn = plantsToSpawn; EditorGUILayout.PropertyField(_plantsPerFrame); GUILayout.BeginHorizontal(); if (GUILayout.Button("Generate plants")) { //Old logic -> //plantGenerator.StartCoroutine(plantGenerator.spawnPlantsInXZRange()); //New logic -> plantGenerator.StartCoroutine(plantGenerator.SpawnPlantsOnChunks(terrainGenerator, _plantsPerFrame.intValue)); } if (GUILayout.Button("Delete plants")) { plantGenerator.deleteAllPlants(terrainGenerator); EditorSceneManager.MarkAllScenesDirty(); System.GC.Collect(); Resources.UnloadUnusedAssets(); } GUILayout.EndHorizontal(); serializedObject.ApplyModifiedProperties(); }
override public void OnInspectorGUI() { PlantGenerator generator = target as PlantGenerator; base.OnInspectorGUI(); }
private void Awake() { instance = this; }