1. 程式人生 > 其它 >妄想集合 題解(斐波那契三角形問題)

妄想集合 題解(斐波那契三角形問題)

前言

目前網上找到的相關文章都是互相轉發抄襲,真的毫無閱讀價值,如此簡單的通訊竟然花了我好幾天的功夫學習,故做此記錄

Android層

準備

環境配置相關的內容就不介紹了

建立一個空專案

下面配置可以隨便寫,不會用到,但還是規範一點吧!

建立專案,等待Gradle Sync,切記不要使用代理,不要使用代理,也不要開梯子!

右鍵專案,建立一個new module,選擇library

這裡的package name要和unity中設定一致,API等級大於11

然後我們把建立工程自帶的app module刪掉,當然直接刪是刪不掉的,得在這

同事刪除MySDK的所有依賴

刪除安卓自帶的一些資原始檔,只留下main就好

到此為止安卓方面的一個空專案算是準備好了

編寫SDK

安卓肯定是不認識UNIYT的,所以我們得匯入UNITY官方給我們的一個JAR包作為橋樑,找到對應編輯器的安裝目錄

這其中有2個資料夾,得看你的UNITY專案選擇打包成mono還是il2cpp,這裡我們選擇mono,則繼續往下找

將他複製到AS對應目錄,並新增為Library

在main目錄中的package中建立一個JAVA類,整合自Fragment,有同名類,注意名稱空間

編寫程式碼

package com.banging.mysdk;

import android.app.Fragment;
import android.os.Bundle;

import com.unity3d.player.UnityPlayer;

public class MyPlugin extends Fragment
{
    private static final String TAG = "MyPlugin";
    private static MyPlugin Instance = null;
    private String gameObjectName;

    public static MyPlugin GetInstance(String gameObject)
    {
        if(Instance == null)
        {
            Instance = new MyPlugin();
            Instance.gameObjectName = gameObject;
            // 大概是預設寫法,這裡不是很明白
            UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(Instance, TAG).commit();
        }
        return Instance;
    }

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);  // 這一句很重要,儲存對該Fragment的引用,防止在旋轉螢幕等操作時時丟失引用(Fragment隸屬於Activity)
    }
    
    //示例方法一:簡單的向Unity回撥  
    public void SayHello()
    {
        UnityPlayer.UnitySendMessage(gameObjectName,"PluginCallBack","Hello Unity!");
    }
    
    //示例方法二:計算傳入的引數並返回計算結果
    public int CalculateAdd(int one, int another)
    {
        return one + another;
    }
}

很簡單的能夠發現,這是一個單利類,提供給Unity呼叫

Build專案,找到編譯好的arr,複製到Unity專案的Assets/Plugins/Android中

Unity層

用解壓縮軟體開啟arr,刪除兩個東西

新建一個測試場景

新建一個指令碼掛到Canvas上

using System;
using UnityEngine;
using UnityEngine.UI;
 
public class Test : MonoBehaviour
{
    public Text callbackText = null;
    public Text resultText = null;
    

    private AndroidJavaClass jc;
    private AndroidJavaObject jo;
 
    void Start()
    {
        // 這裡就是我們的定義在安卓中的的包名+類名
        // 獲取到一個類,只是類,不是例項
        jc = new AndroidJavaClass("com.banging.mysdk.MyPlugin");
        // 呼叫靜態方法獲取單例類
        jo = jc.CallStatic<AndroidJavaObject>("GetInstance", gameObject.name);

        try
        {
            jo.Call("SayHello");                                                                               
        }
        catch (Exception e)
        {
            callbackText.text = e.ToString();
        }

        try
        {
            resultText.text = jo.Call<int>("CalculateAdd", 2, 3).ToString(); 
        }
        catch (Exception e)
        {
            resultText.text = e.ToString();
        }
    }
 
    // 安卓向Unity傳送的訊息
    public void PluginCallBack(string text)
    {
        callbackText.text = text;
    }
}

打包設定,公司名必須改一個,使用預設的可能打包出錯

這兩個需要和安卓那邊設定一樣,不一樣好像也可以,沒有過多測試,目前先保持一致!

打包,測試

易錯點

Gradle Sync 特別慢

不要使用代理,首先檢查是否打開了代理

這裡分兩種情況,如果你之前曾經設定過代理,哪怕你取消了,仍然會有殘留配置,檢查gradle.properties,圖中紅框內應該會有對應的代理資訊,刪掉

其次,如果你配置過代理並且主動Sync過,AS應該會有一個彈窗讓你確定代理設定,此時會在 C:\使用者\(你的使用者名稱)\.gradle 中生成一個gradle.properties,其中也會有代理資訊,刪掉,然後重啟AS,注意一定要重啟

如果你之前沒有配置過代理,但是Build也很慢,那可以考慮隨便設定一個代理,然後主動Sync,讓AS保留代理配置,生成相關檔案,然後你再刪掉,重複上一步的操作,然後重啟

Android Gradle plugin requires Java 11 to run.

本地JAVA環境版本太低了,直接點選圖中的Gradle Settings設定成對應版本就好,似乎AS預設就是安裝了JAVA11的