Unity2D C# - 如何创建一个通用的预制实例化器?

时间:2017-10-16 01:01:55

标签: c# unity3d

我正在尝试在C#中创建一个函数,可以从我的预制文件夹中选择一个预制件,将其添加到游戏中,并允许我根据需要设置该预制件的属性。我现在的功能:

loadObject ("Prefab/BeamPlatform", this.transform.position.x, this.transform.position.y);

我也可以调用该函数并从我班级的任何地方加载预制件:

public void loadObject(string objReference){
    Instantiate(Resources.Load<GameObject>(objReference));
}

//

loadObject ("Prefab/BeamPlatform");

当它只是我传递给函数的字符串时,它起作用了:

public function loadObject(objClass, xPos:Number, yPos:Number){
   var obj = new objClass();
   obj.x = xPos;
   obj.y = yPos;
   obj.otherProperty = ;
}

但是一旦我试图控制预制件的位置,我就会遇到一些错误:

enter image description here

我只是错误地传递了参数吗?我究竟做错了什么?这有可能吗?我习惯在AS3中这样做,它很简单:

{{1}}

我正在尝试避免设置类级变量并在检查器中将预制件拖到它上面。我觉得这会限制我的选择,但我正在听取任何建议。

Here's what it looks like when it works with just a string passed

1 个答案:

答案 0 :(得分:3)

您收到错误,因为没有为Instantiate函数提供正确的参数。最好阅读doc

这就是它的样子:

Instantiate(Object original, Vector3 position, Quaternion rotation);

这是您尝试使用它的方式:

Instantiate(Object original, float position, float rotation);

那是因为xPosyPos都是floats。您需要将它们都转换为Vector3,然后将其传递给Instantiate函数。

这应该有效:

public void loadObject(string objReference, float xPos, float yPos)
{
    Vector3 tempVec = new Vector3(xPos, yPos, 0);
    Instantiate(Resources.Load<GameObject>(objReference), tempVec, Quaternion.identity);

    //I want access to the prefabs properties
}

此外,如果您需要访问实例化的预制属性,则需要获取返回Instantiate函数的对象并将其存储到临时变量中:

public void loadObject(string objReference, float xPos, float yPos)
{
    Vector3 tempVec = new Vector3(xPos, yPos, 0);
    GameObject obj = Instantiate(Resources.Load<GameObject>(objReference), tempVec, Quaternion.identity);

    //I want access to the prefabs properties
    Debug.Log(obj.transform.position);

    string val = obj.GetComponent<YourScriptName>().yourPropertyName;
    obj.GetComponent<YourScriptName>().yourFunctionName();
}