Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Miroslav Mazal:16.9.2018 21:39

Zdravím. Vytvořil jsem si třídu , která obsahuje jen pole Vector3. Jak je teď mohu vyvolávat v jiné třídě? Jak by měl vypadat konstruktor?

public class Vectors {

    public Vector3[,] poleVectoru = {
         { new Vector3(-0.46f, 0f, 0f), new Vector3(-0.46f, -0.305f, 0f), new Vector3(-0.46f, -0.61f, 0f), new Vector3(0f, 0f, 0f) },
        { new Vector3(-0.46f, +0.305f, 0f), new Vector3(-0.46f, 0f, 0f), new Vector3(-0.46f, -0.305f, 0f), new Vector3(0f, 0f, 0f) },
        { new Vector3(-0.46f, +0.61f, 0f), new Vector3(-0.46f, +0.305f, 0f), new Vector3(-0.46f, 0f, 0f), new Vector3(0f, 0f, 0f) },
    };

}

Zkusil jsem: Píšu různé varianty kódu a hledám v google...

Chci docílit: Jak vyvolávat Vectory z třídy vectorů.

 
Odpovědět
16.9.2018 21:39
Avatar
Odpovídá na Miroslav Mazal
Miroslav Mazal:16.9.2018 21:48

Samozřejmě jsem napsal Vectors vector = new Vectors(); ale jak teď zavolat konkrétní Vector pomocí indexu?

 
Nahoru Odpovědět
16.9.2018 21:48
Avatar
Odpovídá na Miroslav Mazal
Matyáš Černohous:16.9.2018 23:33
  1. Místo pole bych použil list List<Vector3> vectorArray = new List<Vector3>();
  2. Konstruktor bych udělal bezparametrický a daná třída, která bude obsahovat seznam vektorů bude mít metody pomocí kterých můžeš získat vektor jaký chceš.
public class Vectors {

List<Vector3> vectorArray = new List<Vector3>();

// v konstruktoru můžeš naplnit list vektory, nebo použít metodu níže pro přidání
public Vectors(){

vectorArray.Add(new Vector3(-0.46f, 0f, 0f));
...
...
...

}

/zisk vektoru na indexu
public Vector3 GetVectorAt (int index)
{
        return vectorArray[index];
}

//přidani vektoru
public void AddVector (Vector3 v)
{
        vectorArray.Add(v);
}
}

/////////////

A zavolání:

Vectors vectors = new Vectors();
//vektor na indexu 10
Vector3 v = vectors.GetVectorAt(10);
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
16.9.2018 23:33
Avatar
Miroslav Mazal:16.9.2018 23:45

Ahoj. I když to potřebuji podle mého, díky tvé odpovědi jsem našel svou chybu. Už mi to jede. Moc díky.

 
Nahoru Odpovědět
16.9.2018 23:45
Avatar
simon.steiner:16.9.2018 23:45
Vectors vectors = new Vectors();
Vector3 vector = vectors.poleVectoru[1, 3];

Možná by ti mohla pomoct struktura <code>Matrix4x4</co­de>.

 
Nahoru Odpovědět
16.9.2018 23:45
Avatar
Odpovídá na simon.steiner
simon.steiner:16.9.2018 23:47

Psal jsem to nějak dlouho, předtím tu ještě nic nebylo.

 
Nahoru Odpovědět
16.9.2018 23:47
Avatar
Odpovídá na simon.steiner
Miroslav Mazal:17.9.2018 1:37

Ale ještě mi nejde toto: Mám v = new Vector3(3.2f, 0.0f, 0.0f). Chtěl bych vector v použít k přesunu pozice. Jak se to má napsat ?

     if (Input.GetKeyDown(KeyCode.UpArrow))
         transform.Translate(new Vector3 (v.x, v.y, v.z));

     if (Input.GetKeyDown(KeyCode.RightArrow))
         transform.Translate(new Vector3(v));

if (Input.GetKeyDown(KeyCode.RightArrow))
         transform.Translate(new Vector3(3.2f, 0.0f, 0.0f));

Funguje jen ta třetí varianta. Nemůžu na to přijít, jak místo konkrétních čísel dát proměnnou. Zkouším všemožné varianty.

Editováno 17.9.2018 1:38
 
Nahoru Odpovědět
17.9.2018 1:37
Avatar
Miroslav Mazal:17.9.2018 3:31

Tak už mi to po mnoha hodinách jede. Dával jsem konstruktor do Start a snažil se vytvořit proměnnou v. A pak to v volat. Ale nefungovalo to. Asi pořád ještě něco nechápu. Nakonec jsem ho dal přímo do metody a bez vytvoření veřejné proměnné v.

    if (Input.GetKeyDown(KeyCode.UpArrow))
    {
        transform.Translate(NovyVector(0, 1));
    }

    if (Input.GetKeyDown(KeyCode.RightArrow))
        transform.Translate(new Vector3(3.2f, 0.0f, 0.0f));
}

public Vector3 NovyVector(int x, int y)
{
    Vectors vector = new Vectors();
    Vector3 v = vector.poleVectoru[x, y];
    Debug.Log(v);
    return v;
}
 
Nahoru Odpovědět
17.9.2018 3:31
Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovídá na Miroslav Mazal
Martin Petrovaj:17.9.2018 7:42

Neviaže sa to síce k pôvodnej téme vlákna, ale z tvojho posledného príspevku mám pocit, že problém bol u teba v pochopení tzv. scope-u (niečo ako rozsah, priestor) premennej.

class XClass
{

    YClass memberVariable = new YClass();

    void Method1()
    {
        YClass localVariable = new YClass();

        // oba ďalšie riadky sú správne
        localVariable.DoSomething();
        memberVariable.DoSomething();
    }

    void Method2()
    {
        // compilation error, localVariable je lokálna premenná vytvorená v metóde Method1, mimo nej neexistuje
        // localVariable.DoSomething();

        // tento riadok je v poriadku, memberVariable nie je lokálna premenná a je prístupná v celej triede
        memberVariable.DoSomething();
    }

}

Nie som si poriadne istý, ktorý C# tutoriál na týchto stránkach to poriadne vysvetľuje, ale snáď ti bude rozdiel jasnejší aj z toho jednoduchého príkladu. Veľmi, veľmi zjednodušene sa dá povedať, že k premennej môžeme pristupovať "v tých zložených zátvorkách," v ktorých sme ju vytvorili (a vo všetkých, ktoré sú v nich zanorené hlbšie). Akonáhle program z tých zložených zátvoriek vyjde (napr. dokončí sa cyklus, dobehne metóda, zanikne inštancia), akákoľvek premenná, ktorá bola deklarovaná v tých zložených zátvorkách stráca platnosť (zaniká).

Nahoru Odpovědět
17.9.2018 7:42
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Odpovídá na Martin Petrovaj
Miroslav Mazal:17.9.2018 9:28

Ano. To byl přesně ten problém. Měl jsem představu, že když si někde v metodě vytvořím nějakou proměnnou, třeba "v", a umístím ji na začátek třídy, tak že k ní mám přístup z jakékoli jiné metody ve třídě. Prostě odkudkoli ze třídy. Pak mne to napadlo, tak jsem si všude dal Debug.Log a sledoval jsem, kde to načte hodnoty proměnné a kde ne, kde to napíše nuly. Tak jsem to pak pochopil. Proměnná se uchová pouze v té metodě, a dostanu se pak k ní přes volání té metody. Ještě je otázka, jestli jsem si to ještě nepopletl třeba s atributem nebo vlastnostmi. Musím se k tomu vrátit a znovu si to pročítat, co je co, a jak to funguje. Hlavně rozdíl mezi atributem a proměnnou. Mám pořád pocit, že je to to samé.

 
Nahoru Odpovědět
17.9.2018 9:28
Avatar
Miroslav Mazal:17.9.2018 9:39

Ani takto to nejde. Je to špatně (zase se bavíme o Unity). Je to, jak jsem to popsal výše. Třída Player je v MonoBehaviour a třídu Vectors jsem nechal bez.

public class Player : MonoBehaviour
{
    public object vector;
    Vectors vector = new Vectors();

    void Start()
    {

    }


    public Vector3 NovyVector(int x, int y)
    {
        Vector3 v = vector.poleVectoru[x, y];
        return v;
    }
 
Nahoru Odpovědět
17.9.2018 9:39
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.