2017-01-22 18 views
0

Я создаю игру и столкнулся с проблемой. Я пытаюсь создать экземпляр объекта, когда нажата кнопка «Перейти», и я пытаюсь дать экземпляру объекта случайную позицию между указанным местом. Тем не менее, моя функция Instantiate принимает только переменную «Transform», поскольку она является вторым аргументом и не принимает никаких значений Vector3 для позиции, как это обычно бывает.Unity C# - «Instantiate» принимает только «Transform», а не «Vector3» для позиции объекта-объекта

Может кто-нибудь, пожалуйста, скажите мне, почему, и каково решение этой проблемы? Это код: обратите внимание на функцию Instantiate в функции «Обновить», вот где я столкнулся с проблемой. Я хотел бы использовать Vector3 garbagePosition в качестве второго аргумента. Благодарю.

public Transform ground; 

public GameObject garbage; 

public float loadTime; 

public int numberOfObjects; 

private Queue<Transform> groundQueue; 

public Vector3 startPosition; 
public Vector3 nextPosition; 

// Use this for initialization 
void Start() { 

    nextPosition = startPosition; 
    groundQueue = new Queue<Transform>(numberOfObjects); 

    for(int i = 0; i<numberOfObjects; i++) 
    { 
     groundQueue.Enqueue((Transform)Instantiate(ground)); 
    } 

    for(int j = 0; j<numberOfObjects; j++) 
    { 
     Recycle(); 
    } 

} 

// Update is called once per frame 
void Update() { 

    if (groundQueue.Peek().localPosition.z + 10 < PlayerScript.playerDistance) 
    { 
     Recycle(); 
    } 

    if (Input.GetButtonDown("Jump")) 

    { 
     Vector3 garbagePosition = new Vector3(Random.Range(-4, 4), 
               0.5f, 
               PlayerScript.playerDistance + Random.Range(10, 20)); 

     Instantiate(garbage, garbagePosition); 

     loadTime += Time.time; 
    } 
} 

private void Recycle() 
{ 
    Transform item = groundQueue.Dequeue(); 
    item.localPosition = nextPosition; 
    nextPosition.z += item.localScale.z; 
    groundQueue.Enqueue(item); 
} 

}

ответ

2

Эти функции Instantiate перегрузки:

public static Object Instantiate(Object original); 
public static Object Instantiate(Object original, Transform parent); 
public static Object Instantiate(Object original, Transform parent, bool instantiateInWorldSpace); 
public static Object Instantiate(Object original, Vector3 position, Quaternion rotation); 
public static Object Instantiate(Object original, Vector3 position, Quaternion rotation, Transform parent); 

При вызове Instantiate(garbage, garbagePosition); с двумя параметров, он будет использовать перегрузку public static Object Instantiate(Object original, Transform parent);, потому что это самая близкая от перегрузки, так как она принимает два параметра ,

Но garbagePosition является Vector3, а второй параметр ожидает Transform не Vector3.

Необходимо использовать перегрузку public static Object Instantiate(Object original, Vector3 position, Quaternion rotation);. Поэтому, чтобы перейти в положение Vector3, вы также должны пройти поворот/Quaternion.

Если у вас нет вращения, чтобы передать его, вы можете просто передать его Quaternion.identity, что означает отсутствие вращения.

Instantiate(garbage, garbagePosition); 

должен быть

Instantiate(garbage, garbagePosition, Quaternion.identity); 
+0

Ааа! Я нашел решение в использовании GameObject garb = Instantiate (мусор), а затем вручную установил garb.transform.position = garbagePosition. Ваш метод тоже работает, и он правильный. – user3324792

+0

«Я нашел решение при использовании« Что это значит? – Programmer

+0

Просто увидел ваше редактирование. Да, это еще один способ сделать это. Мой ответ заключается в том, чтобы решить вашу проблему и почему у вас это есть. – Programmer