From 1d6af4c6cd5bb81a50f91ed0654fd24e6fc8cece Mon Sep 17 00:00:00 2001 From: teascade Date: Mon, 20 Apr 2020 02:19:22 +0300 Subject: [PATCH] Make lorax --- Assets/Prefabs/Environment/Lorax.prefab | 29 ++++++++ Assets/Scripts/Lorax.cs | 87 ++++++++++++++++++++++++ Assets/Scripts/Lorax.cs.meta | 11 +++ Assets/Terrains/Forest Terrain.asset | Bin 1975556 -> 1975556 bytes 4 files changed, 127 insertions(+) create mode 100644 Assets/Scripts/Lorax.cs create mode 100644 Assets/Scripts/Lorax.cs.meta diff --git a/Assets/Prefabs/Environment/Lorax.prefab b/Assets/Prefabs/Environment/Lorax.prefab index 97dcce6..0d7bd5c 100644 --- a/Assets/Prefabs/Environment/Lorax.prefab +++ b/Assets/Prefabs/Environment/Lorax.prefab @@ -9,6 +9,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 6166170817692975782} + - component: {fileID: 5133887194504435357} m_Layer: 0 m_Name: Lorax m_TagString: Untagged @@ -30,3 +31,31 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &5133887194504435357 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6166170817692975783} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8df7bcbf7138e33448643b71967f880c, type: 3} + m_Name: + m_EditorClassIdentifier: + Terrain: {fileID: 0} + Seed: 2 + Regen: 0 + SpawnableTrees: + - {fileID: 3828898392337730748, guid: b6ff003e05b42fb4e9319ea8bb82d882, type: 3} + - {fileID: 6700814859666117554, guid: 410d196d969ed404a883c67749ad3170, type: 3} + - {fileID: 2469457951508719009, guid: 46e8ab3179fc53841920eb9ab6986b24, type: 3} + Chances: 02000000070000000e000000 + HeightMin: 7.5 + HeightMax: 9 + TreeChance: 0.9 + CampSize: 8 + CampMiddle: {x: -1, y: 0, z: -1} + RandomNudge: 3 + Denseness: 3 + MinimumAdjacency: 3 diff --git a/Assets/Scripts/Lorax.cs b/Assets/Scripts/Lorax.cs new file mode 100644 index 0000000..aff29ac --- /dev/null +++ b/Assets/Scripts/Lorax.cs @@ -0,0 +1,87 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +[ExecuteAlways] +public class Lorax : MonoBehaviour { + + public Terrain Terrain; + + [Header("Generic Gen")] + public int Seed; + public bool Regen = false; + public List SpawnableTrees; + public List Chances; + + [Header("Generation Details")] + public float HeightMin = 7.5f; + public float HeightMax = 9; + public float TreeChance = 0.9f; + public float CampSize = 10f; + public Vector3 CampMiddle; + public float RandomNudge = 2f; + public float Denseness = 4; + public float MinimumAdjacency = 1.5f; + + private int LastSeed = -1; + private Vector3[][] TreePositions; + + void Start() { + + } + + void Update() { + if (Application.isEditor) { + if (LastSeed == Seed && !Regen) { + return; + } + Regen = false; + LastSeed = Seed; + Random.InitState(Seed); + for (int x = transform.childCount - 1; x >= 0; x--) { + DestroyImmediate(transform.GetChild(0).gameObject); + } + int cap = (int)Mathf.Floor(500 / Denseness); + int[] TotalChances = new int[SpawnableTrees.Count + 1]; + int Counter = 0; + for (int x = 0; x < TotalChances.Length - 1; x++) { + TotalChances[x + 1] = Counter + Chances[x]; + Counter = TotalChances[x + 1]; + } + TreePositions = new Vector3[cap][]; + for (int y = 0; y < cap; y++) { + TreePositions[y] = new Vector3[cap]; + for (int x = 0; x < cap; x++) { + if (Random.value > TreeChance) { + continue; + } + var pos = new Vector3(x * Denseness - 250 + Random.value * RandomNudge - RandomNudge / 2, 0, y * Denseness - 250 + Random.value * RandomNudge - RandomNudge / 2); + TreePositions[y][x] = pos; + if (x > 0 && (TreePositions[y][x - 1] - pos).magnitude < MinimumAdjacency) { + continue; + } + if (y > 0 && (TreePositions[y - 1][x] - pos).magnitude < MinimumAdjacency) { + continue; + } + if ((pos - CampMiddle).magnitude < CampSize) { + continue; + } + + var height = Terrain.SampleHeight(pos); + if (height >= HeightMin && height <= HeightMax) { + pos.y = Terrain.transform.position.y + height; + var rand = Random.Range(0, TotalChances[TotalChances.Length - 1]); + var Chosen = SpawnableTrees[0]; + for (int curr = TotalChances.Length - 2; curr > 0; curr--) { + if (rand > TotalChances[curr]) { + Chosen = SpawnableTrees[curr]; + break; + } + } + var obj = GameObject.Instantiate(Chosen, pos, new Quaternion(), gameObject.transform); + } + } + } + } + } +} diff --git a/Assets/Scripts/Lorax.cs.meta b/Assets/Scripts/Lorax.cs.meta new file mode 100644 index 0000000..1c14c1d --- /dev/null +++ b/Assets/Scripts/Lorax.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8df7bcbf7138e33448643b71967f880c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Terrains/Forest Terrain.asset b/Assets/Terrains/Forest Terrain.asset index 33d1d8196ccc024b710fb9f5788bca93d5887f2a..d33efcbaa6226d4f64ec24293e8124f6f9f8fde6 100644 GIT binary patch delta 8467 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 delta 8467 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 y0kHK-_`!1mXe26G$(4!KL2gjsF8ziw^Ao