Как я могу обратиться к сценарию, тип которого я не знаю?

Моя игра использует множество различных режимов игры, и яЯ хотел бы создать другой сценарий GameController в начале сцены в зависимости от выбранного режима игры. Затем другие элементы (например, враги) будут ссылаться на основной GameController, будь то GameController_Mode1, GameController_Mode2 и т. Д. Но как я могу иметь другие объекты, ссылающиеся на это, если я нене знаешь тип?

Unity iOS требует строгой типизации Uniscript, поэтому я могуне используй утку, чтобы обойти это.

Ответы на вопрос(2)

Решение Вопроса

полиморфизм, Получите все ваши контроллеры из одного базового класса контроллеров. Тогда ваш GameControllervar может быть установлен на любое создание производного контроллера (см.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
}

делаю какие-либо предположения, что ваши игровые контроллеры имеют общие имена функций и что единственным отличием является код в каждой функции.

[Обновить]

Что касается ГейзенбугКомментарий ниже: Вы можете использовать GetComponent для получения контроллера базового класса, если ваш контроллер является компонентом.

BaseClass (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
 Jerdak27 мая 2013 г., 18:53
@Essential Подкласс (расширенный класс) может определять любые переменные и функции, которые ему нравятся, но вы можете 'не вызывайте их напрямую, если вы не знаете, на какой подкласс вы указываете иЭто совсем другой вопрос.
 Jerdak27 мая 2013 г., 14:34
@ Heisenbug Когда ты это говоришьвсе еще трудно получить доступ к базовому классу из другого скрипта, вы имели в виду другой GameObject? Потому что я могу легко переместить свой базовый класс в отдельный файл сценария, и он работает как положено.
 Essential27 мая 2013 г., 17:05
ВОТ ЭТО ДА! Это работает отлично. Большое спасибо, Джердак. Я не очень опытен, используяпродолжается ключевое слово. Я'Вы пытались прочитать об этом, но я прав, думая, что это означает, что это базовый класс + расширенный класс (добавление какого-либо дополнительного кода в базовый класс)? Или может расширенный класстолько использовать переменные и функции, которые существуют в базовом классе? В любом случае, это довольно мощно. Я люблю этот сайт! :)
 Jerdak27 мая 2013 г., 14:45
Я обратился кgetcomponent комментарий в моем обновлении выше.

похоже, уже есть несколько хороших ответов, но стоит упомянуть Unity 'Система SendMessage. Это действительно простой подход, если все, что вам нужно сделать, это вызвать функции другого объекта SendMessage.

http://docs.unity3d.com/Documentation/ScriptReference/GameObject.SendMessage.html

Короче говоря, вы можете использовать следующий синтаксис:

TargetGameObject.SendMessage("targetFunction", argument, SendMessageOptions.DontRequireReceiver);

Вы также можете использовать SendMessage для вызова функций JavaScript из сценариев C # или наоборот.

 Luke Noonan29 мая 2013 г., 03:54
Jerdak»Решение наверняка будет работать лучше, но для быстрых вещей SendMessage () довольно круто.
 Essential28 мая 2013 г., 21:44
Спасибо Люк, я нене думаю о SendMessage (). Был бы простой вариант, хотя я считаю, что по-видимому, медленнее, чем Jerdak 'с метод.

Ваш ответ на вопрос