2017-01-22 72 views
0

我正在构建一个游戏并遇到问题。我试图按下“跳转”按钮时实例化一个对象,并试图给实例化的对象在指定位置之间的随机位置。然而,我的Instantiate函数只接受一个“Transform”变量,因为它是第二个参数,并没有像任何位置一样接受任何Vector3值。Unity C# - '实例化'只接受“变换”,而不是'实例化对象位置'的'Vector3'

有人可以告诉我为什么,这个问题的解决方案是什么?这是代码:请注意Update函数中的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);过载,因为这是最接近的过载。

但是garbagePositionVector3而第二个参数期望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