日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Unity 導(dǎo)入C# DLL、C\C++ DLL 等外部庫

 勤奮不止 2019-06-18

Untiy 導(dǎo)入C# DLL、C\C++ DLL、OSX BUNDLE、iOS Android 等插件。

參考官方教程:Writing Plugins

  網(wǎng)上已經(jīng)有很多類似的了。這里作為自己的筆記,記錄如何做一個簡單DLL(Dynamic Link Library)動態(tài)鏈接庫。
  創(chuàng)建使用環(huán)境為VS2015。


C# DLL

1. 創(chuàng)建類庫文件,注意選擇.NET最好不要大于3.5版本,因為Unity使用的mono版本為2.0,支持最多到.NET 3.5版本。

創(chuàng)建

2. 如下圖,創(chuàng)建一個MyRandomClass,包含一個公有方法GetRandom(),獲取C#自帶隨機數(shù)獲取函數(shù)。

這里寫圖片描述

3.編譯生成.dll文件,地址看輸出信息。

這里寫圖片描述

4.生成兩個文件。

這里寫圖片描述

5.將其中.dll后綴文件直接拖入Unity項目中Assets\plugins目錄,若無,自行創(chuàng)建。

這里寫圖片描述

6.隨便給個GameObject添加如下C#代碼文件,用于測試是否成功調(diào)用C#DLL。

這里寫圖片描述

7.運行三次,成功666。

這里寫圖片描述


C++ DLL

1.要注意一開始創(chuàng)建不是選DLL(通用Windows 8.1),那是用于Win 8.1和Windows Phone 8.1的。同樣選擇不大于.NET3.5的版本。

這里寫圖片描述

2.創(chuàng)建向?qū)ё⒁膺xDLL和空項目(如果需要其他也可以不選)。

這里寫圖片描述

3.代碼如下,創(chuàng)建在源文件下。關(guān)于 __declspec(export)更多知識可以參考這里。這個功能是調(diào)用< algorithm>庫里面std::max函數(shù)來返回兩個整形最大值。

這里寫圖片描述

4.同樣編譯生成一堆文件。

這里寫圖片描述

5.同樣只需要后綴為.dll的文件拖入項目。

這里寫圖片描述

6.同樣在Assets\Plugins目錄下。

這里寫圖片描述

7.測試腳本,需要聲明DLL并帶特性[DLLImport]。

這里寫圖片描述

8.測試兩個值。

這里寫圖片描述

9.成功輸出最大值。

這里寫圖片描述


.BUNDLE 等其他外部庫

  當(dāng)需要適應(yīng)多個平臺,而且已經(jīng)做好外部庫,可以用下面的方法來根據(jù)平臺而選中合適的外部庫??梢灾苯釉赨nity的File->Build Settings選擇平臺來測試。選中的平臺代碼可以直接體現(xiàn),在#if \ #enif語句正常顯示的(非灰色的)。

using UnityEngine;
using System.Runtime.InteropServices;           //[DllImport]特性的命名空間。

public class TestScript : MonoBehaviour
{
    public int x;
    public int y;

#if UNITY_STANDALONE_WIN                        //WINDOWS系統(tǒng)
    const string dll = "MyMaxNumberDLL";
#elif UNITY_STANDALONE_OSX                      //OSX(Mac)系統(tǒng)
    const string dll = "MyMaxNumberBUNDLE";
#elif UNITY_IOS                                 //IOS系統(tǒng)
    const string dll = "__Internal";
#else                                           //Android或其他
    const string dll = " ";
#endif

    [DllImport(dll)]
    private static extern int GetMaxNumber(int x, int y);

    public static int GetMax(int x,int y)
    {
        #if (UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX || UNITY_IOS)
            return GetMaxNumber(x, y);
        #else
            return -1;
        #endif
    }

    private void Start()
    {
        Debug.Log(GetMax(x, y));
    }
}

遇到的錯誤

  在使用C++的DLL時,出現(xiàn)了一個錯誤:“Failed to load ‘Assets/Plugins/MyMaxNumberDLL.dll’, expected x64 architecture, but was x86 architecture. You must recompile your plugin for x64 architecture.”在stackoverflow有人回答說需要多導(dǎo)入除了.dll文件的另外4個文件,但無果,又設(shè)置了Unity中Build Settings中windows平臺的Architecture,但也無果。最后發(fā)現(xiàn)原來是C++ DLL編譯生成時選擇了x86,改成x64重新編譯導(dǎo)入就好了。

這里寫圖片描述

需要選擇x64架構(gòu)。
這里寫圖片描述

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多