2015-05-15 20:16:37 cp790621656 阅读数 6826
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

上篇   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


2019-02-12 20:33:49 qq_43667944 阅读数 163
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

               

上篇   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


           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

2019-01-21 13:56:51 qq_43667944 阅读数 46
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

               

Unity3d提供了功能可以让我们自己用各种语言编写 Plugin 来在Unity中使用,官方有简单的文档介绍

http://docs.unity3d.com/Manual/30_search.html?q=dllimport

之前的博文介绍了在 Android 平台使用C++ Plugin。

http://blog.csdn.net/huutu/article/details/43602659

本文在Win平台使用C++ DLL。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

编译一个简单的C++ DLL

首先来编译一个简单的C++ DLL供Unity3d 使用。转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

在VS 中选择控制台 项目

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

选择空项目 动态链接库

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

然后添加代码 Calculate.h   Calculate.cpp 文件。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

Calculate.h 代码如下:

# define _DLLExport __declspec (dllexport) //标记为导出函数;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;}

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

将 配置 修改为 Release ,我们编译一个Release 版本。 找到编译出来的 DLL文件,例如我这里是 TestDLL.dll 。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

在Unity3d工程中使用DLL

创建一个Unity3d工程,在Assets 下创建 文件夹 Plugins 目录,把我们的DLL 文件 放到这个目录中。

测试代码如下:

using UnityEngine;using System.Collections;using System.Runtime.InteropServices;public class NewBehaviourScript : MonoBehaviour { [DllImport ("TestDLL")private static extern long dlltest()// Use this for initialization void Start () {  } 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(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; }}

使用DLL 中的函数要按照如下格式:

[DllImport ("TestDLL")private static extern long dlltest();
转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn


DllImport 参数说明:

EntryPoint                 指定要调用的 DLL 入口点。

CharSet                    控制名称及函数中字符串参数的编码方式。默认值为 CharSet.Ansi。

ExactSpelling          是否修改入口点以对应不同的字符编码方式。

CallingConvention  指定用于传递方法参数的调用约定。默认值为 WinAPI。该值对应于基于32位Intel平台的 __stdcall。

BestFitMapping      是否启用最佳映射功能,默认为 true。最佳映射功能提供在没有匹配项时,自动提供匹配的字符


运行结果


示例工程下载:

http://download.csdn.net/detail/cp790621656/8699673


           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

2020-02-20 11:58:23 tpz789 阅读数 85
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

Unity3D 调用C++的DLL的代码## 标题

参考文献:
https://blog.csdn.net/penguin_whl/article/details/17616659#commentBox
我使用的是 vs2017生成的DLL
一、VS2017新建动态链接库项目

  1. 使用vs2017创建一个 名为 Unity-DLL的动态链接库
    在这里插入图片描述
  2. VS2017自动生成以下文件:
    在这里插入图片描述
  3. 添加TestDll.h, 并将Unity-DLL.cpp改为TestDll.cpp文件
    TestDll.h中加入如下代码:
    #pragma once
    #ifndef TEST_DLL_H
    #define TEST_DLL_H
    #endif

#if defined (EXPORTBUILD)

define _DLLExport __declspec (dllexport)

else

define _DLLExport __declspec (dllimport)

#endif

extern “C” int _DLLExport add(int x, int y);

_DLLExport class TestDll
{
public:
TestDll(void);
~TestDll(void);
};

TestDll.cpp中输入如下代码:
#define EXPORTBUILD

#include “TestDll.h”

int add(int x, int y )
{
return x + y;
}

TestDll::TestDll(void)
{
}

TestDll::~TestDll(void)
{
}

  1. 环境配置设置为Debug x64
    在这里插入图片描述

  2. 生成→生成解决方案
    在这里插入图片描述

  3. 生成:成功1个;
    在这里插入图片描述

  4. 在E:\4-Unity\DLL\Unity-DLL\x64\Debug中有生成的Unity-DLL.dll
    在这里插入图片描述
    二、Unity3D 调用.dll

  5. Unity3D 新建一个项目
    在这里插入图片描述

  6. 把生成的Unity-DLL拖到Unity的Asset–>Plugins目录(没有就创造一个)
    在这里插入图片描述

  7. 在Assets右侧右键单击→Create→C# Script,新建一个C#文件,假设命名为UnityTestDll
    在这里插入图片描述
    在这里插入图片描述

  8. 双击UnityTestDll,用VS2017打开
    在这里插入图片描述
    在UnityTestDll.cs中输入代码:
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System.Runtime.InteropServices;

public class UnityTestDll : MonoBehaviour
{

[DllImport("Unity-DLL")]
private static extern int add(int x, int y);

int i = add(5, 7);

// Use this for initialization
void Start()
{

}

// Update is called once per frame
void Update()
{

}

void OnGUI()
{
    GUI.Button(new Rect(1, 1, 200, 100), "this dll i = 5+7, i is" + i);
}

}

保存关闭。

  1. 回到Unity3D,将UnityTestDll拖到Main Camera里面,或者新建一个对象,如Cube,将UnityTestDll拖到其里面。
    在这里插入图片描述
    在右侧Inspector面板最下面有我们刚刚加入的Script。
    在这里插入图片描述
    13.点击运行
    在这里插入图片描述
    运行Unity显示结果
    在这里插入图片描述
    调用成功。
2019-02-09 13:40:07 qq_43667944 阅读数 65
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

               

因为Unity 采用C# 作为主要语言,代码编译之后作为DLL存在与执行文件中,这就给我们带来很大的一个问题,反编译非常容易。


如何反编译Unity游戏的代码:

Unity打包生成的安装包,我们随便下载一个游戏,解压APK,来到

assets\bin\Data\Managed

这个目录。

Assembly-CSharp.dllAssembly-CSharp-firstpass.dll

你在游戏中编写的代码就存放在这两个dll中。

把dll拖放到MonoDevelop中,稍等片刻,就能看到dll中的代码。


如果有一些比较重要的代码不想让别人看到,那就用C++来编写,C++编译成so文件,反编译之后只能成为汇编语言,无疑加大了破解难度(当然不能百分百防破解,汇编大牛很多的)


我们先新建一个文件夹,在里面新建一个jni文件夹,新建一个c文件,内容如下:

#include<string.h>  #include<jni.h>  int Share()return 1234561;}

就这么一个函数吧,供C#调用。


然后新建一个Android.mk文件,这是NDK编译SO需要的一个mk文件,在里面指定了如何编译。

LOCAL_PATH := $(call my-dir)  include $(CLEAR_VARS)  LOCAL_MODULE := Share  LOCAL_SRC_FILES := Share.c  include $(BUILD_SHARED_LIBRARY)

然后新建一个Application.mk文件,指定编译平台以及其它的依赖。

APP_ABI :=armeabi-v7aAPP_PLATFORM:=android-8APP_STL:=gnustl_staticAPP_CFLAGS += -Wno-error=format-security




然后在jni文件夹中执行命令:

ndk-build

就会编译出来so文件,存放在上一级的lib中。



新建一个Unity3d的工程,然后编写代码,调用so中的的函数。

using UnityEngine;using System.Collections;using System.IO;using System.Runtime.InteropServices;using System;public class test : MonoBehaviour { [DllImport("Share")private static extern int Share()// Use this for initialization void Start ()  {  Debug.Log("Shared = "+Share()); }  // Update is called once per frame void Update () {  }}

注意 如果要调用SO中的函数一定要按照Unity指定的规则来编写:

[DllImport("Share")]private static extern int Share();


在Unity工程中新建目录

Plugins\Android

拷贝SO文件到这里



然后我们导出APK安装测试



Demo工程下载:

http://download.csdn.net/detail/cp790621656/8430985



           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

Unity3D中C#调用iOS的静态库(*.a)

博文 来自: skylin19840101
没有更多推荐了,返回首页