Unity3D - C# script

Sekcia o programovaní, programovacích jazykoch...
Xoee
Nový používateľ
Nový používateľ
Príspevky: 75
Dátum registrácie: So 03. Aug, 2013, 12:53

Unity3D - C# script

Príspevok od užívateľa Xoee » St 26. Jún, 2019, 18:29

Zdravím, tvorím vlastnú strategickú hru v Unity na štýl Travian, DK atď. kde som sa dostal do menšieho problému so skriptom. Hra obsahuje produkcie surovín za hodinu kde som využil Time.deltaTime a všetko funguje ako má, lenže ak hráč vypne aplikáciu produkcie sa tým pádom zastavia čo nie je vôbec dobre...

Je to moja prvá hra a som prekvapený ako ďaleko som sa s ňou dostal lenže tento problém neviem vyriešiť. Premýšľal som že využijem aktuálny čas a nejako to prepojím s produkciami ale vôbec sa neviem pohnúť. Vedel by niekto niečo? :)
Spoiler: ukázať
CPU:Intel Core i5-4570 (3.20GHz, TurboBoost 3.60GHz)
MB:MSI B85-G43
VGA:MSI N770 TF 2GD5/OC Gaming 2GB
RAM:Crucial 8GB (2x4GB)
HDD:Seagate Barracuda 7200.14 1000GB
PSU:Seasonic M12II-520W
Case:Corsair 200R Carbide Series
Display:LG IPS235P-BN 23"
Mouse:Gigabyte M6900
Keyboard:Logitech Keyboard K120 OEM SK
Sound:Logitech Speaker System Z313

Užívateľov profilový obrázok
materik
Používateľ
Používateľ
Príspevky: 2020
Dátum registrácie: Št 10. Apr, 2008, 14:00
Bydlisko: Humenné / BA (work)
Kontaktovať užívateľa:

Re: Unity3D - C# script

Príspevok od užívateľa materik » Št 27. Jún, 2019, 12:34

S Unity som uz dlhsie nerobil, ale skusim. Predpokladam, ze robis offline desktop aplikaciu v ktorej ak bezi hra, bezi aj produkcia. Dalej ak tomu rozumiem, tak kazdu hodinu pripisujes iste mnozstvo surovin a deltu pouzivas na zistenie, ci ta hodina ubehla. To je zaroven tvoj problem, lebo chces aby produkcia bezala aj vtedy, ak hra nie. Ak som to dobre pochopil, tak ma napada toto:

Predpokladam, ze mas implementovanu nejaku Save Game funkcionalitu, tak? Uloz si timestamp, potom pri load-e vypocitaj diff timestamp-u voci aktualnemu casu a z toho si doratas produkciu za danu dobu. Ak mas definovane ze 1 hod/ +x suroviny y, tak je to simple, deltu v tomto pripade nepotrebujes. Z diff-u tiez vies zistit, kolko ti zostava do skoncenia nasledujucej hodiny a dalej produkciu ratas od daneho casu.
BA: PC -> Audinst HUD-mx1 -> Beyerdynamic Amiron Home
HE: PC -> M-Audio Audiophile 2496 -> NAD C316BEE -> Dali Zensor 1
Sony XPERIA XZ2 -> SONY WH-1000XM2

Užívateľov profilový obrázok
wingo
Používateľ
Používateľ
Príspevky: 2403
Dátum registrácie: St 01. Sep, 2010, 20:36
Bydlisko: Podbrezová

Re: Unity3D - C# script

Príspevok od užívateľa wingo » Št 27. Jún, 2019, 13:00

S Unity nerobím, ale tak vo všeobecnosti:

Travian beží nonstop online na serveri takže tam takéto problémy nie sú, počíta to server ktorý beží nonstop. To je jedna z možností ako to riešiť, prevádzkovať nonstop online server na ktorý sa budú hráči pripájať a ktorý to bude sledovať, teda ak je cieľom aj nejaká online zložka.

Čo sa offline týka materik ti pekne odpovedal, ale zostáva otázka jednoduchého cheatovania zmenou aktuálneho času v PC, a ošetrenia čo robiť ak timestamp v save je väčší ako aktuálny, čo sa môže stať v prípade posunu času dozadu (z akéhokoľvek dôvodu - predchádzajúci cheat na suroviny posunom času dopredu a teraz nastavil späť pôvodný čas, pôvodne mal zlý čas/dátum v PC a nastavil správny, posun letný/zimný čas...). V podstate máš niekoľko možností, suroviny sa odpočítajú a možno pôjdu do mínusu lebo rozdiel je záporný, suroviny sa pripočítajú lebo počítaš absolútnu hodnotu rozdielu timestampov alebo to ošetríš tak že v tomto prípade sa suroviny nezmenia alebo vypíšeš nejakú hlášku s upozornením...
STEAM: http://steamcommunity.com/id/X-w1n9/

i7 6700K, Noctua NH-D14, GIGABYTE GA-Z270 GAMING K3, 16GB DDR4 Corsair Vengeance 3200MHz, Gainward GTX 1080 Phoenix GS, Toshiba XG3 1TB M.2 NVMe, 1TB Samsung SpinPoint F3 3RZ + Silentmaxx HD-Silencer, Corsair TX650 + Enermax T.B. Silence UCTB12A, Fractal Design Define R3 (outtake: Noiseblocker NB-eLoop Fan B12-P, intake: Enermax T.B. Silence UCTB14B bottom), ASUS VG279Q, Logitech K200, Logitech G400, Hifiman HE-4xx

Užívateľov profilový obrázok
materik
Používateľ
Používateľ
Príspevky: 2020
Dátum registrácie: Št 10. Apr, 2008, 14:00
Bydlisko: Humenné / BA (work)
Kontaktovať užívateľa:

Re: Unity3D - C# script

Príspevok od užívateľa materik » Št 27. Jún, 2019, 13:25

@wingo: Dobry point so zmenou casu, mozno by to vedel vyriesit call na nejaku free API-nu a ukladat UTC cas, miesto pouzita systemoveho casu. Hned vsak vidim problem, ze co robit, ked si offline? :-)
BA: PC -> Audinst HUD-mx1 -> Beyerdynamic Amiron Home
HE: PC -> M-Audio Audiophile 2496 -> NAD C316BEE -> Dali Zensor 1
Sony XPERIA XZ2 -> SONY WH-1000XM2

Xoee
Nový používateľ
Nový používateľ
Príspevky: 75
Dátum registrácie: So 03. Aug, 2013, 12:53

Re: Unity3D - C# script

Príspevok od užívateľa Xoee » Št 27. Jún, 2019, 13:50

Nad tým cheatom pomocou zmeny času som práve premýšľal lebo som to používal v každej hre kde to išlo. Tak budem to musieť vývoj pauznuť a začať zisťovať ako to spraviť pomocou nejakého servera alebo multiplayer-a ktorý ponúka unity. Neviem o tom v podstate nič takže teraz mám čo robiť kým si to naštudujem :D ... Ak to zvládnem tak pomocou servera hneď načítam serverový čas a podľa toho času sa budu vypočítavať aj produkcie či odpočítavať časy upgradovania budov.
Spoiler: ukázať
CPU:Intel Core i5-4570 (3.20GHz, TurboBoost 3.60GHz)
MB:MSI B85-G43
VGA:MSI N770 TF 2GD5/OC Gaming 2GB
RAM:Crucial 8GB (2x4GB)
HDD:Seagate Barracuda 7200.14 1000GB
PSU:Seasonic M12II-520W
Case:Corsair 200R Carbide Series
Display:LG IPS235P-BN 23"
Mouse:Gigabyte M6900
Keyboard:Logitech Keyboard K120 OEM SK
Sound:Logitech Speaker System Z313

Užívateľov profilový obrázok
wingo
Používateľ
Používateľ
Príspevky: 2403
Dátum registrácie: St 01. Sep, 2010, 20:36
Bydlisko: Podbrezová

Re: Unity3D - C# script

Príspevok od užívateľa wingo » Pi 28. Jún, 2019, 08:17

Ak ti ide len o čas nemusíš mať vlastný server ani riešiť žiadny multiplayer ak ho nechceš implementovať, ako spomenul materik môžeš využiť nejaký free server s aktuálnym časom. Existuje kopec public NTP serverov, len ako z nich zisťovať aktuálny čas cez NTP protokol si musíš zistiť ty, predpokladám že nejaký vzorový skript nájdeš ;)

V prípade nedostupnosti servera jednoducho môže hra vypísať že funguje iba keď si online a basta. Hlavne toto rieš iba pri save a loade (a NewGame) a nedopytuj online aktuálny čas každú sekundu, ten deltatime už máš poriešený ;)
STEAM: http://steamcommunity.com/id/X-w1n9/

i7 6700K, Noctua NH-D14, GIGABYTE GA-Z270 GAMING K3, 16GB DDR4 Corsair Vengeance 3200MHz, Gainward GTX 1080 Phoenix GS, Toshiba XG3 1TB M.2 NVMe, 1TB Samsung SpinPoint F3 3RZ + Silentmaxx HD-Silencer, Corsair TX650 + Enermax T.B. Silence UCTB12A, Fractal Design Define R3 (outtake: Noiseblocker NB-eLoop Fan B12-P, intake: Enermax T.B. Silence UCTB14B bottom), ASUS VG279Q, Logitech K200, Logitech G400, Hifiman HE-4xx

Užívateľov profilový obrázok
materik
Používateľ
Používateľ
Príspevky: 2020
Dátum registrácie: Št 10. Apr, 2008, 14:00
Bydlisko: Humenné / BA (work)
Kontaktovať užívateľa:

Re: Unity3D - C# script

Príspevok od užívateľa materik » Pi 28. Jún, 2019, 08:18

Tu mas free API, kde dostanes UTC cas. Skus si najprv toto, lahsie ako kodit vlastny server.
A tu mas tutorial ako spravit connection na WEB API.
BA: PC -> Audinst HUD-mx1 -> Beyerdynamic Amiron Home
HE: PC -> M-Audio Audiophile 2496 -> NAD C316BEE -> Dali Zensor 1
Sony XPERIA XZ2 -> SONY WH-1000XM2

Xoee
Nový používateľ
Nový používateľ
Príspevky: 75
Dátum registrácie: So 03. Aug, 2013, 12:53

Re: Unity3D - C# script

Príspevok od užívateľa Xoee » So 29. Jún, 2019, 00:29

Asi som si to premyslel a bude to offline hra bez netu. Síce som si pozrel všetko čo ste mi radili ale tak pracujem na tej hre sám a nejdem si to zbytočne komplikovať lebo by som tu hru ani nedokončil, tak si dám račej jednoduchší cieľ s tým že to časom aj dokončím a hlavne sa pri tom viac toho naučím.

Takže asi to spravím tak, že vytvorím vlastný herný dátum ačas kde hra sa bude začínať napr. v roku 2030 a vtedy sa čas spustí. Produkcie budu podľa herného času takže zmena systémového času nebude môcť byť využitá ako cheat a ak hráč nebude v hre tak ani samotná hra nebude bežať. Takže ako klasické stratégie na PC. Tým by som aj donútil hráčov aby trávili viac času v hre. Multiplayer tam ani neplánujem pridávať maximálne nejakú štatistiku aby sa mohli hráči obehovať v počte bodov.

Čo sa týka toho herného času tak si to predstavujem nejak tak, že si zadefinujem začiatok hry pomocou:
DateTime GameTime = new DateTime(2030, 1, 1, 10, 00, 00);
... a potom ho nejako spustím no ešte som neprišiel na to ako... možno využiť niečo ako deltaTime:
FuelTime.AddSeconds((+1) * Time.deltaTime);
...len že to mi nefungovalo
Spoiler: ukázať
CPU:Intel Core i5-4570 (3.20GHz, TurboBoost 3.60GHz)
MB:MSI B85-G43
VGA:MSI N770 TF 2GD5/OC Gaming 2GB
RAM:Crucial 8GB (2x4GB)
HDD:Seagate Barracuda 7200.14 1000GB
PSU:Seasonic M12II-520W
Case:Corsair 200R Carbide Series
Display:LG IPS235P-BN 23"
Mouse:Gigabyte M6900
Keyboard:Logitech Keyboard K120 OEM SK
Sound:Logitech Speaker System Z313

Xoee
Nový používateľ
Nový používateľ
Príspevky: 75
Dátum registrácie: So 03. Aug, 2013, 12:53

Re: Unity3D - C# script

Príspevok od užívateľa Xoee » So 29. Jún, 2019, 13:25

No hľadal som skúšal som a nič mi nefungovalo tak som to spravil po svojom ala škôlkar :D
Spoiler: ukázať
public class PlayTime : MonoBehaviour
{
public TextMeshProUGUI GameTime;

int Dni;
int Hodiny;
int Minuty;
float Sekundy;

void Update()
{
Sekundy += 1 * Time.deltaTime * 1;

if (Sekundy >= 60)
{
Sekundy = 0;
Minuty += 1;
}

else if (Minuty >= 60)
{
Minuty = 0;
Hodiny += 1;
}

else if (Hodiny >= 24)
{
Hodiny = 0;
Dni += 1;
}

GameTime.text = ("Day: " + Dni + " " + Hodiny.ToString("00") + ":" + Minuty.ToString("00") + ":" + Math.Round(Sekundy, 0).ToString("00"));
}
}
Spoiler: ukázať
CPU:Intel Core i5-4570 (3.20GHz, TurboBoost 3.60GHz)
MB:MSI B85-G43
VGA:MSI N770 TF 2GD5/OC Gaming 2GB
RAM:Crucial 8GB (2x4GB)
HDD:Seagate Barracuda 7200.14 1000GB
PSU:Seasonic M12II-520W
Case:Corsair 200R Carbide Series
Display:LG IPS235P-BN 23"
Mouse:Gigabyte M6900
Keyboard:Logitech Keyboard K120 OEM SK
Sound:Logitech Speaker System Z313

Užívateľov profilový obrázok
materik
Používateľ
Používateľ
Príspevky: 2020
Dátum registrácie: Št 10. Apr, 2008, 14:00
Bydlisko: Humenné / BA (work)
Kontaktovať užívateľa:

Re: Unity3D - C# script

Príspevok od užívateľa materik » Po 01. Júl, 2019, 10:55

Trochu nechapem tvojmu Game Design-u. Nakolko si sa rozhodol odstranit off-line produkciu, teda ked hra nebezi, tak co chces osetrovat pouzitim specialneho casu?
Ak mas produkcie definovane v nejakom konfiguraku ako casovy udaj (napr. 60000ms), tak je uplne jedno, co si user robi so systemovym casom. Ty si vzdy rataj prejdeny cas na zaklade delty a ukladaj si cas, ktory stihol ubehnut predtym, ako user ulozil hru.
Nieco take:

Kód: Vybrať všetko

60000ms passed => addResources()
45352ms passed && event.saveGame => saveGame(45352) // public boolean saveGame(float timeThatPassed) { ... }

LOAD:

if (!!timeThatPassed) {
  deltaStart = timeThatPassed;
} else {
  deltaStart = 0;
}
Hre je tak uplne jedno, ci je systemovy cas 20 rokov pozadu, alebo 30 v buducnosti. :-)
BA: PC -> Audinst HUD-mx1 -> Beyerdynamic Amiron Home
HE: PC -> M-Audio Audiophile 2496 -> NAD C316BEE -> Dali Zensor 1
Sony XPERIA XZ2 -> SONY WH-1000XM2

Napísať odpoveď

Návrat na "Programovanie"