TGViewer
SpellSinger - разработчик игр на Unity SpellSinger - разработчик игр на Unity @spellsingergames · 548 subscribers
Post #103 1.05K
Мое решение проблемы с высотой баннера

Если плагин Яндекса не предоставляет информацию о высоте баннера, это не значит, что мы не можем её получить. Для этого нужно использовать Android Java Native Interface и Java Reflection

Заглянем в код Yandex Mobile Ads Unity Plugin. Баннер представлен Java классом com.yandex.mobile.ads.unity.wrapper.banner.BannerAdWrapper

Это класс из библиотеки yandex-ads-unity-plugin.aar. Идём в Assets\Plugins\Android и находим там эту библиотеку. Распаковываем этот aar архив, внутри лежит файл classes.jar, распаковываем и его тоже. Это скомпилированные java классы. Закидываем их в декомпилятор (в моём случае просто открываю папку в Intellij IDEA). Видим вот такую картину:

public class BannerAdWrapper {
...
private final a<BannerAdView> d;
...
}

public class a<T> {
...
public T a() {
if (this.b == null) {
this.b = this.a.a();
}
return this.b;
}
...
}

Красивые названия классов и методов от нас спрятали, но ничего страшного. Вполне можно понять, что непосредственно сам BannerAdView можно получить, вызвав у поля d класса BannerAdWrapper метод a().

Окей, супер. Из Unity это делается следующим образом:

        public static AndroidJavaObject GetBannerView(AndroidJavaObject bannerViewWrapper)
{
using var javaClass = new AndroidJavaClass("java.lang.Class");
using var clazz = javaClass.CallStatic<AndroidJavaObject>("forName", "com.yandex.mobile.ads.unity.wrapper.banner.BannerAdWrapper");
using var field = clazz.Call<AndroidJavaObject>("getDeclaredField", "d");
field.Call("setAccessible", true);
return field.Call<AndroidJavaObject>("get", bannerViewWrapper).Call<AndroidJavaObject>("a");
}


Осталось только узнать, как получить высоту у этого BannerAdView. Это класс из библиотеки com.yandex.android:mobileads. Лезем в mvnrepository, скачиваем aar архив и также декомпилируем классы. Эти классы написаны уже на Котлине, и мы не можем посмотреть код методов, но это нам и не нужно. Зато мы видим, что
class BannerAdView : com.yandex.mobile.ads.impl.si0

и
import android.widget.RelativeLayout;
public abstract class si0 extends RelativeLayout

соответственно наш BannerAdView наследуется от android.widget.RelativeLayout. Идём в документацию и видим, что у этого класса, а вернее у его предка android.view.View есть метод int getHeight().

Готово. Значит мы можем при срабатывании события banner.OnAdLoaded определять высоту загруженного баннера (технически высоту View, в котором он отрисовывается), с помощью кода
GetBannerView(bannerView).Call<int>("getHeight")


Яндекс, добавьте, пожалуйста, информацию о высоте баннера в SDK, это позволит делать более красивые интерфейсы, и не городить такие жуткие костыли. Либо также через геттер, либо в аргументы события banner.OnAdLoaded.

#самый_крутяк #тайные_знания #рся
  • ⚡ 13
  • 🤯 8
  • 👍 7
More from @spellsingergames
  1. Oct 1, 2026Автор
  2. Aug 31, 2026Post #235
  3. Aug 25, 2026Прошли модерацию на Crazy Games. Basic Launch продлится до 15 сентября или пока не наберет…
  4. Aug 24, 2026А мы, тем временем, идём покорять #crazy_games Вчера ночью отправили билд на модерацию. Мо…
  5. Aug 24, 20262 недели нужно рекоммендеру Яндекс игр, чтобы как-то отреагировать на изменения метрик. AR…
  6. Aug 14, 2026Шестой эпизод подкаста ГЕЙМДЕВ ПОД ПИВОМ уже во вторник, в 22:30МСК! Хорошенечко отоспитес…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →