我正在尝试在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 = ;
}
但是一旦我试图控制预制件的位置,我就会遇到一些错误:
我只是错误地传递了参数吗?我究竟做错了什么?这有可能吗?我习惯在AS3中这样做,它很简单:
{{1}}
我正在尝试避免设置类级变量并在检查器中将预制件拖到它上面。我觉得这会限制我的选择,但我正在听取任何建议。
Here's what it looks like when it works with just a string passed
答案 0 :(得分:3)
您收到错误,因为没有为Instantiate函数提供正确的参数。最好阅读doc。
这就是它的样子:
Instantiate(Object original, Vector3 position, Quaternion rotation);
这是您尝试使用它的方式:
Instantiate(Object original, float position, float rotation);
那是因为xPos
和yPos
都是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();
}