Jump to content
Unity Insider Forum

Night Licht & Uhrzeit & Einstellungen


teiger

Recommended Posts

Hi Leute,

 

Ich stehe wiedermal vor einem Problem.

 

Und Zwar habe ich wie es der Titel schon sagt 3 Fragen?

 

 

Frage 1. Night Licht:

 

Ich habe vor da ich mit Unisky1.2 arbeite, vor das ich einen Skript (vorzugsweise C#!) erstelle mit variablen (Light),

in denen ich die Lichtquellen zuweisen kann.

 

Und das ganze soll so ablaufen das der Script (ich nenn ihn mal Lightsystem) die Aktuelle Zeit aus der UniskyAPI (unter Sun /bei Time) diesen wert ausließt und das Licht Nachts An und Morgens wieder Aus schaltet?.

 

 

Frage 2. Uhrzeit:

 

Das soll etwa genauso laufen mit dem Auslesen,und mir das ganze im Format St : Min als GUI oben Links ausgeben?.

 

 

Frage 3. Einstellungen:

(Dies bezieht sich überwiegend auf den Unten folgenden Script Weather Manager!)

 

Ich habe vor ein Menü inkl Optionen zu erstellen in der ich die Einstellungen des Managers Ändern kann. Da nach dem Fertigstellen ja keine Änderungen möglich sind und ich die ins Optionsmenü einstellbar machen möchte?

 

WÄhre toll wenn jemand einen Tipp bzw Idee hÄtte.

 

using UnityEngine;
using System.Collections;
[AddComponentMenu("Scripts/Global/WeatherManager")]
public class WeatherManager : MonoBehaviour
{
public int timeMinFor24hrCycle = 0; //40 is a good value
public float startTime = 12f;
public float minutesToCheckForNextWeatherChange = 10f;
public float timeInSecToChangeWeather = 20f;
public WEATHER_ZONE WeatherZone = WEATHER_ZONE.PLAINS;


// instance of the API
private UniSkyAPI uniSky;
private bool weatherInHold = false;
private WEATHER_STATE currentWeatherState = WEATHER_STATE.NONE;
private Light sunLight;

public struct WeatherChances
{
	public float HeavyStorm;
	public float HeavyRain;
	public float LightRain;
	public float Overcast;
	public float SunShower;
	public float Cloudy;
	public float Cloudless;
}
private void Awake()
{
	// Define instance
	uniSky = GameObject.Find("UniSkyAPI").GetComponent("UniSkyAPI") as UniSkyAPI;

	// Initiate and create default UniSky
	uniSky.InstantiateUniSky();
	// Set some initial states
	uniSky.SetTime(startTime);
	//uniSky.SetAmbientLighting(new Color(0.1f, 0.1f, 0.1f, 0.1f));
	uniSky.SetAmbientLighting(new Color(0f, 0f, 0f, 0f));
	uniSky.SetStormCenter(new Vector3(0, 0, 0));
	uniSky.SetSunShadows(LightShadows.Soft);

	//Start Sun - if applicable
	ControlSun();
}
private void Start()
{
	////Set Sun and need to re-assign lightsources because the sun is created after global is initialized
	//GlobalManager.Sun = GameObject.FindGameObjectWithTag("Sun");
	//GlobalManager.LightSources = GameObject.FindGameObjectsWithTag("LightSource");
	//sunLight = (Light)GlobalManager.Sun.GetComponent(typeof(Light));
	//sunLight.shadowStrength = 1f;
	timeInSecToChangeWeather *= 1000f; //Change to milliseconds
	float weatherCheckTime = minutesToCheckForNextWeatherChange * 60f;
	InvokeRepeating("ManageWeather", 0f, weatherCheckTime);
}

private void Update()
{
}

private void ManageWeather()
{
    //Ausgelassen!
}

private void ControlSun()
{
	if (timeMinFor24hrCycle != 0)
	{
		// set up a 24-hour cycle with a framerate dependent speed of 1.0
		uniSky.LerpTime(24f, 1000f * 60f * (float)timeMinFor24hrCycle);
		//Debug.Log("Time is : " + uniSky.GetTime());
	}
	else
	{
		uniSky.SetSpeedOfTime(0f);
	}
}
}

 

Einige teile habe ich Ausgelassen! da diese nicht unbedingt hier aufgelistet sein müssen um meine Frage zu beantworten! falls jemand ihn doch benötigt poste ich ihn komplett oder gebe ihn per PN!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich habe das so verstanden, dass er vor hat mit einem script in dem er z.B Pointlights etc zuweisen kann die am tag aus und nachts an sind.

 

Daher glaube ich die Frage wie man die Aktuelle zeit auslesen könnte die gehe ich mal von (public float GetTime() {) in der UniSkyAPI.cs aus.

 

Bei der Frage 2 möchte er das ebenfalls diese Zeit in einem GUI.label ausgegeben wird.

 

 

Bei Frage 3 möchte er das if (timeMinFor24hrCycle != 0) einstellbar ist,also ein GUI wo man einen Wert angeben kann um eine zeit in Minuten anzugeben wie lange der 24stunden Zyklus dauert, quasi z.b 5min Realer-zeit = 1x 24 stunden im Game.

 

Falls deinerseits ne frage bzw was unklar ist sage es bitte, ich habe es zwar verstanden, aber leider auch keine Lösung

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich kenne mich absolut nicht mit UniSky aus, aber ich versuche es einfach mal:

 

Frage1: Wie kann ich beliebige PointLights an die aktuelle uniSky zeit koppeln, so dass diese wenn es Nacht wird aktiviert werden und wenn es Tag wird deaktiviert werden?

 

Die naivste Lösung wäre es den PointLight GameObjekts ein Script zu geben welches Regelmäßg UniSky nach der Ingame Zeit fragt und je nach Wert die Lichter ein oder ausschaltet. Ich gehe mal davon aus dass GetTime einen Wert zwischen 0.0f und 24.0f zurück liefert.

 

UniSkyDayNightCycleLight.cs

public float BeginNightTime = 20.0f;
public float BeginDayTime = 6.0f;

public void Update()
{
 var currentTime = UniSky.GetTime();

 if (currentTime > BeginDayTime && currentTime < BeginNightTime)
   light.enabled = false;
 else
   light.enabled = true;
}

 

Frage2: Wie gebe ich die aktuelle UniSky Zeit schön formatiert in ein GUI.label aus?

 

Am einfachsten wäre es hier die Zeit aus UniSky mit GetTime auszulesen und in einen lesbaren String zu verwandeln, diesen String dann ausgeben:

 

void Update()
{
 var time = System.TimeSpan.FromHours(UniSky.GetTime());

 GUILayout.Label(time.ToString());
}

 

3. Frage: Wie erweitere ich den Manager um einen einstellbare "24h InGame sind wieviel Minuten RealTime" Nummer?

 

Hier ist die Frage noch etwas ungenau, ich nehme an du willst InGame die Dauer einstellen? Also zum Beispiel im InGame Optionsmenü beim erstellen eines neuen Spiels?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da timeMinFor24hrCycle public ist lässt sich dass eigentlich immer und überall gut ändern:

 

var newTimeMinFor24hrCycle = (int)GUILayout.HorizontalSlider(weatherManager.timeMinFor24hrCycle, minWert, maxWert);
if (newTimeMinFor24hrCycle != weatherManager.timeMinFor24hrCycle)
{
 weatherManager.timeMinFor24hrCycle = newTimeMinFor24hrCycle;
 ...
}

 

kA was genau da nun eingestellt werden muss.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zu UniSkyDayNightCycleLight.cs Nimmt er nicht an und sagt

(UniSkyDayNightCycleLight.cs(11,28): error CS0117: `UniSky' does not contain a definition for `GetTime').

 

 

Basieren tut der Weather Manager auf diesen Script von KrankyBoyGames

 

http://forum.unity3d.com/threads/73074-UniSky-real-time-procedural-sky-tool-now-available-on-the-Asset-Store/page11

 

vtl hilft das weiter.

 

Ob man den Script von uniSkyAPI auch posten darf weis ich nicht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...