Unity: Создание и подключение плагина для Android

За основу взят этот ролик:

Создавать плагин для Unity мы будем в Android Studio, а только потом его подключать к Unity.

Шаг первый — создание плагина

1. Android StudioStart a new Android Studio project:
Unity: Создание и подключение плагина для Android
2. На экране выбора шаблона проекта нам будет достаточно использовать «No Activity»:
Unity: Создание и подключение плагина для Android
3. Заполняем все необходимые поля и жмём «Finish»:
Unity: Создание и подключение плагина для Android
4. Когда откроется проект, нужно будет добавить новый модуль:
FileNewNew Module…
Unity: Создание и подключение плагина для Android
5. Выбираем из доступных вариантов «Android Library», после чего нажимаем «Next»:
Unity: Создание и подключение плагина для Android
6. Вводим название для модуля, например «AndroidLibrary», после этого можно нажать «Finish»:
Unity: Создание и подключение плагина для Android
7. В окошке «Project» раскрываем наш модуль androidlibrary\java и нажимаем правую кнопку мыши на com.example.androidlibrary, после чего выбираем NewJava Class:
Unity: Создание и подключение плагина для Android
8. Задаём название класса, выбираем для него тип «Singleton» и нажимаем «OK»:
Unity: Создание и подключение плагина для Android
9. В итоге будет создан файл MyPlugin.java:

MyPlugin.java
package com.example.androidlibrary;

public class MyPlugin
{
  private static final MyPlugin ourInstance = new MyPlugin();

  public static MyPlugin getInstance()
  {
    return ourInstance;
  }

  private MyPlugin()
  {
  }
}

10. Изменим код, добавив в него публичный метод getElapsedTime для подсчёта прошедшего времени:

MyPlugin.java
package com.example.androidlibrary;

import android.util.Log;

public class MyPlugin
{
  private static final MyPlugin ourInstance = new MyPlugin();
  private static final String LOGTAG = "dentnt.trmw.ru";

  public static MyPlugin getInstance()
  {
    return ourInstance;
  }

  private long startTime;

  private MyPlugin()
  {
    Log.i (LOGTAG, "MyPlugin is created");
    startTime = System.currentTimeMillis();
  }

  public double getElapsedTime()
  {
    return (System.currentTimeMillis()-startTime)/1000.0f;
  }
}

11. Теперь можно выбрать вариант сборки:
Build Variantsandroidlibraryrelease
Unity: Создание и подключение плагина для Android
12. Нажимаем Ctrl+F9 или через меню:
BuildMake Project
13. Готовый файл плагина androidlibrary-release.aar можно будет найти здесь:
C:\Users\Denis\ApkProjects\Plugin4Unity\androidlibrary\build\outputs\aar\androidlibrary-release.aar

Шаг второй — подключение плагина в Unity

14. В дереве Проекта в папке Assets создадим папку Plugins, а в ней папку Android:
Unity: Создание и подключение плагина для Android
15. Копируем туда файл androidlibrary-release.aar из п.13.

Если изначально создавать проект в этой папке, то в ней будет очень много лишнего и Unity будет долго её импортировать при каждом обновлении, так что лучше создавать плагин в папке по-умолчанию C:\Users\<USER>\ApkProjects\

 

16. В проекте Unity просто добавим на сцену куб:
GameObject3D ObjectCube
17. К кубу добавим скрипт RotateCube.cs, этот скрипт будет просто вращать куб:

RotateCube.cs
using UnityEngine;

public class RotateCube : MonoBehaviour
{
  float speed = 30f;

  // Update is called once per frame
  void Update()
  {
    transform.Rotate(speed * Time.deltaTime, 2 * speed * Time.deltaTime, -speed * Time.deltaTime);
  }
}

18. На камеру Main Camera добавим скрипт PluginTest.cs:

PluginTest.cs
using UnityEngine;

public class PluginTest : MonoBehaviour
{
  const string pluginName = "com.example.androidlibrary.MyPlugin";

  // Plugin getters
  static AndroidJavaClass _pluginClass;
  static AndroidJavaObject _pluginInstance;

  public static AndroidJavaClass PluginClass
  {
    get
    {
      if (_pluginClass == null)
      {
        _pluginClass = new AndroidJavaClass(pluginName);
      }
      return _pluginClass;
    }
  }

  public static AndroidJavaObject PluginInstance
  {
    get
    {
      if (_pluginInstance == null)
      {
        _pluginInstance = PluginClass.CallStatic<AndroidJavaObject>("getInstance");
      }
     return _pluginInstance;
    }
  }

  private void Start()
  {
    Debug.Log("Elapsed time: " + getElapsedTime());
  }

  float elapsedTime = 0f;

  private void Update()
  {
    elapsedTime += Time.deltaTime;
    if (elapsedTime >= 5)
    {
      elapsedTime -= 5;
      Debug.Log("Tick: " + getElapsedTime());
    }
  }

  double getElapsedTime()
  {
    if (Application.platform == RuntimePlatform.Android)
    {
      return PluginInstance.Call<double>("getElapsedTime");
    }
    Debug.LogWarning("Wrong platform");
    return 0;
  }
}

19. Если теперь собрать проект и запустить его на смартфоне, то в Android Studio мы увидим записи в LogCat:

2020-05-10 22:57:44.778 2572-2591/? I/dentnt.trmw.ru: MyPlugin is created
2020-05-10 22:57:44.843 2572-2591/? I/Unity: Elapsed time: 0.0160000007599592
(Filename: ./Runtime/Export/Debug/Debug.bindings.h Line: 35)
2020-05-10 22:57:49.917 2572-2591/? I/Unity: Tick: 5.11299991607666

Благодаря методу getElapsedTime() из плагина мы можем получать необходимые данные.



Подписаться
Уведомление о
guest
2 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Алексей

Подскажите, что делать, если плагину для работы требуется другой андроид плагин, который является частью Jetpack?