2015-11-25 2 views
-1

После добавления Component к GameObject с помощью метода GameObject.AddComponent, как я могу получить доступ к этому Component из другого сценария?Доступ к динамически добавленному компоненту в Unity3d C#


здесь MyScript код (не присоединять к GameObject):

using UnityEngine; 
using System.Collections; 

public class MyScript : MonoBehaviour { 
    public string  myName = "myName"; 
    public Vector3  pos; 
    public bool   visible; 
} 

и здесь основной код прилагается к GameObject в сцене:

using UnityEngine; 
using System.Collections; 

public class Main : MonoBehaviour { 
    public GameObject cube; 

    void Update() { 
     if(Input.GetKeyDown(KeyCode.Space)) { 
      cube = GameObject.CreatePrimitive(PrimitiveType.Cube); 
      cube.AddComponent<MyScript>(); 
     } 

     if(Input.GetKeyDown(KeyCode.LeftShift)) { 
      var a = GameObject.Find("Cube"); 

      print("cube name/visible: " + 
      /* here is the problem, how do i access the MyScript variables? */ 
      a.myName + "/" + a.visible); 
     } 
    } 
} 
+0

Я уверен, что многие задаются вопросом 'Какую треска e выглядит так: 'также читайте [как задать вопрос] (http://stackoverflow.com/questions/ask) здесь – MethodMan

+0

неясно, что вы здесь задаете. Вы имеете в виду «Как получить доступ к динамически добавленному компоненту из отдельного сценария?» –

+0

Я отправил код ниже, спасибо. – cubecube

ответ

1

Для доступа к Component от Unity3d GameObject, вы должны использовать метод GameObject.GetComponent<T>(). Существует несколько способов сделать это.

MyScript m = gameObject.GetComponent<MyScript>(); 
MyScript m = gameObject.GetComponent("MyScript") as MyScript; 
MyScript m = (MyScript) gameObject.GetComponent(typeof(MyScript)); 

Ваш пример кода, есть несколько вещей, которые действительно должны быть решены:

  • Если вы хотите создать компоненты в вашей сцене динамически, это лучшая практика для создания сборного, то Добавим, что в вашей сцене
  • Если вы планируете добавить большое количество объектов в сцене во время выполнения, вы должны использовать пулы, а не дорогое создание и уничтожение объектов
  • GameObject.Find("Cube"); будет найти только одно имя объекта d «Куб» в иерархии. Вы должны использовать FindObjectsOfType<MyScript>(), если вы хотите, чтобы найти все GameObjects, которые имеют в MyScript компонент (FindObjectOfType, если вы хотите, чтобы найти 1)

Исходя из этого, вы можете получить к переменным MyScript как это:

MyScript a = FindObjectOfType<MyScript>(); 
print(a.myName + "/" + a.visible); 

или если вы хотите, чтобы проверить состояние всех MyScript активных компонентов:

MyScript[] myScripts = FindObjectsOfType<MyScript>(); 
foreach (MyScript myScript in myScripts) { 
    print(myScript.myName + "/" + myScript.visible); 
} 
+0

спасибо, Ник, я понимаю часть, которую вы объяснили. Моя задача - получить доступ к переменным в скрипте, подключенном к динамически создаваемому GameObject, сообщите мне, если у вас есть идея о том, как это сделать. (см. код, который я только что опубликовал) cheers – cubecube

+0

ok perfect Я проверю эти данные: – cubecube

Смежные вопросы