Не компилированные скрипты поведения объекта

Программирование на Юнити.

Re: Не компилированные скрипты поведения объекта

Сообщение seaman 18 фев 2014, 23:27

Разговор с Вами весьма сложен.
Если вы тут:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class scene1_2 : MonoBehaviour
{
public string proverka;

void OnGUI()
    {
        GUI.Box(new Rect(100, 100, 200, 200), ""slawik"");
    }
}";

Не видите названия скрипта - сходите к окулисту.
Нет скриптов без названия. Точка.
PS^ если название не отображает инспектор - это не значит, что названия нет.
PPS^ Для начала поймите - что такое "название скрипта"
Поразительно - dll загружаем, а что такое класс - не понимаем.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Не компилированные скрипты поведения объекта

Сообщение slawik 19 фев 2014, 00:08

1. это точно разговор со мной сложен, я все понимаю что и как делается, а объяснить нормально не получается
2. (извините пожалуйста этот пункт я забыл описать при разговоре) при попытке вызвать скрипт таким образом 'gameObject.GetComponent<scene1_2>().proverka = "slawik";' выдает ошибку 'The type or namespace name `scene1_2' could not be found. Are you missing a using directive or an assembly reference?' если будет проще 'Тип или пространства имен " scene1_2 " не может быть найден. Вам не хватает помощью директивы или ссылку на сборку?' поэтому и спросил как вызвать второй скрипт из первого скрипта
slawik
UNец
 
Сообщения: 47
Зарегистрирован: 06 янв 2012, 17:43

Re: Не компилированные скрипты поведения объекта

Сообщение llka 19 фев 2014, 00:12

попробуй кинуть ссылку на скрипт scene1_2 из самого скрипта.
Или при старте scene1_2 вывести его собственное имя в дебаг.
llka
UNIверсал
 
Сообщения: 359
Зарегистрирован: 08 янв 2014, 05:00

Re: Не компилированные скрипты поведения объекта

Сообщение slawik 19 фев 2014, 00:49

1. как кинуть ссылку на скрипт scene1_2 из самого скрипта, если я scene1_2 не могу вызвать, из scene1_2 я могу вызвать scene1_1, а наоборот нет
2. зачем мне выводить имя в дебаг если оно мне и так известно
slawik
UNец
 
Сообщения: 47
Зарегистрирован: 06 янв 2012, 17:43

Re: Не компилированные скрипты поведения объекта

Сообщение llka 19 фев 2014, 01:29

Ну в скрипте работает же onGUI?
Значит он инициализируеться.
llka
UNIверсал
 
Сообщения: 359
Зарегистрирован: 08 янв 2014, 05:00

Re: Не компилированные скрипты поведения объекта

Сообщение seaman 19 фев 2014, 07:53

Ага. Стало ясно.
Можно попробовать два варианта.
1. gameObject.GetComponent<types[0]>().proverka = "slawik"; types[0] - Вы получили в SetBehaviour. Не уверен, что сработает. Скорее - даже ошибку выдаст. Тут скорее нужно не дженерик GetComponent использовать. Проверить не могу.
2. Устанавливать из scene1_2 ссылку на себя при старте. И использовать ее.
Синтаксис:
Используется csharp
public class scene1_1 : MonoBehaviour
{
    public string peremennaya;
    static public MonoBehaviour script;
    void Start()
    {
        peremennaya = @"
        using UnityEngine;
        using System.Collections;

        public class scene1_2 : MonoBehaviour
       {
            public string proverka;

            public void Start()
            {
                scene1_1.script = this;
            }
           void OnGUI()
          {
               GUI.Box(new Rect(100, 100, 200, 200), "
"slawik"");
          }
     }"
;


На самом деле несколько непонятно - зачем такое. Как эксперимент - интересно. Для практики непонятно - зачем.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Не компилированные скрипты поведения объекта

Сообщение slawik 19 фев 2014, 11:28

спасибо всем за ответы
llka
1. да работает
2. да он инициализируеться но передать ему переменную все равно не получиться
seaman
1. да вы правы это эксперимент, если бы он получился я бы нашел ему применение
2. 1 пункт действительно не работает из за types[0] можно конечно использовать вот так 'gameObject.GetComponent(types[0])', но он все равно использует объект как 'gameObject'
3. пришлось изменить одну строчку кода, потому что мы вызываем 1 скрипт из второго
4. 2 пункт работает, но на половину переменную то все равно не получиться вызвать, так как она для Unity3D не существует на момент написания кода

я думаю рассмотрение этого вопроса никуда дальше не приведет, если кто нибудь не знает другого способа вызова переменной?

тогда у меня остался только один вопрос:
В Unity3D у меня все прекрасно работает, как только я компилирую все перестает работать(в EXE файле), после проверки я узнал, что не работает вот эта строчка 'Assembly assembly = CSScript.LoadCode(SourceCode, null);' притом что до '=' работает после нет, как мне это исправить?
slawik
UNец
 
Сообщения: 47
Зарегистрирован: 06 янв 2012, 17:43

Re: Не компилированные скрипты поведения объекта

Сообщение seaman 20 фев 2014, 10:22

Можно использовать рефлексию. Так:
Синтаксис:
Используется csharp
using System;
using UnityEngine;
using System.Collections;
using System.Reflection;
using CSScriptLibrary;

public class CreateClass : MonoBehaviour
{
        public string peremennaya;
        // Use this for initialization
        void Start()
        {
                peremennaya = @"
using UnityEngine;
using System.Collections;

public class scene1_2 : MonoBehaviour
{
public string proverka = "
"GOOD"";

void OnGUI() { GUI.Box(new Rect(100, 100, 200, 200), "
"slawik""); }
}"
;
                SetBehaviour(peremennaya);
        }
        public void SetBehaviour(string SourceCode)
        {
                if (SourceCode.Length > 0)
                {
                        Assembly assembly = CSScript.LoadCode(SourceCode, null);
                        Type[] types = assembly.GetTypes();
                        if (types.Length > 0) gameObject.AddComponent(types[0]);
                        Component script = gameObject.GetComponent("scene1_2");
                        Type t = script.GetType();
                        FieldInfo[] fi = t.GetFields();
                        Debug.Log(fi[0].GetValue(script));
                }
        }
}
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Не компилированные скрипты поведения объекта

Сообщение seaman 20 фев 2014, 10:25

все перестает работать(в EXE файле)

нужные dll в Data_ есть?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Не компилированные скрипты поведения объекта

Сообщение slawik 20 фев 2014, 11:52

1.Dll есть и в Plugins и в Managed вот лог файл
Синтаксис:
  1. Initialize engine version: 4.2.1f4 (4d30acc925c2) 
  2. GfxDevice: creating device client; threaded=1 
  3. Direct3D: 
  4. Version: Direct3D 9.0c [igdumd32.dll 8.15.10.2752] 
  5. Renderer: Intel(R) HD Graphics 4000 
  6. Vendor: Intel 
  7. VRAM: 880 MB (via DXGI) 
  8. Caps: Shader=30 DepthRT=1 NativeDepth=1 NativeShadow=1 DF16=1 DF24=1 INTZ=1 RAWZ=0 NULL=1 RESZ=1 SlowINTZ=0 
  9. Begin MonoManager ReloadAssembly 
  10. Platform assembly: D:\Server\Unity\Proverka\game\1_Data\Managed\UnityEngine.dll (this message is harmless) 
  11. Loading D:\Server\Unity\Proverka\game\1_Data\Managed\UnityEngine.dll into Unity Child Domain 
  12. Platform assembly: D:\Server\Unity\Proverka\game\1_Data\Managed\Assembly-CSharp.dll (this message is harmless) 
  13. Loading D:\Server\Unity\Proverka\game\1_Data\Managed\Assembly-CSharp.dll into Unity Child Domain 
  14. Platform assembly: D:\Server\Unity\Proverka\game\1_Data\Managed\CSSCodeProvider.dll (this message is harmless) 
  15. Loading D:\Server\Unity\Proverka\game\1_Data\Managed\CSSCodeProvider.dll into Unity Child Domain 
  16. Platform assembly: D:\Server\Unity\Proverka\game\1_Data\Managed\CSScriptLibrary.dll (this message is harmless) 
  17. Loading D:\Server\Unity\Proverka\game\1_Data\Managed\CSScriptLibrary.dll into Unity Child Domain 
  18. - Completed reload, in 0.049 seconds 
  19. desktop: 1366x768 60Hz; virtual: 1366x768 at 0,0 
  20. <RI> Initializing input. 
  21.  
  22. <RI> Input initialized. 
  23.  
  24. Platform assembly: D:\Server\Unity\Proverka\game\1_Data\Managed\System.Xml.dll (this message is harmless) 
  25. Platform assembly: D:\Server\Unity\Proverka\game\1_Data\Managed\System.dll (this message is harmless) 
  26. FileNotFoundException: Windows mono path not found: D:\Server\Unity\mono\mono\mini\mono.exe 
  27. at Mono.CSharp.CSharpCodeCompiler..cctor () [0x00000] in <filename unknown>:0  
  28. Rethrow as TypeInitializationException: An exception was thrown by the type initializer for Mono.CSharp.CSharpCodeCompiler 
  29. at Microsoft.CSharp.CSharpCodeProvider.CreateCompiler () [0x00000] in <filename unknown>:0  
  30.  
  31. at csscript.CSExecutor.LoadDefaultCompiler () [0x00000] in <filename unknown>:0  
  32.  
  33. at csscript.CSExecutor.LoadCompiler (System.String scriptFileName, System.String[]& filesToInject) [0x00000] in <filename unknown>:0  
  34.  
  35. at csscript.CSExecutor.Compile (System.String scriptFileName) [0x00000] in <filename unknown>:0  
  36.  
  37. at csscript.CSExecutor.Compile (System.String scriptFile, System.String assemblyFile, Boolean debugBuild) [0x00000] in <filename unknown>:0  
  38.  
  39. at CSScriptLibrary.CSScript.LoadWithConfig (System.String scriptFile, System.String assemblyFile, Boolean debugBuild, csscript.Settings scriptSettings, System.String compilerOptions, System.String[] refAssemblies) [0x00000] in <filename unknown>:0  
  40.  
  41. at CSScriptLibrary.CSScript.Load (System.String scriptFile, System.String assemblyFile, Boolean debugBuild, System.String[] refAssemblies) [0x00000] in <filename unknown>:0  
  42.  
  43. at CSScriptLibrary.CSScript.LoadCode (System.String scriptText, System.String tempFileExtension, System.String assemblyFile, Boolean debugBuild, System.String[] refAssemblies) [0x00000] in <filename unknown>:0  
  44.  
  45. at CSScriptLibrary.CSScript.LoadCode (System.String scriptText, System.String assemblyFile, Boolean debugBuild, System.String[] refAssemblies) [0x00000] in <filename unknown>:0  
  46.  
  47. at CSScriptLibrary.CSScript.LoadCode (System.String scriptText, System.String[] refAssemblies) [0x00000] in <filename unknown>:0  
  48.  
  49. at scene1_1.SetBehaviour (System.String SourceCode) [0x00000] in <filename unknown>:0  
  50.  
  51. at scene1_1.Start () [0x00000] in <filename unknown>:0  
  52.  
  53. (Filename: Line: -1) 
  54.  

2. передать из скрипта scene1_2 в скрипт CreateClass значение CreateClass_proverka легко, а из скрипта CreateClass в скрипт scene1_2 значение scene1_2_proverka неполучиться

Синтаксис:
Используется csharp
using System;
using UnityEngine;
using System.Collections;
using System.Reflection;
using CSScriptLibrary;

public class CreateClass : MonoBehaviour
{
    public string peremennaya;
    public string CreateClass_proverka = "";
   
    // Use this for initialization
    void Start()
    {
       
        peremennaya = @"
using UnityEngine;
using System.Collections;

public class scene1_2 : MonoBehaviour
{
public string scene1_2_proverka = "
"GOOD"";

void Start()
{
gameObject.GetComponent<CreateClass>().CreateClass_proverka = "
"slawik"";
}

void OnGUI() { GUI.Box(new Rect(100, 100, 200, 200), "
"slawik""); }
}"
;
        SetBehaviour(peremennaya);
    }
    public void SetBehaviour(string SourceCode)
    {
        if (SourceCode.Length > 0)
        {
            Assembly assembly = CSScript.LoadCode(SourceCode, null);
            Type[] types = assembly.GetTypes();
            if (types.Length > 0) gameObject.AddComponent(types[0]);
            Component script = gameObject.GetComponent("scene1_2");
            Type t = script.GetType();
            FieldInfo[] fi = t.GetFields();
            Debug.Log(fi[0].GetValue(script));
        }
    }
}
slawik
UNец
 
Сообщения: 47
Зарегистрирован: 06 янв 2012, 17:43

Re: Не компилированные скрипты поведения объекта

Сообщение seaman 20 фев 2014, 14:13

из скрипта CreateClass в скрипт scene1_2 значение scene1_2_proverka неполучиться

Почему? Получить значение можно, а установить нельзя - почему?
Синтаксис:
Используется csharp
using System;
using UnityEngine;
using System.Collections;
using System.Reflection;
using CSScriptLibrary;

public class CreateClass : MonoBehaviour
{
        public string proverka;

        // Use this for initialization
        void Start()
        {
                string peremennaya = @"
using UnityEngine;
using System.Collections;

public class scene1_2 : MonoBehaviour
{
public string proverka = "
"GOOD"";
public void Start(){ gameObject.GetComponent<CreateClass>().proverka = "
"slawik""; }
void OnGUI(){ GUI.Box(new Rect(100, 100, 200, 200), "
"slawik""); }
}"
;
                SetBehaviour(peremennaya);
        }
        public void SetBehaviour(string SourceCode)
        {
                if (SourceCode.Length > 0)
                {
                        // Переданный в качестве параметра в функцию код компилируется
                        // в отдельную сборку, с которой уже можно работать хоть стандартными
                        // средствами System.Reflection, хоть средствами библиотеки C# Script'а,
                        // и она загружается автоматически в текущий application domain
                        Assembly assembly = CSScript.LoadCode(SourceCode, null);
                        // Получаем список типов, которые определены в сборке
                        Type[] types = assembly.GetTypes();
                        Debug.Log(types[0].Name);
                        if (types.Length > 0)
                        {
                                // Допустим, первый попавшийся тип и есть наследник монобеха,
                                // соответственно ему и лезть на объект
                                //GameObject dialog = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
                                gameObject.AddComponent(types[0]);
                        }
                        Component script = gameObject.GetComponent(types[0].Name);
                        Type t = script.GetType();
                        FieldInfo[] fi = t.GetFields();
                        Debug.Log(fi[0].GetValue(script));

                        fi[0].SetValue(script, "BBBADD!!!");
                        Debug.Log(fi[0].GetValue(script));
                }
        }
}

Заметь, что нам даже не нужно знать имя компилируемого скрипта!
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Не компилированные скрипты поведения объекта

Сообщение slawik 20 фев 2014, 20:17

1. Спасибо вам большое. Все я сдаюсь. По сравнению с вами я и правда являюсь новичком. Честно я даже не знал что есть даже такой способ.
2. Реально использовать процедуру из scene1_2 или нет?(если да то как)
3. Возможно ли работать из CreateClass с list в скрипте scene1_2?
4. Гуру Neodrop писал что можно не через SScriptLibrary, а через Assembly.Load делать как это сделать?
slawik
UNец
 
Сообщения: 47
Зарегистрирован: 06 янв 2012, 17:43

Re: Не компилированные скрипты поведения объекта

Сообщение seaman 20 фев 2014, 21:17

2. Ну чтобы не спрашивать все что нужно - проще открыть МСДН. В данном случае ЭТУ статью. И найти там что интересует:
Type.GetMethods => Invoke()
3. Возможно.
4. CScriptLibrary (кстати не знал о ней - упустил) использует в конечном итоге именно Assembly.Load. Просто в Assembly.Load нет методов компиляции из строки - только из файла. Потому CScriptLibrary сохраняет строку во временный файл на диск, а затем вызывает Assembly.Load для этого временного файла. Именно потому данный метод не пойдет для вебплейера. Можно обойти с использованием persistentDataPath, но нужно писать свою dll.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Не компилированные скрипты поведения объекта

Сообщение slawik 20 фев 2014, 22:30

2. спасибо за помощь этот вопрос оказался довольно простым
4. Не могли бы вы поподробнее объяснить этот вопрос. Допустим у меня есть файл proba.txt в котором находиться код который лежит на диске C:\\ как мне его прикрутить к Unity3D.
пробовал таким образом 'Assembly assembly = Assembly.Load("C://proba.txt");' выдает ошибку что не может найти файл
slawik
UNец
 
Сообщения: 47
Зарегистрирован: 06 янв 2012, 17:43

Re: Не компилированные скрипты поведения объекта

Сообщение seaman 21 фев 2014, 08:30

Да, тут я лопухнулся. Assembly.Load загружает уже скомпилированные файлы. Компилируются они во временный файл-сборку System.CodeDom.Compiler.CompileAssemblyFromFile
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Пред.След.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6