• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zamiana obiektów miejscami (Unity, C#)

VPS Starter Arubacloud
0 głosów
475 wizyt
pytanie zadane 6 lutego 2020 w C# przez Sic Dyskutant (8,510 p.)

Witam

Stworzyłem skrypt, który w żaden sposób nie równa się z moim oczekiwaniami. Mianowicie, zależy mi na tym, aby obiekty zamieniały się miejscami przez czas działania programu (kod powinien to powodować). W dodatku w drugiej jego części zależy mi na tym, aby spowolnić lub dodać czas w jakim tempie zamiana będzie się odbywała.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Swapping : MonoBehaviour
{
    public Transform object1;
    public Transform object2;
    Vector3 tempPos1;
    Vector3 tempPos2;
    IEnumerator swapObjects()
    {
        while (true)
        {
            Swap();
            yield return null;
        }
    }

    void Swap()
    {
        var temp = object1.transform.position;
        object1.transform.position = object2.transform.position;
        object2.transform.position = temp;
    }
}

Czy jest ktoś wstanie powiedzieć mi co może powodować obecny problem z nie wykonywaniem się zamieny miejsc obiektów.

1 odpowiedź

0 głosów
odpowiedź 6 lutego 2020 przez Bondrusiek Maniak (61,370 p.)

Do przyspieszania bądź spowolniania czasu w Unity służy zmienna

Time.timeScale

https://docs.unity3d.com/ScriptReference/Time-timeScale.html

PS.

Gdzie wywołujesz funkcję swapObjects() (w Unity z tego co wiem nazwy funkcji powinny zaczynać się z wielkiej litery). Możesz kontrolować czas działania funkcji w tle poprzez np.:

yield return new WaitForSeconds(.1f);
komentarz 6 lutego 2020 przez Sic Dyskutant (8,510 p.)
wywołuje Swap() - jak się nazywa funkcja, która stworzyłem nie ma większego znaczenia (to można zmienic w kazdej chwili). To jednak nie rozwiązuje problemu że obiekty nie zamieniają swoich pozycji.
komentarz 6 lutego 2020 przez Bondrusiek Maniak (61,370 p.)

Ok, może zamiast używać Coroutine spróbuj wywołać funkcje Swap() w funkcji Update() i sprawdź czy działa. Może też być problem z czasem gdyż używasz zwracasz null i dlatego nie widać.

    void Update()
    {
        if (Input.GetKeyDown("space"))
        {
            Swap();
        }
    }

ewentualnie możesz użyć funkcji debuggujących:

    void Swap()
    {
        Debug.Log("before object1: " + object1.transform.position);
        Debug.Log("before object2: " + object2.transform.position);
        var temp = object1.transform.position;
        object1.transform.position = object2.transform.position;
        object2.transform.position = temp;
        Debug.Log("after object1: " + object1.transform.position);
        Debug.Log("after object2: " + object2.transform.position);
    }

i zobaczyć czy zmieniają położenie.

komentarz 6 lutego 2020 przez Sic Dyskutant (8,510 p.)
Pokazują się jedynie komunikaty bez zmiany miejsc. Wiadomości pokazują te same pozycje przed i po.
komentarz 6 lutego 2020 przez Bondrusiek Maniak (61,370 p.)

Tzn że obiekty nie zamieniają się. Spróbuj jeśli możesz dodaj do tych obiektów komponent Rigidbody, który jest odpowiedzialny za dynamikę ciała. I wtedy do pozycji możesz się odwołać poprzez komponent w 2D:

    object1.GetComponent<Rigidbody2D>().transform.position = object2.GetComponent<Rigidbody2D>()..transform.position;
    object2..GetComponent<Rigidbody2D>().transform.position = temp;

 

komentarz 7 lutego 2020 przez Sic Dyskutant (8,510 p.)
Zmieniły pozycje ! Jednak oba obiekty po prostu "spadły" na dół. Mimo to jest to krok na przód dzieki.
komentarz 7 lutego 2020 przez Bondrusiek Maniak (61,370 p.)
Zamien typ ciała z Dynamic na Static lub możesz ustawić grawitacje dla tych obiektów dynamicznych na zero ale dalej na nie bd działać inne siły.
komentarz 7 lutego 2020 przez Sic Dyskutant (8,510 p.)
Po zmianie na static lub kinematic obiekty pozostają w miejscu.
komentarz 7 lutego 2020 przez Bondrusiek Maniak (61,370 p.)
To zmień im typ na Dynamic i ustaw im grawitacje na 0 lub ustaw na zero grawitacje świata. Wtedy nie powinny spadać a zostać w miejscu.
komentarz 7 lutego 2020 przez Sic Dyskutant (8,510 p.)
Miałeś racje. Pokombinuję z kodem może uda mi się przemiejścić, użyłem funkcji Random, po czym obiekty zmieniły pozycje.

Podobne pytania

0 głosów
1 odpowiedź 198 wizyt
pytanie zadane 24 stycznia 2021 w C# przez kubaa322 Użytkownik (710 p.)
0 głosów
1 odpowiedź 823 wizyt
0 głosów
0 odpowiedzi 117 wizyt
pytanie zadane 14 kwietnia 2022 w C# przez darekz08 Obywatel (1,550 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...