• unity3d dll更新

    2016-12-23 18:30:32
    char* ReadStringFromFile(const char* pathName,int* size) { FILE* file = fopen(pathName,"rb"); int length = 0; int readLength = 0; char* outData; if (file == ... re

    char* ReadStringFromFile(const char* pathName,int* size)

    {

    FILE* file = fopen(pathName,"rb");

    int length = 0;

    int readLength = 0;

    char* outData;


    if (file == NULL)

        return 0;


    fseek(file, 0, SEEK_END);

    length = ftell(file);

    fseek(file, 0, SEEK_SET);

    if (length < 0)

    {

        fclose( file );

        return 0;

    }


    *size = length;

    outData = g_try_malloc (length);

    readLength = fread(outData, 1, length, file);


    fclose(file);


    if (readLength != length)

    {

        g_free (outData);

        return 0;

    }


    return outData;

    }


    void check_new_image(char *data,guint32 *data_len, const char *full_name, const char *name)

    {

    const char *pack = strstr(full_name, "com.");

    const char *pfile = strstr(full_name, "-");

    int len = 0;

    char *newData;



    len = (int)(pfile - pack);

    char path[512];

    memset(path,0,512);

    memcpy(path,"/data/data/",11);

    memcpy(path + 11, pack, len);

    memcpy(path + 11 + len, "/files/", 7);

    memcpy(path + 11 + len + 7, name, strlen(name));


    g_message("the new path is :%s\n",path);


    len = 0;

    newData = ReadStringFromFile(path, &len);

    if(newData && len > 0)

    {

    *data_len = len;

    memcpy(data,newData,len);

    g_free(newData);

    }

    }



    mono_image_open_from_data_with_name


    展开全文
  • unity dll实现热更新

    2019-06-05 11:45:00
    大家都知道一谈起热更新的话首选是Ulua这个插件, 其实Unity可以使用dll更新的,如果你实在不想用Lua来编写逻辑,0.0请下看Dll+AssetBundle如何实现热更新的.让你看完这个文章之后只是认识DLL更新的方式和概念,掌握...

    大家都知道一谈起热更新的话首选是Ulua这个插件, 其实Unity可以使用dll热更新的,如果你实在不想用Lua来编写逻辑,0.0请下看Dll+AssetBundle如何实现热更新的.让你看完这个文章之后只是认识DLL热更新的方式和概念,掌握热更新的实战框架还需要你自己=。=

     

    我们通常的做法是编译成的DLL打成AssetBundle文件, Unity通过WWW下载AB文件获取里面DLL.通过反射的方式把里面的C# 组件绑定到GameObject游戏物体上面,这就是DLL热更新的原理. 假设项目采用UGUI系统, 我们来看看通过以上思想编写代码时候遇到的核心问题如下.

    1. 我需要如何编写DLL?
    2. 我的DLL怎么才能获取到UnityEngine命名空间类的引用?
    3. 我的DLL需要如何打成AssetBundle?
    4. 程序下载AssetBundle如何读取里面DLL?
    5. 如何把脚本绑定起来,实现热更新UI?

     

    一、我需要如何编写DLL?

    首先你需要找到Unity几个关键DLL. UnityEngine.dll,UnityEngine.UI.dll为了你编写热更新代码有UnityEngine核心类的引用吧.先创建一个C#3.5版本的类库(点击项目右键->属性->目标框架3.5), 然后引入UnityEngine.dll和UnityEngine.UI.dll的DLL

    image

    创建完工程之后,我们编写一个MyClass继承MonoBehaviour类

    image

     

    点击启动编译DLL,编译成的DLL可以在项目右键->在文件资源器中打开文件夹->Btn目录->Release和Debug目录找到MyDll.dll(我的是在Realse目录下)  我们把编译好的DLL,拿到Unity里面去打包成AssetBundle文件. Unity默认貌似不允许把后缀名DLL打入AssetBundle,我们修改把MyDll.dll改成MyDll.bytes名字

    image

     

    把DLL打包成AssetBundle文件代码如下,

    复制代码

    [MenuItem("Assets/Build Android DLL")]
        public static void BuildAssetsAndroidDll()
        {
            Object mainAsset = AssetDatabase.LoadMainAssetAtPath("Assets/Dll/MyDLL.bytes");
            BuildPipeline.BuildAssetBundle(mainAsset, null, Application.dataPath + "\\Dll\\myassets.android",
                                   BuildAssetBundleOptions.None,BuildTarget.Android);
            if (File.Exists(androidStreamUrl)) 
            {
                File.Delete(androidStreamUrl);
            }   
    
            //拷贝到Stream目录下方便程序下载AB文件
            File.Copy(Application.dataPath + "\\Dll\\myassets.android", androidStreamUrl);
    
        }

    复制代码

     

    再来看下我们Unity需要做那些操作,就是新创建一个场景添加一个Text文本即可

    image

     

    给Android下打包好的AssetBundle文件,放入StreamAssetBundleAssets, 代码会自动帮你复制过去

    image

     

    Test核心类

    复制代码

    using UnityEngine;
    using System.Collections;
    using System.Reflection;
    using System;
    using System.IO;
    using UnityEngine.UI;
    
    public class Test : MonoBehaviour {
    
    
        public string url;
        public string str;
    
        public Text myAgeText;
    
        public void Awake() 
        {
            Application.logMessageReceived += Application_logMessageReceived;
        }
    
        void Application_logMessageReceived(string condition, string stackTrace, LogType type)
        {
            str += "\r\n" + condition;
        }
    
        public void OnGUI() 
        {
            GUI.Box(new Rect(0, 0, 800, 800), str);
        }
    
        // Use this for initialization
        IEnumerator Start () {
            yield return new WaitForSeconds(2);
    
            if (Application.platform == RuntimePlatform.WindowsEditor) 
            {
                url = @"file://"+Application.dataPath + "\\Dll\\myassets.windows";
            }else 
            if(Application.platform == RuntimePlatform.Android)
            {
                url = Application.streamingAssetsPath + "/myassets.android";
            }
            else if (Application.platform == RuntimePlatform.IPhonePlayer)
            {
                url = Application.streamingAssetsPath + "/myassets.iphone";
            }
    
            Debug.Log("url: " +  url);
            WWW www = new WWW(url);
    
            yield return www;
    
            if(www.error != null)
            {
                Debug.Log("加载 出错");
            }
    
            if(www.isDone)
            {
                Debug.Log("加载完毕");
                AssetBundle ab = www.assetBundle;
    
                try
                {
                    //先把DLL以TextAsset类型取出来,在把bytes给Assembly.Load方法读取准备进入反射操作
                    Assembly aly = System.Reflection.Assembly.Load(((TextAsset)www.assetBundle.mainAsset).bytes);
    
                    //获取DLL下全部的类型
                    foreach (var i in aly.GetTypes())
                    {
                        //调试代码
                        Debug.Log(i.Name);
                        str += "\r\n" + i.Name;
    
                        //添加组件到当前GameObject下面
                        Component c = this.gameObject.AddComponent(i);
    
                        //然后类名是MyClass,就把文本引用赋值给MyClass.platefaceText属性.
                        if (i.Name == "MyClass") 
                        {
                            FieldInfo info = c.GetType().GetField("platefaceText");
                            info.SetValue(c, myAgeText);
                        }
                    }
                }
                catch (Exception e) 
                {
                    Debug.Log("加载DLL出错");
                    Debug.Log(e.Message);
                }
            }
        }
    }

    复制代码

    在Windows下查看效果图

    image

     

    以上只是一个抛砖引玉,希望想使用dll热更新代码的能帮助到你.

    展开全文
  • 昨晚上有了dll更新的想法,今天做了一天的实验,也遇到些坑,这里总结下 工作环境: U3D5.3.2 + vs2010 +mono 下面要模拟的是一个登陆环境,点击按钮,就加载一个iGameObjec的Item, Item 上得到更新的文本内容...

    APK包装到用户手机上后,代码如何更新,总不能全用LUA吧?特别是代码非常多的战斗手游

     

    昨晚上有了dll 热更新的想法,今天做了一天的实验,也遇到些坑,这里总结下

    工作环境: U3D5.3.2 + vs2010 +mono

    下面要模拟的是一个登陆环境,点击按钮,就加载一个iGameObjec的Item,  Item 上得到更新的文本内容。具体如下图

     

    1> 程序集管理

    2> Dll管理与加载 

    3> 逻辑代码和UI的实现 

    4> 打包dll+打包Assetbundle

     

     

    限制1:在Android手机里动态加载dll不能使用Assembly.LoadFile(string path),只能使用Assembly.Load(byte[] rawAssembly)这个接口,所以要自己想办法先读出来。


    限制2:动态加载的脚本不能在编辑器里挂在prefab上。


    限制3:如果脚本在动态dll里,调用AddComponent()挂此脚本上prefab上时不能使用AddComponent(“SomeScript”)的方式调用,要用AddComponent(Type.GetType(“SomeScript”))。


    限制4:在动态dll里使用[RequireComponent(typeof(SomeScript))]无效,所以不能使用。

    转载于:https://www.cnblogs.com/jiahuafu/p/8278893.html

    展开全文
  • 上篇 Unity3d 调用C++ DLL (Win平台) 介绍了简单的 Unity3d 调用 C++ DLL的方法,但是这样是不够的,这里再讲下通过函数指针让 C++ DLL中回调 Unity3d 的方式。 创建DLL 以及在 Unity3d 中调用 DLL 中函数在上篇中...

    上篇   Unity3d 调用C++ DLL (Win平台)  介绍了简单的 Unity3d 调用 C++ DLL的方法,但是这样是不够的,这里再讲下通过函数指针让 C++ DLL中回调 Unity3d 的方式。

    转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

    创建DLL 以及在 Unity3d 中调用 DLL 中函数在上篇中介绍了。


    首先,在C#中是没有函数指针的,我们使用 Delegate 。

    转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

    我们来创建 DLL

    在上篇的工程中修改。


    Calculate.h

    # define _DLLExport __declspec (dllexport) //标记为导出函数;
    
    //定义函数指针;
    typedef void (__stdcall *CPPCallback)(int tick);
    
    extern "C" void _DLLExport SetCallback(CPPCallback callback);
    
    extern "C" long long _DLLExport dlltest();

    Calculate.cpp

    #include "Calculate.h"
    
    
    
    long long dlltest()
    {
    		long long a = 1;
    		int b = 0;
    		while(b<1000000000)
    		{
    			a=a+b;
    			b++;
    		}
    		return a;
    }
    
    void SetCallback(CPPCallback callback)
    {
    	int tick=1223;
    	callback(tick);
    }

    在DLL中定义函数SetCallback() 来设置回调函数。

    转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

    在Unity3d 中使用DLL

    using UnityEngine;
    using System.Collections;
    using System.Runtime.InteropServices;
    
    public class NewBehaviourScript : MonoBehaviour {
    
    	[DllImport ("TestDLL")]
    	private static extern long dlltest();
    
    	[DllImport ("TestDLL")]
    	private static extern void SetCallback(CSCallback callback);
    
    
    	public delegate void CSCallback(int tick);
    	static CSCallback callback;
    
    
    	// Use this for initialization
    	void Start () {
    		callback = CSCallbackFuction;
    	}
    
    
    	static void CSCallbackFuction(int tick)
    	{
    		Debug.Log ("CSCallbackFuction "+tick.ToString());
    	}
    	
    
    	void OnGUI()
    	{
    		if(GUI.Button(new Rect(100,100,200,200),"Test DLL"))
    		{
    			long before=System.DateTime.Now.Ticks;
    			Debug.Log("dlltest="+ dlltest());
    			Debug.Log("take "+(System.DateTime.Now.Ticks-before));
    		}
    
    		if(GUI.Button(new Rect(100,300,200,200),"SetCallback"))
    		{
    			long before=System.DateTime.Now.Ticks;
    			SetCallback(callback);
    			Debug.Log("take "+(System.DateTime.Now.Ticks-before));
    		}
    		
    		if(GUI.Button(new Rect(300,300,200,200),"Test Mono"))
    		{
    			long before=System.DateTime.Now.Ticks;
    			Debug.Log("monotest="+ monotest());
    			Debug.Log("take "+(System.DateTime.Now.Ticks-before));
    		}
    	}
    
    	// Update is called once per frame
    	void Update () {
    	
    	}
    
    	long monotest()
    	{
    		long a = 1;
    		int b = 0;
    		while(b<1000000000)
    		{
    			a=a+b;
    			b++;
    		}
    		return a;
    	}
    }
    
    转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

    运行成功

    转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

    示例工程下载:

    http://pan.baidu.com/s/1jG499HW


    转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn


    展开全文
  • unity3D使用dll打包

    2015-09-06 19:07:36
    c#提供了dll打包,但是unity中由于涉及到unity的自身dll,如UnityEngine.dll,我们一般写的很多代码都会涉及到对这个dll的引用,在unity中建代码文件都会默认添加对此dll命名空间的使用,using UnityEngine;...

    unity中有些时候有些代码是一整套的,如果能把他们归类起来作为一个文件整个代码结构看起来就会整洁清爽很多。

    c#提供了dll打包,但是unity中由于涉及到unity的自身dll,如UnityEngine.dll,我们一般写的很多代码都会涉及到对这个dll的引用,在unity中建代码文件都会默认添加对此dll命名空间的使用,using UnityEngine;
    因此在涉及到使用此dll在打包dll的时候就要有点特殊处理。

    项目中常见的是对Debug的二次封装,由于调试的需求,在项目开发周期debug是个很重要且常用的类,但是debug的效率实在是不忍直视,所以在打包apk时出于效率考虑就要屏蔽掉debug的调试,这时要做的可能是删除掉所有对应的代码,这基本上是不可能的,不说这些调试代码可能以后会用到,每次打包都删一次也不实际。还有一种是设定bool值,每次调用Debug类的时候,判定此bool值,每次都要判定,这本书就代码冗余,设计的不合理。这里大家想到的可能都是二次封装了。在封装一个类,调用Debug的时候调用封装的类,但是这又设计到一个问题,Debug调试的一个重要功能就是显示在控制台的信息双击可以跳到指定代码,如果这样二次封装的话就每次跳到封装的代码里,而不是我们想要的地方。有人说可以看堆栈调用信息,可是每次都看,很累的。对于这个问题,便是将二次封装类进行dll打包。

    啰嗦了一大堆,只是说明为什么要对Debug进行二次封装和为什么要用dll的原因,具体方法如下,unity官方提供了相应的教程。

    Unity官方文档教程链接地址

    文档是英文的,但是不难,分别讲解了在Windows条件下和mac条件下的操作方法。

    这里以Windows为例,大概讲解一下。
    流程:

    1.先进入unity的安装目录,找到你引用的dll,地址类似于C:\Program Files\Unity\Editor\Data\Managed
    如你引用了UnityEngine.dll,那么久复制对应的文件。

    2.将复制的文件拷贝到硬盘根目录,根目录的缘故是为了接下来方便操作,也可以在根目录下创建一个文件夹,将文件放入这个文件夹。这里示例为F盘根目录 。注意:不建议放在桌面

    3.将你要打包dll的文件复制到同个地方(示例为F盘根目录)

    4.开cmd界面,进入执行文件的目录,路径大概如下
    C:\Program Files (x86)\Unity4.6\Editor\Data\MonoBleedingEdge\lib\mono\2.0
    根据自己的安装目录进行参考

    5.执行命令,命令大概如下
    mcs -r:F:\UnityEngine.dll -target:library F:\DebugCustom.cs
    其中mcs是命令是要执行的命令,F:\UnityEngine.dll是引用的dll,如果你引用了多个dll,可以加个空格后继续添加,-target:library是指将文件打包成dll,F:\DebugCustom.cs是你要打包成dll的文件,如果文件有多个,同样加空格然后在后面添加

    上面就是流程了,看完了后不知道有没有看出问什么会有上面那个注意了,第五条中空格很关键,而我们桌面的路径有的会有空格,win7的没有,好像是Xp有,所以只是不建议,而不是不能。大家根据自己的情况调整就行。

    文章原创,转载请注明出处

    展开全文
  • Unity3d 调用 C++ DLLDLL回调Unity3d C++ DLL回调 C 函数
  • Unity 3D 调用DLL的方法

    2018-04-22 11:43:10
    1.创建DLL困扰Unity人员的主要问题大概出于Dll不会生成。这个确实比较麻烦,我这里给出一个vs 2008中创建DLL的方法。 1)首先打开vs2008,当然2005或者2003也都差不多。我这里用的是2008. 在C++项目中选择 Win32程序...
  • 网上已经有很多文章讲解过Unity3D脚本DLL 解密,基本方法原理都差不多,就是通过HOOK或者调试下断mono_image_open_from_data_with_name这个函数拿到解密后的DLL。这些方法都需要比较专业的知识(Hook或者过反调试),...
  • Unity3d提供了功能可以让我们自己用各种语言编写 Plugin 来在Unity中使用
  • Unity3D引用dll教程

    2013-07-13 23:39:14
    Unity3D引用dll教程:首先打开vs新建一个项目:建立的项目是c#的类库文件。位置任意。 Unity3D引用dll教程 项目创建好之后就要添加引用,找到Unity3D的安装目录依次打开目录Unity\Editor\Data\Managed,...
  • Unity3D调用.DLL文件

    2018-05-18 22:41:04
    工具:VS(VS2013)、UnityUnity5.2.2) 一.打开VS,新建项目 选择Wint32控制台应用程序 选择DLL和空项目 右键点击添加类 在这里类命名为CallByUnity,点击确定,将生成CallByUnity.h和CallByUnity.cpp ...
  • Unity3d中使用C++ DLL

    2020-06-02 23:32:11
    Unity3d中使用C++ DLL
  • 之前总感觉会封装dll组件的都是大牛级别的程序员做的事情,然后供给菜鸟级别的调用。感觉为了保护自己的源码不会被他人知道,然后就封装一...首先要申明的是,unity3d支持C#语言,但只有pro版本才支持.net2.0,其他版本
  • 如果稍微关注过这方面知识的朋友,应该知道Unity3D做出来的项目是非常容易被反编译的,被反编译后你的所有资源和代码都将会...首先第一篇,我会简单的说明一下怎样在Unity3D里面使用dll动态链接库,然后第二篇会说...
  • 今年我们开始使用Unity3D开发MMORPG,脚本语言使用C#,这样我们就可以使用以往积累的许多类库。但是,在U3D中使用.NET dll的过程并不是那么顺利,比如我们今天遇到的这种问题。 一.问
  • 1.build .dll in MonoDevelop(Unity5.6 buit-in)  新建Library项目。 点击Project下的References后的齿轮,Edit ... 其中Unity3d的库地址参考如下: Windows:……\Unity\Editor\Data\Managed\ Mac:/Applica
  • unity3d调用DLL

    2012-12-22 20:51:40
    接触Unity 3D 时间不长,看到网上有人问怎么通过Unity来调用Dll,而且发现这个问题似乎是用unity的朋友并不熟悉DLL的使用造成的,正好我使用过C++,对DLL还比较熟悉,因此写了一个小小的教程来谈谈unityDll调用...
  • 之前一篇文章阿赵已经简单的介绍了怎样把自己写的代码打包成dll动态链接库,然后在Unity3D里面用。那么接下来的事情似乎就很简单了,我们在Unity3D里面写脚本,到最后完成时,把核心的代码剪切出去打包成dll文件再放...
  • Unity3D调试Native Dll

    2020-03-04 12:44:56
    unity工程如果已经打开,附加这儿为:是, 如果unity工程是关着的,则应该是把附加设置为:否 这时运行vs则会像3一样自动打开unity. 如果一般应该等Unity运行起来再设置断点,否则可能会遭遇错误并且找不到源的问题...
1 2 3 4 5 ... 20
收藏数 5,695
精华内容 2,278