由于Unity构建脚本/预制件的方式,我遇到了问题。
因为我们必须通过Instantiate(Prefab)
实例化脚本,所以我无法运行脚本的构造函数,包括重载。
实施例
class A()
class B(string s1) : base() //Inherits from A
class C(string s1, string s2) : base(string) //Inherits from B
现在我刚刚将构造函数更改为" Init"方法所以;
void Init() {...} //Replaces class A constructor.
void Init(string s1){Init();...} //Replaces class B constructor. This calls Init()
void Init(string s1, string s2){Init(s1);...} //Replaces class C constructor. This calls Init(string)
显然这并不理想,好像我想要初始化C类我冒着运行错误的Init函数的风险,因为我知道没有办法在没有相同签名的情况下重载/覆盖函数。
有没有办法模仿构造函数的工作方式?我可以采用任何特定模式来阻止这种情况发生,因为这种设计显然不是理想的。
答案 0 :(得分:0)
如果你的类派生自MonoBehaviour
,那么可以像你一样使用某种init函数,或者如果适合你可以使用Awake/Start
。如果你的课程并非来自MonoBehaviour("纯c#class")那么你可以使用构造函数。
此外,如果只需要将脚本添加到现有对象,则可以使用AddComponent
添加脚本。
我不太了解你的Init
功能结构。那些是相互呼唤的(从下到上)?
你基本上可以使你的init函数像构造函数。
public void Init(){...} // = empty constructor
public void Init(int a, int b){...} // = constructor with two int parameters
public void Init(int c, string d){...} // = constructor with an int and a string parameter
您可以使用注释,以便在某处使用该函数时获得信息文本,以便了解哪个函数可以执行哪些操作。 (在函数上方使用///
三次斜杠作为函数摘要。)
修改强>
如何打电话的小例子:
GameObject obj_A = (GameObject) Instantiate(prefab_A , ..., ...);
ClassA cls_A = obj_A.GetComponent<ClassA>();
cls_A.Init(5, "hello");
GameObject obj_B = (GameObject) Instantiate(prefab_B , ..., ...);
ClassB cls_B = obj_B.GetComponent<ClassB>();
cls_B.Init();
GameObject obj_C = (GameObject) Instantiate(prefab_C , ..., ...);
ClassC cls_C = obj_C.GetComponent<ClassC>();
cls_C.Init(1, "bye");