Autor Wątek: C# script unoszenie obiektu do góry i do dołu  (Przeczytany 3465 razy)

Offline kozuya

  • Użytkownik

# Sierpień 16, 2014, 22:14:58
Witam,

nie mogę wyobrazić sobie jak powinien wyglądać skrypt odpowiedzialny za unoszenie się obiektu i opadanie

ogólnie to próbuje zmienić transform.position.y i mam błąd

Cannot modify a value type return value of `UnityEngine.Transform.position'.

void Update () {
      transform.position.y = 5;
}

jak mogę zrobić żeby obiekt unosił się i opadał np umieszczam obiekt na wysokości 5 i unosi się on o 2 i opada do 3 i znów do góry do 7 itd.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline revo

  • Użytkownik

# Sierpień 16, 2014, 22:30:55
Musisz zmienić wartość property position, a nie pojedyńczą składową. C# nie pozwala na taką konstrukcję ;)

Offline Amun

  • Użytkownik

# Sierpień 16, 2014, 22:54:30
Pobierz Position do zmiennej tymczasowej tego samego typu, zmodyfikuj wartość y i ustaw Position.
Ot taki design c# ;)

Offline kozuya

  • Użytkownik

# Sierpień 16, 2014, 23:27:18
hmm

public Vector2 pos = transform.position;

update()
{
pos.position.y += 1;
}

jakoś tak ?

Offline timus

  • Użytkownik

# Sierpień 16, 2014, 23:35:02
raczej tak:
void update()
{
  Vector3 pos = transform.position;
  pos.y += 1 * Time.deltaTime;
  transform.position = pos;
}
« Ostatnia zmiana: Sierpień 16, 2014, 23:36:59 wysłana przez timus »

Offline kozuya

  • Użytkownik

# Sierpień 16, 2014, 23:53:07
no dobrze, teraz jak mam sprawdzić przebytą odległość i zmienić kierunek

wydaje mi się że powinno to być tak

maxWysokość * Mathf.Sin(pos * (Mathf.PI/180));

czyli

pos.y += 1 * Time.deltaTime;
transform.position = 3  *  Mathf.Sin(pos * (Mathf.PI/180));

tylko że Mathf.Sin wymaga jednego parametru float

a przez to że pos to vector3 nie można zmienić wartości na float.

Offline timus

  • Użytkownik

# Sierpień 16, 2014, 23:59:09
Mozna prostu dodawać sobie drogę przebyta w każdym Update'cie i w momencie gdy osiągnie ona jakąś tam wartość odwracamy kierunek. Co do wersji z sinusem to nie wrzucaj do niego całego position tylko pos.y.

Offline kozuya

  • Użytkownik

# Sierpień 17, 2014, 13:55:17
hmm jakiś głupi jestem dawno nie pracowałem w c#

na początku projektu dodaje public Vector3 start_pos = transform.position;

w update zrobiłem

      if (start_pos.y >= start_pos.y + 3) {
         pos.y -= 7;
         transform.position = pos;
      }
      if (start_pos.y <= start_pos.y - 3) {
         pos.y += 7;
         transform.position = pos;
      }

błąd

A field initializer cannot reference the nonstatic field, method, or property `UnityEngine.Component.transform'

Offline ArekBal

  • Użytkownik

# Sierpień 17, 2014, 15:23:56
Cytuj
A field initializer cannot reference the nonstatic field, method, or property `UnityEngine.Component.transform'
Cytat: translate.google.com
Inicjator pole nie może odwoływać się do nonstatic pola, metody lub właściwości UnityEngine.Component.transform

Cytat: me
Inicjalizator pola nie może odwoływać się do niestatycznych pola, metody, lub własciwości: "UnityEngine.Component.transform"

To
Vector3 start_pos = transform.position; zmień na
Vector3 start_pos;a do konstruktora wrzuć to:
start_pos = transform.position
« Ostatnia zmiana: Sierpień 17, 2014, 15:25:58 wysłana przez ArekBal »

Offline kozuya

  • Użytkownik

# Sierpień 17, 2014, 20:49:18
ok działa tylko że warunki mi nie działają
dodałem bool dirUp= true;

if(dirUp)
pos.y +=1;

if(pos.y >= startpos+3)
pos.y -=1;
dirUp = false;

if(pos.y <= startpos -3)
dirUp = true;

nie ma błędów a obiekt cały czas ucieka do góry.

Offline Nsuidara

  • Użytkownik
    • Site

# Sierpień 17, 2014, 21:33:04
ok działa tylko że warunki mi nie działają
dodałem bool dirUp= true;

if(dirUp)
pos.y +=1;

if(pos.y >= startpos+3)
pos.y -=1;
dirUp = false;

if(pos.y <= startpos -3)
dirUp = true;

nie ma błędów a obiekt cały czas ucieka do góry.

jak nie ma błędu ?
na początku masz "bool dirUp= true;"
dodasz potem +1 a potem masz ciągle "false"

nie powinno być w stylu
Cytuj
if(dirUp)
pos.y +=1;
else
pos.y -=1;

if(pos.y >= startpos+3)
dirUp = false;
else if(pos.y <= startpos -3)
dirUp = true;
coś tego deseń ?

Offline Amun

  • Użytkownik

# Sierpień 17, 2014, 21:57:34
@Nsuidara Jeżeli ma cały czas false, to obiekt powinien pozostać w miejscu... :P Chyba, że
bool dirUp= truejest również w update, to wtedy obiekt zasuwa do góry.

@kozuya pokaż całą funkcję Update obiektu oraz gdzie i jak są ustawiane zmienne, których używasz w tej funkcji... :)

Offline Nsuidara

  • Użytkownik
    • Site

# Sierpień 17, 2014, 23:16:39
@Amun ?? nie rozumiem Cie, jasne powiedziane ze ma obiekt poruszać się do opadać i unosić się.
[po kodzie też to widać]

Wnioskować można ze jeśli dirUp jest false to obiekt ma iść w dół... bo "nie jest to prawdą ze unosi się"
choć w tym znaczeniu powiedział bym kierunek nie jest unoszenia się a opadania... (jeśli false)

więc skąd wniosek ze kiedy dirUp jest false to obiekt nie porusza się ?
chyba jakby było dirUp = false i dirDown = false a tutaj nie mamy takiego czegoś jak dirDown :P

@edit
ale nie ważne.... chodzi o to ze Kolega Autor tematu zrobił kod taki który powoduje ze obiekt będzie dostawał += 1 zawsze :] bo warunki są złe ...
« Ostatnia zmiana: Sierpień 17, 2014, 23:18:31 wysłana przez Nsuidara »

Offline koirat

  • Użytkownik

# Sierpień 17, 2014, 23:35:25
@kozuya spróbuj tak

Vector3 positionA;
Vector3 positionB;

float time=0;

void Update(float dTime){
    time+=dTime;

float k = Sin(time)*0.5+0.5; //zwraca wartości od <0,1>
Vector3 newPosition = positionA*k+ positionB*(1-k);
}


Offline Amun

  • Użytkownik

# Sierpień 18, 2014, 01:03:29
@Amun ?? nie rozumiem Cie, jasne powiedziane ze ma obiekt poruszać się do opadać i unosić się.
[po kodzie też to widać]
Wiem, jak ma się zachowywać obiekt... ale wg mnie, z jego kodu wynika, że obiekt:
 - dirUp = true - w konsekwencji zostanie dodane pos.y += 1;
 - następnie dirUp jest ustawiane po 2 if'ie na false
 - trzeci warunek nie jest spełniony
Kolejne przejście Update:
 - dirUp = false - pierwszy warunek pominięty
 - nie zachodzą żadne zmiany, czyli 2 i 3 warunek przez cały czas są niespełnione...

Czy się mylę? :D