Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

Diskuze: Jak zavolat vector3 z třídy pole vectorů?

C# .NET .NET (C# a Visual Basic) Jak zavolat vector3 z třídy pole vectorů? American English version English version

Aktivity (3)
Avatar
Miroslav Mazal:16. září 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. září 21:39
Avatar
Odpovídá na Miroslav Mazal
Miroslav Mazal:16. září 21:48

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

 
Nahoru Odpovědět 16. září 21:48
Avatar
Odpovídá na Miroslav Mazal
Matyáš Černohous:16. září 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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 16. září 23:33
Avatar
Miroslav Mazal:16. září 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. září 23:45
Avatar
simon.steiner:16. září 23:45
Vectors vectors = new Vectors();
Vector3 vector = vectors.poleVectoru[1, 3];

Možná by ti mohla pomoct struktura Matrix4x4.

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

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

 
Nahoru Odpovědět 16. září 23:47
Avatar
Odpovídá na simon.steiner
Miroslav Mazal:17. září 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. září 1:38
 
Nahoru Odpovědět 17. září 1:37
Avatar
Miroslav Mazal:17. září 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. září 3:31
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Miroslav Mazal
Martin Petrovaj:17. září 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. září 7:42
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Odpovídá na Martin Petrovaj
Miroslav Mazal:17. září 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. září 9:28
Avatar
Miroslav Mazal:17. září 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. září 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.