我的游戏使用各种不同的游戏模式,我想根据所选的游戏模式在场景的开头产生不同的GameController脚本。然后其他项目(例如,敌人)将引用主GameController,无论是GameController_Mode1,GameController_Mode2等。但是如果我不知道类型,我怎么能有其他对象引用它?
Unity iOS需要严格的unityscript输入,所以我不能使用duck typing来解决这个问题。
答案 0 :(得分:4)
您可以像在C#中polymorphism那样执行此操作。从单个基本Controller类派生所有控制器。然后您的GameController var
可以设置为派生控制器的任何实例化(请参阅下面示例中的Start()
)。
以下是使用简单控制器的简单示例:
#pragma strict
var controller : MyController;
class MyController {
var data : int;
public function MyController(){
this.data = 42;
}
public function Print(){
Debug.Log("Controller: " + this.data);
}
}
class MyController1 extends MyController {
public function MyController1(){
this.data = 43;
}
public function Print(){
Debug.Log("Controller1: " + this.data);
}
}
class MyController2 extends MyController {
public function MyController2(){
this.data = 44;
}
public function Print(){
Debug.Log("Controller2: " + this.data);
}
}
function Start () {
controller = new MyController();
controller.Print(); // prints Controller: 42
controller = new MyController1();
controller.Print(); // prints Controller1: 43
controller = new MyController2();
controller.Print(); // prints Controller2: 44
}
我假设你的gamecontrollers共享函数名称,唯一的区别是每个函数中的代码。
<强> [更新] 强>
关于Heisenbug的评论如下:如果您的控制器是一个组件,您可以使用GetComponent来获取基类控制器。
基类(BaseController.js):
class BaseController extends MonoBehaviour{
public function Print(){
Debug.Log("BaseController");
}
}
扩展类(Controller1.js):
class Controller1 extends BaseController {
public function Print(){
Debug.Log("Controller1: " + this.data);
}
}
测试:
var controller : BaseController;
controller = gameObject.GetComponent("BaseController"); //.GetComponent(BaseController) also works
controller.Print(); // will print "Controller1" if actual attached component is a Controller1 type
答案 1 :(得分:1)
虽然看起来已有一些好的答案,但值得一提的是Unity的SendMessage系统。如果你需要做的就是在另一个对象SendMessage上调用函数,这是一个非常简单的方法。
http://docs.unity3d.com/Documentation/ScriptReference/GameObject.SendMessage.html
简而言之,您可以使用以下语法:
TargetGameObject.SendMessage("targetFunction", argument, SendMessageOptions.DontRequireReceiver);
您还可以使用SendMessage从C#脚本调用javascript函数,反之亦然。