[Unity C#] Calcolare che ora è.

Discussioni su qualunque linguaggio di programmazione o engine
Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

[Unity C#] Calcolare che ora è.

Messaggio da aironenero »

No, non intendo ricavare data e ora del sistema, quello lo so fare già. :asd:
Praticamente stavo facendo un day night cycle che non sia frame rate dipendente. Ora: la rotazione non è un problema, è perfettamente regolare, il problema sorge nel calcolarmi effettivamente che ora sia nel gioco.

sto usando questo script (totalmente fatto da me):

Codice: Seleziona tutto

using UnityEngine; 
using System.Collections; 
 
//0.125 gradi di rotazione equivalgono a 1 minuto. Una rotazione globale di 90 equivale a mezzogiorno, 270 equivale a mezzanotte. 0 gradi è l'alba, 360 è il tramonto.

public class DayLightCycle : MonoBehaviour
{
    #region Components
    //Componenti automaticamente ricavati all'esecuzione dello script.
    public GameObject SunLight;
    public Transform SunTransform;
    public Light LightComponent;
    #endregion
    #region H/M
    //Variabili per l'orologio globale
    public int Hour;
    public int Minutes;
    #endregion
    #region Rotation constraint
    //costanti di rotazione
    public Vector3 MidnightStartDay = new Vector3(0, 0, 0);
    public Vector3 MidnightEndDay = new Vector3(360, 0, 0);
    public const float GradForMinute = 0.125f; //non modificare, usare la variabile time constraint per velocizzare lo scorrere del tempo.
    #endregion
    //Componente vector3 da applicare in rotazione.
    private Vector3 RotationComponent;




    //costante per regolare la velocita del tempo.
    public float TimeConstraint = 1;

	void Start () {
        LightComponent = SunLight.GetComponent<Light>();
        SunTransform = SunLight.GetComponent<Transform>();
	} 

    #region Rotation
    void Update()
    {
        //Interpolazione percentuale per la rotazione al secondo.
        float PI = 0;
        
        if (PI <= 0)
	    {
            //aggiungo il tempo passato dall'ultimo frame moltiplicato per la costante dello scorrere del tempo il tutto fratot 10 (se qualcuno ha un metodo migliore, ben venga)
            PI += (Time.deltaTime * TimeConstraint)/10;

            RotationComponent = Vector3.Lerp(MidnightStartDay, MidnightEndDay, PI);
	    }

        SunTransform.Rotate(RotationComponent);

        Hour = ((int)SunTransform.eulerAngles.x) / 15;
        Debug.Log(SunTransform.eulerAngles.x);

    }
    #endregion
Il problema è che l'ora non è affatot precisa, tuttaltro, quando è mezzo giorno mi risultano le 5! :spat:
é un giorno che mi ci sbatto la testa.
Unity Developer
Immagine
Immagine

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da aironenero »

Sto pensando ora che effettivamente 360 non è il tramonto, bensì l'alba del giorno dopo. 180 gradi è il vero tramonto, resta il fatto che non ho ancora idea di come correggere lo script...
Unity Developer
Immagine
Immagine

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da aironenero »

Quì la discussione sul forum ufficiale unity, ancora però una soluzione non l'ho trovata... damn...
Unity Developer
Immagine
Immagine

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da doom13 »

Dovresti rispondere con un inglese più inglese, google traduttore a palla?
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da aironenero »

doom13 ha scritto:Dovresti rispondere con un inglese più inglese, google traduttore a palla?
No, quello è il mio inglese, google traduttore fa ancora più schifo, fidati, certi obbrobri che google translate non li faccio, mai avuto più di 7 in inglese a scuola comunque....
Unity Developer
Immagine
Immagine

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da doom13 »

aironenero ha scritto:
doom13 ha scritto:Dovresti rispondere con un inglese più inglese, google traduttore a palla?
No, quello è il mio inglese, google traduttore fa ancora più schifo, fidati, certi obbrobri che google translate non li faccio, mai avuto più di 7 in inglese a scuola comunque....
Mi fido mi fido magari fai più attenzione tipo quando apri il topic con "I maked", non si può sentire.

Tornando IT, mi potresti riscrivere lo script in pseudo codice?
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da aironenero »

doom13 ha scritto:
aironenero ha scritto:
doom13 ha scritto:Dovresti rispondere con un inglese più inglese, google traduttore a palla?
No, quello è il mio inglese, google traduttore fa ancora più schifo, fidati, certi obbrobri che google translate non li faccio, mai avuto più di 7 in inglese a scuola comunque....
Mi fido mi fido magari fai più attenzione tipo quando apri il topic con "I maked", non si può sentire.

Tornando IT, mi potresti riscrivere lo script in pseudo codice?
Eh, vabbe, in pseudo codice saà dura, spero tu sappia come funziona il lerp di GM...

Codice: Seleziona tutto

//Ogni frame
{
   se (la rotazione è maggiore o uguale a 359)
   {
       Setta la rotazione a 0
   }
   se (PI è maggiore o uguale a 0)
   {
       aggiungi a pi il tempo passato per l'elaborazione del frame precedente moltiplicato per la costante del tempo (di default 1) e dividi il tutto per 10;
       dai a rotationcomponent il risultato dell'interpolazione lineare (lerp) di: 0 e 360 per PI;
   }
   
   Applica il risultato del lerp sopra alla mia luce direzionale (che quindi ruota);
   
   //quì inizia la parte dove ci sta il problema.
   Dai a Ore il valore risultante di: gradi di rotazione della luce diviso 15;
   se (Ore è maggiore o uguale a 18)
   {
       Dai a Ore il risultato di se stesso + 6;
   }
   altrimenti
   {
       Dai a ore il risultato di se stesso meno 18;
   }
più terra terra di così si muore :asd:
Unity Developer
Immagine
Immagine

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da doom13 »

Mi dispiace averti fatto perdere tempo ma non ci arrivo, scusa ma in base a cosa all'inizio fai diviso 10 poi sotto fai diviso 15, questi numeri da dove sono usciti?
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da aironenero »

doom13 ha scritto:Mi dispiace averti fatto perdere tempo ma non ci arrivo, scusa ma in base a cosa all'inizio fai diviso 10 poi sotto fai diviso 15, questi numeri da dove sono usciti?
una giornata equivale ad una rotazione di 360 gradi, in un giorno abbiamo 24 ore, 360/24 = 15, ogni 15 gradi di rotazione è passata un ora.
il diviso 10 invece è un numero arbitrario per evitare che il sole ruoti troppo velocemente.
Ripeto, il problema è esattamente nella parte:

Codice: Seleziona tutto

Dai a Ore il valore risultante di: gradi di rotazione della luce diviso 15;
   se (Ore è maggiore o uguale a 18)
   {
       Dai a Ore il risultato di se stesso + 6;
   }
   altrimenti
   {
       Dai a ore il risultato di se stesso meno 18;
   }
Sappi solo che la parte sopra a questo pezzo non è inerente al problema, che non è ruotare il sole indipendentemente dal frame rate, bensi avendo la rotazione del sole (dove una rotazione di 0 equivale al sole sulla linea di orizzone all'alba e 180 equivale al sole sulla linea d'orizzonte al tramonto, di conseguenza a 90 gradi è mezzogiorno e a 270 è mezzanotte.
Unity Developer
Immagine
Immagine

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da doom13 »

aironenero ha scritto:
doom13 ha scritto:Mi dispiace averti fatto perdere tempo ma non ci arrivo, scusa ma in base a cosa all'inizio fai diviso 10 poi sotto fai diviso 15, questi numeri da dove sono usciti?
una giornata equivale ad una rotazione di 360 gradi, in un giorno abbiamo 24 ore, 360/24 = 15, ogni 15 gradi di rotazione è passata un ora.
il diviso 10 invece è un numero arbitrario per evitare che il sole ruoti troppo velocemente.
Ripeto, il problema è esattamente nella parte:

Codice: Seleziona tutto

Dai a Ore il valore risultante di: gradi di rotazione della luce diviso 15;
   se (Ore è maggiore o uguale a 18)
   {
       Dai a Ore il risultato di se stesso + 6;
   }
   altrimenti
   {
       Dai a ore il risultato di se stesso meno 18;
   }
Sappi solo che la parte sopra a questo pezzo non è inerente al problema, che non è ruotare il sole indipendentemente dal frame rate, bensi avendo la rotazione del sole (dove una rotazione di 0 equivale al sole sulla linea di orizzone all'alba e 180 equivale al sole sulla linea d'orizzonte al tramonto, di conseguenza a 90 gradi è mezzogiorno e a 270 è mezzanotte.
Ok perfetto, sto cercando di capire, non mi sparare, perchè se Ore è maggiore o uguale a 18 aggiungi 6?
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

Avatar utente
civic71
GMI Advanced
Messaggi: 2210
Iscritto il: 23/10/2003, 17:31
Specialità: Risotto con zucchine
Uso: GM:Studio 1.4 Pro
Località: Jesolo (venezia)
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da civic71 »

A parte il fatto che non è la terra che ruota ma è la luce che ruota intorno alla terra grazie al suo campo magnetico
Spoiler
ha ha ha :lol:
Se ho capito bene il processo di rotazione terreste funziona bene e quindi hai il tuo ciclo...
Spoiler
hai il tuo ciclo :lol:

Se ho capito devi solo calcolare l'ora ... ma sapendo che ogni 15 gradi equivale un ora non capisco come non ti risulti giusto.
Comunque si il calcolo dovrebbe essere riportato in base ai 180°.
quando è mezzo giorno mi risultano le 5!
Ma ora+7 ti darebbe sempre l'ora esatta giusto ?
Attenzione che non ruoti nel senso inverso ... e quindi 270°risulti nel calcolo 90°;

Non avendo ancora Unity non ti posso aiutare.

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da aironenero »

il problema dell'ora sfasata l'ho risolto, aggiungendo questo pezzo al codice:

Codice: Seleziona tutto

Hour = ((int)SunTransform.eulerAngles.x) / 15;
 
if (Hour < 18)
{
   Hour = Hour + 6;
}
else
{
   Hour = Math.Abs(Hour - 18);
}
, la roba strana è che: dall'alba a mezzogiorno l'ora è giusta. poi l'orario va al contrario mentre il sole va a tramontare, arrivando a 0 quando è mezzanotte (ma che cazz...) per poi tornare esatta verso l'alba :fapensare:
Ora, non vorrei che il fatto che io usi una rotazione eulerica (quindi soggetta a gimbal lock) mi dia questo problema? :confuso:
Il fatto è che io i quaternion non li capisco molto (se ho capito come fungano: i valori X,Y,Z vengono moltiplicati per sin(W) :hum: ma non ho idea di come riportarmi da angoli eulerici a quaternioni senza avere gimbal lock).
Sarebbe comodo se qualcuno che usa unity quì (Non facciamo, nomi, Tizzio :lol: ) mi dasse conferma... (o meglio la soluzione).
Unity Developer
Immagine
Immagine

Avatar utente
civic71
GMI Advanced
Messaggi: 2210
Iscritto il: 23/10/2003, 17:31
Specialità: Risotto con zucchine
Uso: GM:Studio 1.4 Pro
Località: Jesolo (venezia)
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da civic71 »

Mi ricordo che ... i gradi quando.... come lo spiego ???

Se i gradi aumentano possono andare oltre i 360°;

se diminuisco possono andare a meno : -1 ,-2,-3 ... -360 e quindi il calcolo dell' ora viene errato.

Allora dovresti fare una cosa del genere :

Codice: Seleziona tutto

gradi+=1;
 if gradi >= 360 { gradi=1;}
Altrimenti se gira sottraendo i gradi

Codice: Seleziona tutto

gradi-=1;
 if gradi <= 0 { gradi=360;}

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da aironenero »

quello è gia fatto, controlla lo script postato nell'openpost. Appena è >= 360 lo riporta a zero, ionltre io aggiungo e mai tolgo ai gradi perciò un inverso che controlla che lo script non vada sotto zero non mi servirebbe.
Unity Developer
Immagine
Immagine

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da aironenero »

Suppongo di aver trovato una soluzione (spero che sia definitivamente la soluzione, mi sono davvero rotto!). Dopo aver riscritto il codice, (rendendolo ora estensibile a più soli e lune, stagioni e cicli lunari, colore per tramonto e alba...) mi soon accorto che assegnando una tot rotazione pe rframe mi basterebbe in teoria aggiungerla ad una variabile (da cui sottrare 360 ogni giorno). Ora provo...
Unity Developer
Immagine
Immagine

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da aironenero »

Soluzione trovata, esattamente quella sopra, ho implementato una struttura per passare giorno, ora e minuto ad altre classi. Vi lascio il codice nel caso serva a qualcuno (anche per spunto)
Spoiler

Codice: Seleziona tutto

using UnityEngine; 
using System.Collections;

public struct GameTime
{
    public int Day;
    public int Hour;
    public int Minute;
}

public class DayLightCycle : MonoBehaviour
{ 

    private const float SECOND = 1;
    private const float MINUTE = SECOND * 60;
    private const float HOUR = MINUTE * 60;
    private const float DAY = HOUR * 24;

    //Variables for counting.
    public float DayCycleInMinutes = 0.5f;
    private float _dayCycleInSeconds;
    //Array that gets the sun's transforms.
    public Transform[] Sun;
    //in one minute how much degrees the sun will rotate?
    private const float DegreesPerSecond = 360 / DAY;
    //Current rotation componenet to add
    private float _degreeRotation;
    public Vector3 Rotation;

    public float time;
    public int DayCount;
    public int HourCount;
    public float MinutesCount;

    public float MaxIntensity=1;
    public float MinIntnsity=0;

    //Setup of variables
    void Start () 
    {
        _dayCycleInSeconds = DayCycleInMinutes * MINUTE;
        _degreeRotation = DegreesPerSecond * DAY / (_dayCycleInSeconds);
    }
    void Update()
    {
        SunRotate();
        TimeUpdate();
    }

    public GameTime GetGameTime()
    {
        GameTime _time;
        _time = new GameTime();
        _time.Day = DayCount;
        _time.Hour = HourCount;
        _time.Minute = (int)MinutesCount;
        return _time;
    }

    private void SunRotate()
    {
        Rotation = new Vector3(_degreeRotation, 0, 0) * Time.deltaTime;

        for (int Cnt = 0; Cnt < Sun.Length; Cnt++)
        {
            Sun[Cnt].Rotate(Rotation);
        }
    }

    private void TimeUpdate()
    {
        time += Rotation.x;

        if (time >= 360)
        {
            time -= 360;
            DayCount++;
        }

        if (MinutesCount >= 60)
        {
            MinutesCount -= 60;
        }

        HourCount = (int)time / 15;
        MinutesCount = time / 0.25f;
    }

}
Unity Developer
Immagine
Immagine

Avatar utente
cp94
Moderatore
Messaggi: 2789
Iscritto il: 04/07/2009, 19:18
Specialità: ddd
Località: Brescia
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da cp94 »

edit by tizzio: ti ho cancellato il messaggio per sbaglio :spat:
(ho premuto edit anziché quote)
Games you should check out
Naemo
E T U S
Overgravity
Inside the Code

Immagine

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da aironenero »

Mi devo esser perso qualcosa... :fapensare:
:asd:
Unity Developer
Immagine
Immagine

Avatar utente
cp94
Moderatore
Messaggi: 2789
Iscritto il: 04/07/2009, 19:18
Specialità: ddd
Località: Brescia
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da cp94 »

Lol!!
Vabe, ti avevo scritto il codice che usavo io per gestire il ciclo giorno notte, commentando il fatto che il tuo mi sembrava troppo lungo per nulla :asd:

Codice: Seleziona tutto

function upd()
{
	while (1>0)
	{
		var mov:float=((360.0000/global.day_lung)*0.1);
		sun.transform.Rotate(mov,0,0);
		var mov2:float=(((360.0000/global.day_lung)*0.1000)/15.0000); //day_lung in secondi
		global.hour+=mov2;
		while (hour>24) hour-=24;
		yield WaitForSeconds(0.1);
	}
}
Games you should check out
Naemo
E T U S
Overgravity
Inside the Code

Immagine

Avatar utente
aironenero
GMI Guru
Messaggi: 2612
Iscritto il: 02/05/2012, 14:56
Specialità: Unity 3D
Uso: GM:Studio 1.4 Pro
Località: Ispica
Contatta:

Re: [Unity C#] Calcolare che ora è.

Messaggio da aironenero »

cp94 ha scritto:Lol!!
Vabe, ti avevo scritto il codice che usavo io per gestire il ciclo giorno notte, commentando il fatto che il tuo mi sembrava troppo lungo per nulla :asd:

Codice: Seleziona tutto

function upd()
{
	while (1>0)
	{
		var mov:float=((360.0000/global.day_lung)*0.1);
		sun.transform.Rotate(mov,0,0);
		var mov2:float=(((360.0000/global.day_lung)*0.1000)/15.0000); //day_lung in secondi
		global.hour+=mov2;
		while (hour>24) hour-=24;
		yield WaitForSeconds(0.1);
	}
}
Emh cos'è unity script? Io uso C#. Inoltre, il tuo codice ti aggiorna ogni decimo di secondo la rotazione (che non è smussata), mentre il mio ogni frame, indipendentemente dal frame rate, per forza era più lungo. E il mio calcola anche i minuti e i giorni, in più ha una struttura per recuperare data e ora in una sola volta da altre classi, supporta illimati soli e lune ogniuna con la propria rotazione. Il mio codice attuale è lungo 193 righe e calcola anche le stagioni (con effettiva variazione dellarco e delle giornate (giorno più lungo della notte), basandosi sulla rotazione aumenta e diminuisce l'intensità della luce, attiva/disattiva le lensflare, aggiorna le sun shafts, alza/abbassa il treshold del bloom e l'intensità dell'effetto, definisce il calore dell'ambiente (simulo anche la temperatura). Mi pare normale che il mio codice sia più lungo, anche percè io uso variabili protette/pubbliche che non resetto ad ogni chiamata della funzione, inoltre non uso una coroutine, ma facico girare tutto in un update. Inoltre tu dichiari le variabili e le assegni nello stesso rigo risparmiando spazio a scapito della capacità di letutra, io dato che siamo in due coders devo mantenere il codice leggibile. E poi molte righe fanno figo (e a certa gente su questo forum vengono le vampate di calore :lol: )
Unity Developer
Immagine
Immagine

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 23 ospiti