2014-10-19 9 views
3

나는이 문제를 알아 내는데 어려움을 겪고 있으며 나를 돕는 구글을 거의 찾지 못했습니다.다른 GameObject에서 monobehaviour 스크립트를 인스턴스화하는 방법

MonoBehaviour에서 스크립트가 파생되면 "new"키워드를 사용하여 인스턴스를 생성 할 수 없습니다. 벌금. 그래서 저는 이것을 어떻게하는지 살펴 보았습니다. 그리고 GameObject를 얻은 다음, GameComponent를 얻는 것이 갈 길입니다.하지만 아주 멀지는 않습니다.

그래서 저는 GameObject를 호출했습니다. NetworkManager. 그것에 첨부 된 것은 NetworkManager라는 스크립트입니다. 나는 Main이라는 또 다른 GameObject를 가지고 있는데 Main (놀람!)이라는 스크립트가 붙어있다. 기본적으로 내가하고 싶은 일은 networkManager.hostServer() 또는 networkManager.kickPlayer()와 같은 일을 할 수 있도록 기본 스크립트 내에서 네트워크 관리자를 "인스턴스화"하는 것입니다.

이 내 main.cs 스크립트입니다 :

public class Main : MonoBehaviour { 

Player player; 
GameObject networkManager; 
UiManager uiManager; 

// Use this for initialization 
void Start() 
{ 

    player = new Player(Network.player, Environment.UserName, 0, 0); 
    networkManager = GameObject.FindGameObjectWithTag("NetworkManager").GetComponent<NetworkManager>(); 
    uiManager = new UiManager(); 

} 

다음과 같이 내가 점점 오전 오류 : "암시 적으로 형식을 변환 할 수 없습니다 'UnityEngine.GameObject'에서 'Assets.scripts.NetworkManager'"

".GetComponent();"를 추가 할 때 문제가 발생합니다. 부품. 이제는 함수가 컴포넌트 타입을 찾고 대신 작동하지 않는 NetworkManager 타입을 얻는다면 ... 그리고 그것이 내가 붙어있는 곳입니다. 나는 이것을 어떻게 작동 시킬지 전혀 모르며, Google 검색에서 15 분 제한을 초과했습니다.

+1

나는 왜이 질문이 내려 졌는지 이해하지 못한다. 이것은 좋은 질문입니다 - 적어도 downvoting 때 약간의 피드백을 남겨주세요. – luqui

답변

2

새로운 네트워크 관리자 GameObject를 인스턴스화하려면 "프리 패브"에 대해 알아야합니다. 씬에서 폴더 중 하나로 드래그하여 Network Manager GameObject를 그 중 하나로 만들 수 있습니다. 프리 패브를 인스턴스화하는 것은 다음과 같이 간단합니다 :

Instantiate(NetworkManagerPrefab, new Vector3(0, 0, 0), Quaternion.identity); 

이렇게하면 새로운 NetworkManager GameObject가 장면에 생성됩니다.

말했듯이 구성 요소를 가져와 GameObject에 저장하기 때문에 스크립트가 작동하지 않습니다. 변수의 유형을 구성 요소 유형으로 변경하거나 구성 요소가 클래스 유형에 대한 스크립트 인 경우. 귀하의 경우 GameObject networkManager;에서 NetworkManager networkManager;으로 변경하면 작동합니다.

+0

감사! 프리 패브를 가르쳐 주셔서 고맙습니다. 나는 그것에 대해 읽을 것이다! –

2

프리 패브가있는 경우 인스턴스화 할 수 있습니다.

GameObject g = Instantiate(prefab, position, rotation) as GameObject; 

게임 개체가 이미 장면에있는 경우 둘 이상의 개체를 필요로하지 않는 한 인스턴스를 만들지 마십시오. 당신은 그것을 찾을 수 있습니다.

GameObject g = GameObject.Find("GameObject Name"); 

그러면 GameObject에 스크립트가 어떻게 첨부되는지 묻습니다. 이와 같이 :

ScriptName s = g.GetComponent<ScriptName>();