概述
前言
大概是去年还没开学的时候,提前到校,给老师干活拿到的需求,可能也跟我说对unity3D有兴趣有关系吧。总之就是unity3D做模拟环境,但是呢,要嵌入要其他的软件中去使用,窗口环境,也就是题目上的那几种,Winform、MFC。
先写一写印象中的思路,代码还要再找找…电脑数据丢过,不太好找到了。
就在这个时候…我翻了一下聊天记录,梳理了思路。
unity嵌入Winform
在winform中可以嵌入unity专用插件
unity相对路径的设置
大家都知道,在插件初始化的时候,会直接加载完成这个插件的内容,也就是说,如果直接用插件本身去读取unity,需要使用绝对路径,这样就无法实现分布式了,肯定是不能直接提交给上级的。
所以,思路大概是这样的,首先在界面中加入一个窗口的控件,在这个空间里加载一个UnityWebPlayer Control,由于是在空白控件上生成一个新的控件,所以可以在代码中对unity路径进行设置,也就实现了相对路径。
也可借鉴WinFrom内嵌Unity3D
具体代码找不到了…只有一部分PPT讲解时候的记录
private void InitUnity()
{
var unity = new AxUnityWebPlayerAXLib.AxUnityWebPlayer();
((System.ComponentModel.ISupportInitialize)(unity)).BeginInit();
Controls.Add(unity);
((System.ComponentModel.ISupportInitialize)(unity)).EndInit();
unity.src = Application.StartupPath + "\u.unity3d"; //改成自己想要的路径
AxHost.State state = unity.OcxState;
unity.Dispose();
unity = new AxUnityWebPlayerAXLib.AxUnityWebPlayer();
(System.ComponentModel.ISupportInitialize)(unity)).BeginInit();
this.SuspendLayout();
unity.Dock = DockStyle.Fill;
unity.Name = "Unity";
unity.OcxState = state;
unity.TabIndex = 0;
this.Controls.Add(unity);
((System.ComponentModel.ISupportInitialize)(unity)).EndInit();
this.ResumeLayout(false);
}
unity与winform的通讯过程
由于嵌入winform的是unity的专用控件,所以通讯方式也是内部直接写好的
//winfrom向unity的名为air的gameobject的Channel方法,发送task消息
private void button_Click(object sender, EventArgs e)
{
axUnityWebPlayer1.SendMessage("air", "Channel", task);
}
//unity接收winform发给Channel方法的消息string c
public void Channel(string c) {
StartCoroutine(GetRoutine(c));
}
//unity向winform中unity控件的LOAD_COMPLETE方法发送""消息
Application.ExternalCall("LOAD_COMPLETE", "");
//winform接收unity发来的消息
//e.value == "LOAD_COMPLETE()"
//e.value.StartsWith("LOAD_COMPLETE") == true
private void axUnityWebPlayer1_OnExternalCall(object sender, AxUnityWebPlayerAXLib._DUnityWebPlayerAXEvents_OnExternalCallEvent e)
{
this.label1.Text = e.value;
}
unity嵌入MFC
这里由于UnityWebPlayer Control并不兼容MFC,所以需要借用另外的方式来实现这一需求,UnityWebPlayer原本就是为网页游戏提供的一种插件,自然可以在网页控件上实现,这里我在MFC中加入web browser也就是浏览器的意思。unitywebplayer在导出的时候,会有html、js、unity3d等多个文件,html是静态文件,所以选用js来跟unity做交互,通过js对unity、mfc的消息进行转发,来达到unity与mfc互通的目标。
unity→js→mfc
//unity
Application.ExternalCall("SayHello_From_Unity", "The game says hello!");
//js
function SayHello_From_Unity(args) {
alert(args);
o.ShowMessageBox("~~~");
}
//mfc
void CRobotteach::ShowMessageBox(const wchar_t *msg)
{
MessageBox(msg, L"这是来自javascript的消息");
}
mfc→js→unity
//mfc
//m_unity是一个WebBrowser的Activex控件对象。
CComQIPtr<IHTMLDocument2> spDoc = m_unity.get_Document();
CComDispatchDriver spScript;
spDoc->get_Script(&spScript);
//代码更新于VS2017
CComVariant var1 = 10, var2 = 20, varRet;
spScript.Invoke2(L"Add", &var1, &var2, &varRet);
//代码更新于VS2015
CString hello = L"Hello--MFC";
VARIANT res = _variant_t(hello);
HRESULT hr = spScript.Invoke1(L"SayHello_From_MFC",&res);
//js
function SayHello_From_MFC(args) {
alert(args);
u.getUnity().SendMessage("arm", "Hello", "Hello from a web page!");
}
//unity
public void Hello(string args) {
DebugConsole.Log(args);
}
js主动向unity,是需要一定基础的,在这篇文章中可以找到答案。
最后
以上就是典雅酒窝为你收集整理的unity3D嵌入Winform、MFC的实现方式前言unity嵌入Winformunity嵌入MFC的全部内容,希望文章能够帮你解决unity3D嵌入Winform、MFC的实现方式前言unity嵌入Winformunity嵌入MFC所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复