Artifacts Gallery Guilds Search Wiki Login Register

Welcome, Guest. Please login or register. - Thinking of joining?
Autumn, 18 Sep 2026 - @124.31
Forum Activity: Four Stars Random | Recent Posts | Guild Recents
News: :seal: Thank you for today! :seal: Guild Events: Prepare for Halloween Reminder!

+  MelonLand Forum
|-+  Da Web Revival
| |-+  ✁ ∙ Web Crafting
| | |-+  ☔︎ ∙ I need Help!
| | | |-+  HELP: Unity/C# Random Weather Script


« previous next »
Pages: [1] Print Embed
Author Topic: HELP: Unity/C# Random Weather Script  (Read 3718 times)
cinni
Sr. Member ⚓︎
****
View Profile WWW


believe in your dreams <3
⛺︎ My Room
SpaceHey: Friend Me!
StatusCafe: cinni

Artifacts:
First 1000 Members!OG! Joined 2021!
« on: Spring, 17 May 2022 @770 beats » Embed

hello meloners,

maybe someone can help me out with a script i made :X i wanted to create randomized weather and i'm using this day & night script (below) as a starting point to determine when a day has gone by. I want it to rain on a random day, but right now it just rains every other day. I wasn't able to figure out how to successfully randomize it on my own, so if anyone could chime in i would appreciate it !! :4u:

my weather script:
Code
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Weather : MonoBehaviour
{
  public GameObject particles;
  public DayAndNightControl time;
  int currentDay = 0;
  public int chanceRain;
  public int date;
  public int randomWeather;
  [Range(0, 1)]
  public float timeFloat;

  private void Update()
  {
    time = GameObject.FindObjectOfType<:grin:ayAndNightControl>();
    timeFloat = time.currentTime;
    date = time.currentDay;
    Debug.Log("the day is" + date);

    int chanceRain = Random.Range(1, 2);
    randomWeather = chanceRain * date;

    if (randomWeather%2==1)
    {
      particles.SetActive(true);
    }

    if (randomWeather%2==0)
    {
      particles.SetActive(false);
    }
  }
}


day & night script:
Code
//2016 Spyblood Games

using UnityEngine;
using System.Collections;

[System.Serializable]
public class DayColors
{
	public Color skyColor;
	public Color equatorColor;
	public Color horizonColor;
}

public class DayAndNightControl : MonoBehaviour {
	public bool StartDay; //start game as day time
	public GameObject StarDome;
  public GameObject NightDome;
	public GameObject moonState;
	public GameObject moon;
	public DayColors dawnColors;
	public DayColors dayColors;
	public DayColors nightColors;
	public int currentDay = 0; //day 8287... still stuck in this grass prison... no esacape... no freedom...
	public Light directionalLight; //the directional light in the scene we're going to work with
	public float SecondsInAFullDay = 120f; //in realtime, this is about two minutes by default. (every 1 minute/60 seconds is day in game)
	[Range(0,1)]
	public float currentTime = 0; //at default when you press play, it will be nightTime. (0 = night, 1 = day)
	[HideInInspector]
	public float timeMultiplier = 1f; //how fast the day goes by regardless of the secondsInAFullDay var. lower values will make the days go by longer
, while higher values make it go faster. This may be useful if you're siumulating seasons where daylight and night times are altered.
	public bool showUI;
	float lightIntensity; //static variable to see what the current light's insensity is in the inspector
	Material starMat;
  Material nightMat;

  float timeLeft;
  Color targetColor;

	Camera targetCam;

	// Use this for initialization
	void Start () {
		RenderSettings.ambientMode = UnityEngine.Rendering.AmbientMode.Trilight;
		foreach (Camera c in GameObject.FindObjectsOfType<Camera>())
		{
			if (c.isActiveAndEnabled) {
				targetCam = c;
			}
		}
		lightIntensity = directionalLight.intensity; //what's the current intensity of the light
		starMat = StarDome.GetComponentInChildren<MeshRenderer> ().material;
		if (StartDay) {
			currentTime = 0.3f; //start at morning
			starMat.color = new Color(1f,1f,1f,0f);
		}
    nightMat = NightDome.GetComponentInChildren<MeshRenderer>().material;
    if (StartDay)
    {
      currentTime = 0.3f; //start at morning
      nightMat.color = new Color(1f, 1f, 1f, 0f);
    }
  }
	
	// Update is called once per frame
	void Update () {
		UpdateLight();
		currentTime += (Time.deltaTime / SecondsInAFullDay) * timeMultiplier;
		if (currentTime >= 1) {
			currentTime = 0;//once we hit "midnight"; any time after that sunrise will begin.
			currentDay++; //make the day counter go up
		}
	}

	void UpdateLight()
	{
		StarDome.transform.Rotate (new Vector3 (0, 2f * Time.deltaTime, 0));
		moon.transform.LookAt (targetCam.transform);
		directionalLight.transform.localRotation = Quaternion.Euler ((currentTime * 360f) - 90, 170, 0);
		moonState.transform.localRotation = Quaternion.Euler ((currentTime * 360f) - 100, 170, 0);
		//^^ we rotate the sun 360 degrees around the x axis, or one full rotation times the current time variable. we subtract 90 from this to make it go up
		//in increments of 0.25.

		//the 170 is where the sun will sit on the horizon line. if it were at 180, or completely flat, it would be hard to see. Tweak this value to what you find comfortable.

		float intensityMultiplier = 1;

		if (currentTime <= 0.23f || currentTime >= 0.75f) 
		{
			intensityMultiplier = 0; //when the sun is below the horizon, or setting, the intensity needs to be 0 or else it'll look weird
      starMat.color = new Color(1,1,1,Mathf.Lerp(1,0,Time.deltaTime));
      
    }
		else if (currentTime <= 0.25f) 
		{
     
      intensityMultiplier = Mathf.Clamp01((currentTime - 0.23f) * (1 / 0.02f));
			starMat.color = new Color(1,1,1,Mathf.Lerp(0,1,Time.deltaTime));
      
    }
		else if (currentTime <= 0.73f) 
		{
      
      intensityMultiplier = Mathf.Clamp01(1 - ((currentTime - 0.73f) * (1 / 0.02f)));
    
    }


		//change env colors to add mood

		if (currentTime <= 0.2f) {
			RenderSettings.ambientSkyColor = Color.Lerp(RenderSettings.ambientSkyColor, nightColors.skyColor,Time.deltaTime);
			RenderSettings.ambientEquatorColor = Color.Lerp(RenderSettings.ambientEquatorColor, nightColors.equatorColor, Time.deltaTime);
			RenderSettings.ambientGroundColor = Color.Lerp(RenderSettings.ambientGroundColor, nightColors.horizonColor, Time.deltaTime);
    }
		if (currentTime > 0.2f && currentTime < 0.4f) {
			RenderSettings.ambientSkyColor = Color.Lerp(RenderSettings.ambientSkyColor, dawnColors.skyColor, Time.deltaTime);
			RenderSettings.ambientEquatorColor = Color.Lerp(RenderSettings.ambientEquatorColor, dawnColors.equatorColor, Time.deltaTime);
			RenderSettings.ambientGroundColor = Color.Lerp(RenderSettings.ambientGroundColor, dawnColors.horizonColor, Time.deltaTime);
      
    }
		if (currentTime > 0.4f && currentTime < 0.75f) {
			RenderSettings.ambientSkyColor = Color.Lerp(RenderSettings.ambientSkyColor, dayColors.skyColor, Time.deltaTime);
			RenderSettings.ambientEquatorColor = Color.Lerp(RenderSettings.ambientEquatorColor, dayColors.equatorColor, Time.deltaTime);
			RenderSettings.ambientGroundColor = Color.Lerp(RenderSettings.ambientGroundColor, dayColors.horizonColor, Time.deltaTime);
     
    }
		if (currentTime > 0.75f) {
			RenderSettings.ambientSkyColor = Color.Lerp(RenderSettings.ambientSkyColor, dayColors.skyColor, Time.deltaTime);
			RenderSettings.ambientEquatorColor = Color.Lerp(RenderSettings.ambientEquatorColor, dayColors.equatorColor, Time.deltaTime);
			RenderSettings.ambientGroundColor = Color.Lerp(RenderSettings.ambientGroundColor, dayColors.horizonColor, Time.deltaTime);
      
    }

		directionalLight.intensity = lightIntensity * intensityMultiplier;
	}

	public string TimeOfDay ()
	{
	string dayState = "";
		if (currentTime > 0f && currentTime < 0.1f) {
			dayState = "Midnight";
      if (timeLeft <= Time.deltaTime)
      {
        //nightMat.color = new Color(0.1580634f, 0.1817454f, 0.3018868f, 0.9f);

        // transition complete
        // assign the target color
        nightMat.color = targetColor;

        // start a new transition
        targetColor = new Color(0.1580634f, 0.1817454f, 0.3018868f, 0.9f);
        timeLeft = 1.0f;
      }
      else
      {
        // transition in progress
        // calculate interpolated color
        nightMat.color = Color.Lerp(nightMat.color, targetColor, Time.deltaTime / timeLeft);

        // update the timer
        timeLeft -= Time.deltaTime;
      }
    }
    
		if (currentTime < 0.5f && currentTime > 0.1f)
		{
			dayState = "Morning";
      //nightMat.color = new Color(0.8490566f, 0.6047526f, 0.8155605f, 0.5f);
      if (timeLeft <= Time.deltaTime)
      {

        // transition complete
        // assign the target color
        nightMat.color = targetColor;

        // start a new transition
        targetColor = new Color(0.8490566f, 0.6047526f, 0.8155605f, 0.5f);
        timeLeft = 1.0f;
      }
      else
      {
        // transition in progress
        // calculate interpolated color
        nightMat.color = Color.Lerp(nightMat.color, targetColor, Time.deltaTime / timeLeft);

        // update the timer
        timeLeft -= Time.deltaTime;
      }
    }
		if (currentTime > 0.5f && currentTime < 0.6f)
		{
			dayState = "Mid Noon";
      //nightMat.color = new Color(0.2755005f, 0.2367391f, 0.3773585f, 0f);
      if (timeLeft <= Time.deltaTime)
      {

        // transition complete
        // assign the target color
        nightMat.color = targetColor;

        // start a new transition
        targetColor = new Color(0.2755005f, 0.2367391f, 0.3773585f, 0f);
        timeLeft = 1.0f;
      }
      else
      {
        // transition in progress
        // calculate interpolated color
        nightMat.color = Color.Lerp(nightMat.color, targetColor, Time.deltaTime / timeLeft);

        // update the timer
        timeLeft -= Time.deltaTime;
      }
    }
		if (currentTime > 0.6f && currentTime < 0.8f)
		{
			dayState = "Evening";
      //nightMat.color = new Color(0.6218847f, 0.3571111f, 0.7075472f, 0.5f);
      if (timeLeft <= Time.deltaTime)
      {

        // transition complete
        // assign the target color
        nightMat.color = targetColor;

        // start a new transition
        targetColor = new Color(0.6218847f, 0.3571111f, 0.7075472f, 0.5f);
        timeLeft = 1.0f;
      }
      else
      {
        // transition in progress
        // calculate interpolated color
        nightMat.color = Color.Lerp(nightMat.color, targetColor, Time.deltaTime / timeLeft);

        // update the timer
        timeLeft -= Time.deltaTime;
      }
    }
		if (currentTime > 0.8f && currentTime < 1f)
		{
			dayState = "Night";
      // nightMat.color = new Color(0.2755005f, 0.2367391f, 0.3773585f, 0.8f);
      if (timeLeft <= Time.deltaTime)
      {

        // transition complete
        // assign the target color
        nightMat.color = targetColor;

        // start a new transition
        targetColor = new Color(0.2755005f, 0.2367391f, 0.3773585f, 0.8f);
        timeLeft = 1.0f;
      }
      else
      {
        // transition in progress
        // calculate interpolated color
        nightMat.color = Color.Lerp(nightMat.color, targetColor, Time.deltaTime / timeLeft);

        // update the timer
        timeLeft -= Time.deltaTime;
      }
    }
		return dayState;
	}

	void OnGUI()
	{
		//debug GUI on screen visuals
		if (showUI) {
			GUILayout.Box (":grin:ay: " + currentDay);
			GUILayout.Box (TimeOfDay ());
			GUILayout.Box ("Time slider":wink:;
			GUILayout.VerticalSlider (currentTime, 0f, 1f);
		}
	}
}

« Last Edit: Spring, 17 May 2022 @789 beats by Melooon » Logged

Melooon
Hero Member ⚓︎
*****
View Profile WWWArt


So many stars!
⛺︎ My Room
SpaceHey: Friend Me!
StatusCafe: melon
iMood: Melonking
Itch.io: My Games
RSS: RSS

Guild Memberships:
Artifacts:
You're a Star!Flinstone VitaminWavy Shoulder-Length Hair with BangsBug!Top HatI got robbed by Dan Q on Melonland!
« Reply #1 on: Spring, 17 May 2022 @787 beats » Embed

Heck, that's a lot of code! I didn't read it all and this seems like more of a mathematical question and I'm more of a trial and error kinda programmer BUT I will try and guess:

This is your random code?
Code
int chanceRain = Random.Range(1, 2);
randomWeather = chanceRain * date;

if (randomWeather%2==1)
{
 particles.SetActive(true);
}

if (randomWeather%2==0)
{
 particles.SetActive(false);
}

Sooo random range 1 - 2 will give your a 1 or a 2. Multiplying it by a date (which is an incremental number) means it will always be even or odd and 1 or 2. I suspect that's why its happening (almost) every other day, its a super small range being influenced by a sequential even or odd number, so each time the remainder will go 1 2 1 2 1 2 etc. (That's totally a guess)

Anyway, one solution would be to do wit with percentages instead.
Code
if(A NEW DAY HAS STARTED)
{
 int chanceRain = Random.Range(0, 100);

 if (chanceRain > 50)
 {
  particles.SetActive(true);
 }
 else
 {
  particles.SetActive(false);
 }
}

In this case you have a 50% chance of rain each update, you could change that 50 to another number, or even another random number to make it even more random. That might be waaaayyy too high a chance, but you can mess with the numbers to fix that.. eg Random.Range(0, 99999) or something.

« Last Edit: Spring, 17 May 2022 @812 beats by Melooon » Logged


everything lost will be recovered, when you drift into the arms of the undiscovered

Artifact Swap: black n cyan yappin kittayalien yappin kittayHave a chillpillMove it, football head!black n orange yappin kittayMagic CauldronRed Tulip100 coinsLurby<3eyntivemds pet fishGreen partyhatsnail buddycurious fishPlankMaya's Magatama
Pages: [1] Print Embed 
« previous next »
 

Melonking.Net © Always and ever was! SMF 2.0.19 | SMF © 2021 | Privacy Notice | Send Feedback | Supporters ♥ Forum Guide | Rules | RSS | WAP | Mobile


MelonLand Badges and Other Melon Sites!

MelonLand Project! Visit the MelonLand Forum! Support the Forum
Visit Melonking.Net! Visit the Gif Gallery! Pixel Sea TamaNOTchi
@000 Melon
Land
Editor Recent Edits Tenement Arcade Random Link Land → Forum Art Hub Chat Webring Want to Login or Join ? Web Craft Guide Graphic Catalogue Wiki Newsletters Image Stream
Passport Sites Asatte Add your site?
Zap!
Minecraft: Online
Join: craft.melonking.net