Diskuze: Jak zavolat vector3 z třídy pole vectorů?
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 11 zpráv z 11.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Samozřejmě jsem napsal Vectors vector = new Vectors(); ale jak teď zavolat konkrétní Vector pomocí indexu?
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);
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.
Vectors vectors = new Vectors();
Vector3 vector = vectors.poleVectoru[1, 3];
Možná by ti mohla pomoct struktura <code>Matrix4x4</code>.
Psal jsem to nějak dlouho, předtím tu ještě nic nebylo.
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.
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;
}
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á).
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é.
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;
}
Zobrazeno 11 zpráv z 11.