我怎样才能解决一个我不知道类型的脚本?

时间:2013-05-27 01:14:03

标签: unity3d unityscript

我的游戏使用各种不同的游戏模式,我想根据所选的游戏模式在场景的开头产生不同的GameController脚本。然后其他项目(例如,敌人)将引用主GameController,无论是GameController_Mode1,GameController_Mode2等。但是如果我不知道类型,我怎么能有其他对象引用它?

Unity iOS需要严格的unityscript输入,所以我不能使用duck typing来解决这个问题。

2 个答案:

答案 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函数,反之亦然。