• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    BYDKUNITY 3D
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    (akorat u tech singleton like objektu je potreba davat pozor na reference... pokud je to neco co drzi furt, tak dontdestroyonload ve startupu a drzet ho furt, pokud je to neco, co je singleton style manazer pouze pro danou scenu, uz je tam potreba cistit a davat pozor)
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    SLASH: nechapu na co potrebujes extendovat gameobject. GO je jen holder v hierarchii, nic moc vic. pokud chces mit kodove implementovany factory pattern, tak proste

    go = new GameObject("jmeno");
    go.transform.SetParent(do hierarchie, pokud nema byt v rootu);
    go.AddComponent(blablabla) co chces.

    prefaby muzes instancovat z resources (ktere jsou ale bohuzel udelane celkem hloupe a pro spoustu veci nevhodne - ale pro nejake spravcovske prefaby, manazery atd je to v pohode...

    obvykle veci typu jeden prefab ktery funguje jako spravce neceho dalsiho delam jako modifikovany singleton


    mujprefab Instance {
    get{
    if (_mujprefab==null)
    _mujprefab = Instantiate(Resources.Load("cesta")).GetComponent(mujprefabtype)()
    return _mujprefab;
    }
    }
    SLASH
    SLASH --- ---
    Jedna z veci ktore ma trochu stvu na Unity je ze neexistuje moznost ako vytvorit nejaky Custom Game object (via new MyCustomGO() ktory bude jednoducho extendovat GameObject, a teda bude mat vsetky lifecycle events a moznost pridavat komponents atd..

    Hlavne kvoli tomu aby sa tam dali jednoducho predavat variables (napriklad priamo do contructor-a) , a tiez aby sa vsetky prefab nemuseli linkovat do nejakeho managera ktory ich potom vytvara.

    Toto sa zrejme da riesit iba cez Instantiate (prefab..) , (cize taka svojska unity implementacia factory pattern) aspon teda ja som nenasiel lepsi sposob. Ak viete.. som same ucho!
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    2019.2 se kterou jsem si hral na podzim mi prisla celkem v pohode, ale je fakt ze jsem s ni delal jen nejake drobnosti, po te co jsem vynechal vsechny novejsi od 5.6. (kvuli licenci a faktu, ze prechod z 5 na dalsi vypadal kvuli breaking changes jako priserne peklo.)

    Ale zkusenosti s verzemi 5 mi celkem jasne rikaji, ze je potreba si setsakra rozmyslet, jestli prejit na novejsi a nezustat radeji jen u patch releases.

    kdyz zbezne procitam ty komentare.... mam sto chuti switchnout se pro sve vlastni hratky na petku :D (a nebyt 64 bitu a VR podpory, tak bych klidne sel zpatky do ctyrky)
    JAACOB
    JAACOB --- ---
    SHIGORBIRDMAN: Prave bacha na 2019 - dost lidi breci, ze aktualni releasy jsou fest v hellu. Rozhodne bych aspon pro nejaky serioznejsi projekt nezkousel upgrade pred releasem LTS a mozna i tak dvou patchu - mohlo by z toho byt mrzeni...

    2019.3 is now in the final stages of beta testing - Unity Technologies Blog
    https://blogs.unity3d.com/2019/12/12/2019-3-is-now-in-the-final-stages-of-beta-testing/
    (+ comment sekce!)

    SLASH: Bez zalohy NIKDY nezkousej upgradnout!
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    SLASH: rozhodne zkopiruj cely adresar. I minor upgrady muzou rozbit vsechno mozne, automaticke opravy zmen ne vzdy zafunguji.
    Myslim ze tentokrat tam zadna breaking change neni, ale... upgrade unity me mnohokrat kvalitne vyjebal :) (uznavam, delam s nim od verze 2...)
    SLASH
    SLASH --- ---
    Uz sa vam niekomu stalo ze po upgrade na novu verziu Unity sa vam rozhasil projekt na ktorom ste mesiace pracovali? Da sa to riesit?

    Pytam sa preto , lebo cakam ze vyjde 2019.3 a su tam niektore features na ktore sa tesim, ale zaroven pouzivam niektore externe kniznice, a obavam sa problemov zo spatnou kompatibilitou.

    A viem ze ked sa projekt otvori v novej verzii, musi sa prekompilovat a uz sa nebude dat otvorit v starej verzii ci ano?

    Doporucujete si ten projekt pre istotu zalohovat? Pouzivam na zalohovanie Collab, ale nebude lepsie cely projekt adresar skopirovat pred tym nez ho otvorim v 2019.3ke?
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    asi takhle - out by mel byt o neco rychlejsi, automaticky bych pouzil ten. (mimo jine teda proto, ze tuply v unity dlouho nebyly a ja tim padem nejsem moc zvykly pouzivat novejsi featury c#... a nektere z nich jako linq jsou v unity vetsinou dost blby napad). plus si nejsem jisty, jak by to bylo s alokaci u tuplu, out int je urcite bezpecny (a kompilator to muze vratit v hodne optimalni forme).

    takze neco jako

    public delegate void GetItemsDelegate(out int p1, out int p2);
    public GetItemsDelegate getItemsRemaining;


    a pak

    int p1, int p2;
    getItemsRemaining(out p1, out p2);
    SLASH
    SLASH --- ---
    SHIGORBIRDMAN: super, dobre vediet, prepisem si to.. akurat teraz riesim taky problem mozno by si vedel spravnu odpoved.

    Na konci levelu, ked to user nestihne dohrat v stanovenom case sa objavi game over / time up screen, kde bude mimo ine veci informacia typu:

    Found: 12/15 Items

    tych 12 a 15 su premenne ktore potrebujem vytiahnut z triedy "GuessItemPanel". Ale aby to nebolo take jednoduche, :( tento panel sa Instantiatuje z inej triedy (UIManager) ktory je volany z hlavnej game class.
    Ten UIManager class ale ma referenciu na ten GuessItemPanel.

    V ramci OOP principu encapsulation (black box behaviour) by som potreboval aby vsetky tie classes nevedeli toho o sebe viac ako je to nevyhnutne. Takze chcel som to vyriesit tak ze

    1) na mojej TimeOutPanl class bude
    public Action getItemsInfo; //toto je field nie method

    2) na GuessItemPanel bude metoda ktora vrati hodnoty (12,15)
    napr private ? getItemsRemaining()
    return {itemsRemaining:12, itemsTotal:15} //pseudocode

    3) Ui manager to vsetko prepoji
    cize potom ako vytvori Prefab, potom tu Action z GuessItemPanen pripise k field getItemsInfo na TimeOutPanel..

    Hlavny problem je v spravnej implementacii, ako to typovo osetrit aby ta metoda getItemsRemaining vracal 2 parametre
    ako zadefinovat ten Action field aby tam bol spravny type
    Ako sa potom dostat k tym premennym

    Podla toho co som si googlil, sa na to daju vyuzit 2 veci :

    Tuple alebo out

    Na obidve som ale zatial nenasiel priklady napriklad na ako to spravne zadefinovat pre Action field, alebo v pripade out ako to zadefinovat pre method return type?

    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    kdyz pouzijes dictionary(int,bool ) , budes to mit bez alokace a rychlejsi (a bezpecnejsi :)
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    SLASH: hashtable vzdycky boxuje - protoze jako klic se pouziva hash z objektu. dictionary s intem jako klic neboxuje a je afaik pro vetsinu use cases lepsi nez hashtable... pokud teda nutne nepotrebujes mapu, ktera nema specifikovany typ ani pro klice, ani pro obsah
    SLASH
    SLASH --- ---
    SHIGORBIRDMAN: dik za reply!

    shownItemsList je definovany ako Hastable, nie som si isty aky je rozdiel medzi Hastable a Dictionary a ktory sa viac hodi pouzit kedy. ten sceneIDX je int.

    Takze tam zase dochadza k boxingu v zmysle ze sa ten int musi konvertovat na object zrejme?

    Kdezto key v Dictionary je stale int?

    A nie, toto nie je prilis casto volany kod, v ziadnej slucke, ani v unity lifecycle event, len ked user pouzije tento specialny Power-up, cize tak max 3-8 x za hru.
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    (jinak... pokud je to nejaka metoda co se vola jen tak obcas, tak bych to asi neresil. sem tam nekde nejaky bajt je v klidu, pruser nastava, kdyz mas neco v timeticku nebo jinde kde se to vola fakt casto)
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    SLASH: jak je definovany shownItemsList? k boxingu by nemelo dochazet, pokud je to dictionary a klic je CISTY int. pokud je sceneIDX enum, tak se to bude boxovat, pokud nedodas pri inicializaci svuj custom comparer
    SLASH
    SLASH --- ---
    Potom co som si nainstaloval Heap Allocations Viewer, Rider ma teraz upozornuje na boxed allocations. Myslim ze pre spravnu memory management a Garbage Collector je dolezite na toto si dat pozor, ale nie som si isty ako to riesit?

    Napriklad v tomto pripade ten kod uklada do hastable zaznam o objektoch ktore uz boli kliknute a vybera stale nejake nove..

    (len tak pre upresnenie, ide o hru typu Hiddon Object , kde user klika na objekty skryte v scene, a tento konkretny kod je pouzity v powerup-u kde system najde automaticky 3 objekty za usera)

    SLASH
    SLASH --- ---
    SHIGORBIRDMAN: dik za nasmerovanie, vyzera to na super uzitocne funkcionality!
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    samozrejme se daji delat tuny dalsich veci, nejruznejsi custom handly, editacni prvky atd. tohle je z meho pohledu jedna z nejsilnejsich veci na unity, to jak snadno se da editor vylepsovat a upravovat.
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    SLASH:
    Unity - Manual: Custom Editors
    https://docs.unity3d.com/Manual/editor-CustomEditors.html

    oznacis classu zdedenou z Editor jako custom inspector pro tvuj specificky typ. overridnes si oninspectorgui a bud ho uplne nahradis, nebo si tam pridas vlastni tlacitka / polozky atd. a pak po kliku na objekt uvidis vlastni polozky, takze si tam muzes udelat tlacitka pro "save current status" a podobne, nebo proste ruzne editacni nastroje, validaci atd.

    uzitecna vec na velmi rychle pridavani neceho je context menu
    Unity - Scripting API: ContextMenu
    https://docs.unity3d.com/ScriptReference/ContextMenu.html

    metodu v objektu omarkujes dekoratorem - a pak se ti objevuje po right clicku na properties na objektu a muzes ji spustit (uzitecne pro ruzne resety, runtime testy atd)

    SLASH
    SLASH --- ---
    SHIGORBIRDMAN: custom inspectory a editory? Please do tell! O co sa jedna?
    SHIGORBIRDMAN
    SHIGORBIRDMAN --- ---
    GILTAR: smoothuj tu rotaci a delej ji dependent na delce framu
    transform.rotation = Quaternion.Lerp(transform.rotation, nowrotation, rotateSpeed * Time.deltaTime); (nebo fixed, podle toho, kde to budes mit

    v tvem pripade je to navic na rigidbody, takze bys mel pouzivat spis rotaci na rigid body nez primo transformaci (i kdyz fakt nevim, jestil u rigidbody 2d to ma nejaky vliv)
    Kliknutím sem můžete změnit nastavení reklam