Если плагин Яндекса не предоставляет информацию о высоте баннера, это не значит, что мы не можем её получить. Для этого нужно использовать 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")