2013-05-27 3 views
0

내 게임은 다양한 게임 모드를 사용하며 선택한 게임 모드에 따라 장면 시작 부분에 다른 GameController 스크립트를 생성하고 싶습니다. 그런 다음 GameController_Mode1, GameController_Mode2 등이 아닌 다른 항목 (예 : Enemies)은 기본 GameController를 참조합니다. 그러나 유형을 모르는 경우 어떻게 다른 객체를 참조 할 수 있습니까?스크립트의 주소를 어떻게 알 수 있습니까?

Unity iOS에는 엄격한 유니 코드 문자 입력이 필요하므로이 문제를 해결하기 위해 오리 입력을 사용할 수 없습니다.

답변

4

C#, polymorphism에서와 같은 방식으로이 작업을 수행 할 수 있습니다. 단일 기본 Controller 클래스에서 모든 컨트롤러를 파생시킵니다. 그런 다음 GameController var은 파생 된 컨트롤러의 인스턴스화로 설정할 수 있습니다 (아래 예에서 Start() 참조). 내가 어떤 가정 당신의 gamecontrollers 공유 함수 이름을 만들고 유일한 차이점은 각 기능의 코드라고 해요

#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 
} 

: 여기

간단한 컨트롤러를 사용하여 간단한 예이다.

아래 Heisenbug의 의견에 대해서 [업데이트]

: 컨트롤러가 구성 요소 인 경우는 기본 클래스 컨트롤러를 얻을 수 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 
+0

@Heisenbug 다른 스크립트에서 기본 클래스에 액세스하는 것이 여전히 어렵다고 말하면 다른 GameObject를 의미합니까? 내 기본 클래스를 별도의 스크립트 파일로 쉽게 이동할 수 있으므로 예상대로 작동합니다. – Jerdak

+0

위의 업데이트에서'getcomponent' 주석을 다루었습니다. – Jerdak

+0

와우! 이것은 완벽하게 작동합니다. Jerdak 대단히 감사합니다. 'extends'키워드를 사용해 본 경험이 없습니다. 나는 그것에 대해 읽으려고했지만 기본 클래스 + 확장 된 클래스 (추가 클래스를 기본 클래스에 추가 함)를 의미한다고 생각하는 것이 맞습니까? 또는 확장 클래스 **는 기본 클래스에 존재하는 변수 및 함수 만 사용할 수 있습니까? 어느 쪽이든, 이것은 꽤 강력합니다. 나는이 사이트를 좋아한다!:) – Essential

1

좋은가있는 것처럼 보이지만 대답은 이미 있지만 Unity의 SendMessage 시스템을 언급 할 가치가 있습니다. 다른 객체 인 SendMessage에서 함수를 호출하면됩니다.

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

또한 sendMessage 첨부 그 반대의 C# 스크립트 나에서 자바 스크립트 함수를 호출 할 수 있습니다 : 한마디로

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

는 다음과 같은 구문을 사용할 수 있습니다.

+0

감사합니다. Luke, 나는 SendMessage()에 대해 생각하지 않았습니다. Jerdak의 방법보다 성능이 느린 것 같습니다. – Essential

+0

Jerdak의 솔루션이 더 잘 수행 될 것입니다. 그러나 빠른 물건 인 SendMessage()는 꽤 좋습니다. –