Autor Wątek: "Wkładanie" obiektów utworzonych "Instantiate" do innego obiektu jako jego child  (Przeczytany 1839 razy)

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Listopad 01, 2014, 11:25:13
(C#)
Mam skrypt, który generuje mi cuby z prefaba komendą "Instantiate" z użyciem pętli for. Jak zrobić, żeby instancjowany obiekt został dodany jako child innego obiektu, np. empty o nazwie "Ground"?
Między innymi nie wiem jak odwołać się do zinstancjowanego obiektu; jak daję
Object Stone = Instantiate(Kamien, new Vector3(x,0,y), Quaternion.identity);
Stone.transform.parent = Empty.transform;
to wywala mi błędy, że "Object" nie ma właściwości "transform".
Jak próbuję zamiast "Object" dać np. "GameObject", albo "Transform" to też mi wywala podobne błędy.
Proszę o pomoc.

Offline Mr. Spam

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

Offline Rethil

  • Użytkownik

  • +1
# Listopad 01, 2014, 12:59:46
Nie tylko musisz określić typ GameObject Stone = ... lub prościej var Stone =, ale również dodać rzutowanie. Finalnie będziesz miał var Stone = (GameObject)Instantiate(Kamien, new Vector3(x,0,y), Quaternion.identity);

Offline ArekBal

  • Użytkownik

# Listopad 01, 2014, 14:23:08
Nie jestem miszczem Unity, ale obstawiam że obsługuje type inference więc radził bym to upchnąć do własnej  funkcji takiego typu:
T Clone<T>(T o, Vector3 pos=Vector3.zero, Quaternion rot=Quaternion.identity)
{
  return (T)Instantiate(o, pos, rot);
}

To potem (z pomocą wspomnianej inferencji typów) można pisać tak
  var a = Clone(kamien, new Vector3(x,0,y), Quaternion.identity)
i zmienna 'a' będzie tego samego typu co twój kamień.

EDIT:
Z tego co tutaj widzę:
http://docs.unity3d.com/ScriptReference/Object.Instantiate.html

To sama funkcja Instantiate już to robi.

i zwyczajne
var stone = Instantiate(kamien, new Vector3(x,0,y), Quaternion.identity)
(bez rzutowania) powinno wystarczyć.

EDIT2:
Skoro tak się da(ta dokumentacja Unity biorąc pod uwagę ich obroty to jest żart) to obstawiam że da się i w ten sposób jeżeli potrzeba rzutowania:
var stoneJakoGameObject = Instantiate<GameObject>(o, new Vector3(x,0,y), Quaternion.identity);
« Ostatnia zmiana: Listopad 01, 2014, 14:32:32 wysłana przez ArekBal »

Offline timus

  • Użytkownik

  • +1
# Listopad 01, 2014, 15:59:18
        GameObject Stone = (GameObject)Instantiate(Kamien, new Vector3(x, 0, y), Quaternion.identity);
        Stone.transform.parent = Empty.transform;
Chodzi u mnie bez żadnego problemu

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Listopad 01, 2014, 17:32:46
[...]
public Transform Kamien;
public GameObject Empty;
[...]
GameObject Stone = (GameObject)Instantiate(Kamien, new Vector3(x, 0, z), Quaternion.identity);
Stone.transform.parent = Empty.transform;
[...]
wywala mi:
InvalidCastException: Cannot cast from source type to destination type.
@timus: Więc nie działa. :(

Offline timus

  • Użytkownik

  • +2
# Listopad 01, 2014, 17:45:01
Kamien ma byc GameObject'em a nie transformem...
Zastanów się logicznie czy chcesz stworzyć instancje obiektu czy instancje transformacji.

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Listopad 01, 2014, 18:13:53
@timus: Dzięki, poprawiłem, działa, problem rozwiązany. :)

Pozdrawiam, B-DEV.