Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > Android

Android Разработка игр на платформе Android

Ответ
 
Опции темы
Старый 12.10.2011, 12:51   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Рефлексия

Возможно ли получить список классов программно, получить имена полей классов, имена методов и их параметры?

Есть желание сделать для Unity генератор объектно-ориентированных оберток необходимых классов...

Подскажите куда копать?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 12.10.2011, 13:39   #2
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Рефлексия

В Java есть рефлекция, вот гугл выдал первую ссылку, вроди то что тебе нужно:
http://mobile.tutsplus.com/tutorials...va-reflection/

По поводу обёртнок, можно задуматься о разработке некоего API для игр, если собираешься использовать в более чем одном проекта, используя NDK, на C++.

Если используется MonoDroid, то он имеет .Net рефлекцию (аналогичная C# .Net)
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (12.10.2011)
Старый 12.10.2011, 13:51   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Рефлексия

Мне необходимо под Unity иметь доступ к нужным классам Java/Android с использованием C# объектов. Лень каждый раз вспоминать аргументы функций для вызова методом
var jo = new AndroidJavaObject("java.lang.String");
var 
valueString jo.CallStatic<string>("valueOf"42.0f); 
а иметь готовый C# класс - обертку для всех методов и полей класса Java.

Это сэкономит кучу времени.

Пример такого класса:
namespace java.lang
{
  public class 
String
  
{
      public static 
System.String valueOf(float param)
      {
           var 
jo = new AndroidJavaObject("java.lang.String");
           return 
jo.CallStatic<System.String>("valueOf"param);
      }
  }

и потом работать с ним как
var valueString java.lang.String.valueOf(42.0f); 
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 12.10.2011, 14:29   #4
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Рефлексия

Воу... Это будет медленно же, если везде заменить это дело таким образом и вызывать в динамике.
Думаю можно было бы реализовать что-то более шустрое, хз как но вот пример как бы я реализовал, если бы компилил под разные платформы.
#define JAVA

namespace Platform {
    public class String {
        delegate string MethodValueOf(float number);

        private static MethodValueOf valueOf;
        public static MethodValueOf ValueOf {
            get {
                if (valueOf == null) {
                    #if JAVA
                        valueOf = delegate(float number) {
                            var javaObj = new AndroidJavaObject("java.lang.String");
                            return javaObj.CallStatic<System.String>("valueOf", number);
                        };
                    #elif CSHARP
                        valueOf = delegate(float number) {
                            return number.ToString();
                        };
                    #endif
                }
                return valueOf;
            }
        }
    }
}
И использовать так:
var valueString = Platform.String.ValueOf(10.0f);
Получается singleton delegate, при этом который будет инициализироваться при первом вызове. Можно конечно это дело обернуть в убер функцию "Initialize", и объявлять все делегаты при включении приложения если так будет удобнее.
Тут используется define чтобы определить платформу, в Unity есть даже для этого уже стандартные дефайны.
По мне так удобно в юзабилити, хотя зависит от тебя. Тут ещё нужно подумать над разными типами данных, т.к. delegate'ы нельзя overload'ить. Но в пользовании у тебя будет одна функция, на разные платформы. Думаю это очень сократит время в разработки игры сразу с мультиплатформенным кодом. Но, это требует создания таких вот делегатов для этих самых функций..

Готовых не видел, и думаю будет весьма сложно это как-то автоматизировать, т.к. методы все разные, по разному используются..

UPD:
Можно ещё кешировать AndroidJavaObject, т.к. он используется для доступа к статическим функциям. Для этого можно сделать статичный менеджер с хешь таблицей для доступа к объекту по имени, будет типо такого: ObjectManager.CallStatic("string", "valueOf", number);
Заместо двух строк. При этом прописать в аттрибутах самого Accessor'а все нужные данные, тип объекта, путь к классу. Получается что менеджер кеширует это дело при включении (прбежиться по акксессорам, и создаст яваобъекты), далее в теле будет проще это вызывать.
Хотя имхо, это не улучшит сильно ситуацию, единственное что это кеширует яваобъект, в остальном лишь ухудшит.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (12.10.2011)
Старый 12.10.2011, 15:25   #5
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Рефлексия

Пример который я привел не имеет никакой практической ценности и меня не интересует быстродействие разовых методов. Все классы Android платформы будут использоваться несколько раз в процессе всей работы приложения.

То что я не не сделал в примере статический конструктор для класса, в котором бы создал экземпляр для вызова статических методов - не хотел нагружать кодом.

Классы Android платформы будут применяться только для проектов под эту платформу. Поэтому никаких платформо-зависимых компиляций не будет.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 12:27.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com