LifeSimulator

make a GameManager empty object and throw this script in it
mail@pastecode.io avatar
unknown
csharp
13 days ago
14 kB
31
Indexable
Never
using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;

public class LifeSimulator : MonoBehaviour
{
    [System.Serializable]
    private class Character
    {
        public int Age;
        public float Health;
        public float Relationships;
        public float Career;
        public float Happiness;

        public Character()
        {
            Age = 0;
            Health = Relationships = Career = Happiness = 100f;
        }
    }

    [Header("Game Settings")]
    [SerializeField] private float dayLength = 5f;
    [SerializeField] private int maxAge = 100;

    [Header("Prefabs")]
    [SerializeField] private GameObject housePrefab;
    [SerializeField] private GameObject treePrefab;

    [Header("UI References")]
    [SerializeField] private Text healthText;
    [SerializeField] private Text relationshipsText;
    [SerializeField] private Text careerText;
    [SerializeField] private Text ageText;
    [SerializeField] private Text happinessText;
    [SerializeField] private Text eventText;
    [SerializeField] private Button exerciseButton;
    [SerializeField] private Button socializeButton;
    [SerializeField] private Button workButton;
    [SerializeField] private Button relaxButton;
    [SerializeField] private Image backgroundImage;

    private Character player;
    private List<GameObject> visualElements = new List<GameObject>();
    private float currentTime = 0f;
    private ParticleSystem weatherSystem;

    private void Start()
    {
        player = new Character();
        SetupUI();
        GenerateEnvironment();
        SetupWeatherSystem();
    }

    private void Update()
    {
        if (player == null) return;

        currentTime += Time.deltaTime;
        if (currentTime >= dayLength)
        {
            ProcessDay();
            currentTime = 0f;
        }

        UpdateVisuals();
        UpdateUI();
        UpdateWeather();
    }

    private void SetupUI()
    {
        Canvas canvas = FindObjectOfType<Canvas>();
        if (canvas == null)
        {
            GameObject canvasObj = new GameObject("Canvas");
            canvas = canvasObj.AddComponent<Canvas>();
            canvas.renderMode = RenderMode.ScreenSpaceOverlay;
            canvasObj.AddComponent<CanvasScaler>();
            canvasObj.AddComponent<GraphicRaycaster>();
        }

        if (backgroundImage == null)
        {
            GameObject bgObj = new GameObject("Background");
            bgObj.transform.SetParent(canvas.transform, false);
            backgroundImage = bgObj.AddComponent<Image>();
            backgroundImage.color = new Color(0.8f, 0.9f, 1f, 1f);
            RectTransform bgRect = backgroundImage.rectTransform;
            bgRect.anchorMin = Vector2.zero;
            bgRect.anchorMax = Vector2.one;
            bgRect.sizeDelta = Vector2.zero;
        }

        healthText = CreateText(canvas.gameObject, "Health: 100", new Vector2(10, -30));
        relationshipsText = CreateText(canvas.gameObject, "Relationships: 100", new Vector2(10, -60));
        careerText = CreateText(canvas.gameObject, "Career: 100", new Vector2(10, -90));
        ageText = CreateText(canvas.gameObject, "Age: 0", new Vector2(10, -120));
        happinessText = CreateText(canvas.gameObject, "Happiness: 100", new Vector2(10, -150));
        eventText = CreateText(canvas.gameObject, "", new Vector2(0, -30));
        if (eventText != null) eventText.alignment = TextAnchor.UpperCenter;

        exerciseButton = CreateButton(canvas.gameObject, "Exercise", new Vector2(-100, 70), () => PlayerChoice("exercise"));
        socializeButton = CreateButton(canvas.gameObject, "Socialize", new Vector2(-100, 130), () => PlayerChoice("socialize"));
        workButton = CreateButton(canvas.gameObject, "Work", new Vector2(-100, 190), () => PlayerChoice("work"));
        relaxButton = CreateButton(canvas.gameObject, "Relax", new Vector2(-100, 250), () => PlayerChoice("relax"));
    }

    private Text CreateText(GameObject parent, string txt, Vector2 position)
    {
        GameObject textObj = new GameObject("Text");
        textObj.transform.SetParent(parent.transform, false);

        Text text = textObj.AddComponent<Text>();
        text.font = Resources.GetBuiltinResource<Font>("LegacyRuntime.ttf");
        text.text = txt;
        text.fontSize = 24;
        text.color = Color.black;

        RectTransform rectTransform = text.GetComponent<RectTransform>();
        rectTransform.anchorMin = new Vector2(0, 1);
        rectTransform.anchorMax = new Vector2(0, 1);
        rectTransform.anchoredPosition = position;
        rectTransform.sizeDelta = new Vector2(200, 30);

        return text;
    }

    private Button CreateButton(GameObject parent, string txt, Vector2 position, UnityEngine.Events.UnityAction action)
    {
        GameObject buttonObj = new GameObject("Button");
        buttonObj.transform.SetParent(parent.transform, false);

        Image image = buttonObj.AddComponent<Image>();
        image.color = new Color(0.8f, 0.8f, 0.8f);

        Button button = buttonObj.AddComponent<Button>();
        button.onClick.AddListener(action);

        Text text = CreateText(buttonObj, txt, Vector2.zero);
        text.alignment = TextAnchor.MiddleCenter;
        text.color = Color.black;

        RectTransform rectTransform = buttonObj.GetComponent<RectTransform>();
        rectTransform.anchorMin = new Vector2(1, 0);
        rectTransform.anchorMax = new Vector2(1, 0);
        rectTransform.anchoredPosition = position;
        rectTransform.sizeDelta = new Vector2(160, 40);

        return button;
    }

    private void PlayerChoice(string choice)
    {
        switch (choice)
        {
            case "exercise":
                ModifyStat(ref player.Health, 5, 15);
                ModifyStat(ref player.Happiness, 1, 5);
                UpdateEventText("You exercised and gained health!");
                break;
            case "socialize":
                ModifyStat(ref player.Relationships, 5, 15);
                ModifyStat(ref player.Happiness, 3, 8);
                UpdateEventText("You socialized and improved relationships!");
                break;
            case "work":
                ModifyStat(ref player.Career, 5, 15);
                ModifyStat(ref player.Happiness, -5, -1);
                UpdateEventText("You worked hard and advanced your career!");
                break;
            case "relax":
                ModifyStat(ref player.Happiness, 5, 15);
                ModifyStat(ref player.Health, 1, 5);
                UpdateEventText("You relaxed and improved your happiness!");
                break;
        }
    }

    private void ModifyStat(ref float stat, int min, int max)
    {
        stat = Mathf.Clamp(stat + Random.Range(min, max + 1), 0, 100);
    }

    private void UpdateEventText(string message)
    {
        if (eventText != null) eventText.text = message;
    }

    private void ProcessDay()
    {
        player.Age++;
        ModifyStat(ref player.Health, -3, 0);
        ModifyStat(ref player.Relationships, -2, 0);
        ModifyStat(ref player.Career, -2, 0);
        ModifyStat(ref player.Happiness, -3, 0);

        if (Random.value < 0.2f)
        {
            int eventType = Random.Range(0, 4);
            string[] events = { "Health", "Relationship", "Career", "Happiness" };
            ModifyStat(ref player.Health, eventType == 0 ? 5 : 0, eventType == 0 ? 15 : 0);
            ModifyStat(ref player.Relationships, eventType == 1 ? 5 : 0, eventType == 1 ? 15 : 0);
            ModifyStat(ref player.Career, eventType == 2 ? 5 : 0, eventType == 2 ? 15 : 0);
            ModifyStat(ref player.Happiness, eventType == 3 ? 5 : 0, eventType == 3 ? 15 : 0);
            UpdateEventText($"{events[eventType]} boost event!");
        }

        CheckGameOver();
    }

    private void CheckGameOver()
    {
        if (player.Health <= 0 || player.Relationships <= 0 || player.Career <= 0 || player.Happiness <= 0 || player.Age >= maxAge)
        {
            UpdateEventText($"Game Over! You lived for {player.Age} days.");
            SetButtonsInteractable(false);
        }
    }

    private void SetButtonsInteractable(bool interactable)
    {
        if (exerciseButton != null) exerciseButton.interactable = interactable;
        if (socializeButton != null) socializeButton.interactable = interactable;
        if (workButton != null) workButton.interactable = interactable;
        if (relaxButton != null) relaxButton.interactable = interactable;
    }

    private void GenerateEnvironment()
    {
        visualElements.Add(CreateHouse());
        for (int i = 0; i < 5; i++)
        {
            visualElements.Add(CreateTree(Random.insideUnitSphere * 10));
        }
        SetupCamera();
    }

    private GameObject CreateHouse()
    {
        if (housePrefab != null)
        {
            return Instantiate(housePrefab, Vector3.zero, Quaternion.identity);
        }
        else
        {
            Debug.LogWarning("House prefab is missing. Using default cube.");
            GameObject house = GameObject.CreatePrimitive(PrimitiveType.Cube);
            house.transform.position = new Vector3(0, 0.5f, 0);
            house.transform.localScale = new Vector3(2, 1, 2);
            return house;
        }
    }

    private GameObject CreateTree(Vector3 position)
    {
        position.y = 0;
        if (treePrefab != null)
        {
            return Instantiate(treePrefab, position, Quaternion.identity);
        }
        else
        {
            Debug.LogWarning("Tree prefab is missing. Using default tree.");
            GameObject tree = new GameObject("Tree");
            tree.transform.position = position;

            GameObject trunk = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
            trunk.transform.SetParent(tree.transform);
            trunk.transform.localScale = new Vector3(0.5f, 2f, 0.5f);

            GameObject leaves = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            leaves.transform.SetParent(tree.transform);
            leaves.transform.localPosition = new Vector3(0, 1.5f, 0);
            leaves.transform.localScale = new Vector3(2f, 2f, 2f);

            return tree;
        }
    }

    private void SetupCamera()
    {
        if (Camera.main != null)
        {
            Camera.main.transform.position = new Vector3(0, 10, -10);
            Camera.main.transform.LookAt(Vector3.zero);
        }
    }

    private void SetupWeatherSystem()
    {
        GameObject weatherObj = new GameObject("WeatherSystem");
        weatherSystem = weatherObj.AddComponent<ParticleSystem>();
        var main = weatherSystem.main;
        main.startLifetime = 5f;
        main.startSpeed = 1f;
        main.startSize = 0.1f;
        main.maxParticles = 1000;

        var emission = weatherSystem.emission;
        emission.rateOverTime = 100;

        var shape = weatherSystem.shape;
        shape.shapeType = ParticleSystemShapeType.Box;
        shape.scale = new Vector3(20, 1, 20);

        weatherObj.transform.position = new Vector3(0, 15, 0);
    }

    private void UpdateVisuals()
    {
        float wellbeing = (player.Health + player.Relationships + player.Career + player.Happiness) / 400f;
        
        if (visualElements.Count > 0 && visualElements[0] != null)
        {
            Renderer houseRenderer = visualElements[0].GetComponent<Renderer>();
            if (houseRenderer != null)
            {
                houseRenderer.material.color = Color.Lerp(Color.red, Color.green, wellbeing);
            }
        }

        for (int i = 1; i < visualElements.Count; i++)
        {
            if (visualElements[i] != null)
            {
                Renderer[] renderers = visualElements[i].GetComponentsInChildren<Renderer>();
                foreach (Renderer r in renderers)
                {
                    if (r != null)
                    {
                        r.material.color = Color.Lerp(Color.white, Color.green, Random.Range(0.5f, 1f));
                    }
                }
            }
        }

        if (backgroundImage != null)
        {
            float timeOfDay = (currentTime / dayLength) % 1f;
            backgroundImage.color = Color.Lerp(new Color(0.8f, 0.9f, 1f), new Color(0.1f, 0.1f, 0.3f), timeOfDay);
        }
    }

    private void UpdateWeather()
    {
        if (weatherSystem != null)
        {
            var main = weatherSystem.main;
            main.startColor = Color.Lerp(Color.clear, Color.white, Mathf.PingPong(Time.time * 0.1f, 1f));
        }
    }

    private void UpdateUI()
    {
        if (healthText != null) healthText.text = $"Health: {Mathf.Round(player.Health)}";
        if (relationshipsText != null) relationshipsText.text = $"Relationships: {Mathf.Round(player.Relationships)}";
        if (careerText != null) careerText.text = $"Career: {Mathf.Round(player.Career)}";
        if (ageText != null) ageText.text = $"Age: {player.Age}";
        if (happinessText != null) happinessText.text = $"Happiness: {Mathf.Round(player.Happiness)}";
    }
}
Leave a Comment