WPF 임베디드 3D 엔진, 몇 솔루션들
첫째. 삽입과정
1. WPF 프로젝트를 만듭니다. (WinForm 도 해당)
2. WindowForm 사용자 정의 컨트롤 라이브러리을 만들기 (UserControl)
- UintyWebPlayer COM 구성 요소를 소개
- 해당 UserControl 컴퍼넌트를 그리고 Dock 속성이 컨트롤의 그 전체를 입력합니다. ( 이 작업을 수행하지 않는 UnityWebPlayer 구성 요소의 크기는 외부 층에서 수정할 수 없습니다.)
- 사용자 정의 프로그램 파일에서 이후에 수정을 목적으로 공공 참조의 UnityWebPlayer 추가
- 참조 추가에서 COM 에 위치한 UintyWebPlayerAXlib 를 참조 추가한다.
참고 : 이렇게 하면 동적으로 UnityWebPlayer 에게 SRC 속성을 수정할 수 있습니다.
3. 새로 생성 된 DLL은 WPF 프로젝트 ( WinForm 프로젝트 ) 에 도입 한 후 System.Windows.Form 및 Windowslnteration 참조
4. WPF XAML 태그의 창에서 사용자 정의 이름은 자신이 정의 : xmlns : unity = "...."<Grid> 에서 추가. <WindowsFormHost> 태그로 추가 된 우리의 WindowsForm 사용자 정의 구성요소를 수행하는데 사용 <unity:UnityPlayer x : Name = "UnityPlayer"> 따라서, 동적으로 C#에서 구성 요소를 로드 할 수 있습니다. WPF에 UnityWebPlayer이 포함됩니다. 당신은 단지 WindowsFormHost.Child = UnityPlayer 를 설정해야합니다.
둘째. Unity3D와 WPF 양방향 통신
WPF -> Unity3D 통신
1) 우리 모두가 아는 모델 방법인 SendMessage 가 있다. (바이에 자신을 이해하지 않습니다.)
2) SendMessage 의 매개 변수 : SendMessage(개체 이름(string), 메소드 이름(string), 메소드 매개 변수(obejct));
참고 : 만으로 해결하지 일시적으로 변경할 수 안전하지 않은 COM 구성 요소 모델을 제안, bool 형을 보낼 때, 난 그냥 제대로 문자열 int형의 전송 SendMessage 방법 매개 변수를 보내... 스크립트는 bool 매개 변수 문자열이 아니라 친구에 대한 문제를 해결하는 방법이 int 형 및 증가 판정 희망을 받습니다.
마우스 오른쪽 버튼을 BUG
1) 3D 모델의 기본적인 조작은 마우스 오른쪽 버튼 모델의 관점을 회전 마우스를 드래그하여 나중에 밀리고 있지만 로드 한 후 UnityWebPlayer WPF는 버그가 있음 : 컨텍스트 메뉴
2) 거기에 오른쪽 클릭 메뉴의 문제를 제거하기 위한 많은 온라인 방법이 있지만, 페이지 중에서 제거하고 UnityWebPlayer 포장 된 컨트롤은 여전히 오른쪽 클릭 메뉴를 수행한다. 우여곡절 일련의 후 직접 없습니다.
컨텍스트 메뉴 문제의 제거를 제어합니다. 인터넷에서 모든 메소드는 페이지 메뉴의 문제를 해결하기 위한 JS코드를 변경할 수 있는 권리가 있지만, WPF의 JS코드를 변경하는 방법은 없습니다. 내가 그렇게 우리는 출시 후 html 파일 Unity3D를 사용할 필요가 없습니다. 그렇다면 어떻게 이 문제를 해결하려면? 내 방법은 마우스 오른쪽 버튼을 클릭 리프트, 프레스 마우스 모델에 메시지를 보내 화면에 비칠때 3개의 이벤트를 차단하는 것입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | /// <summary> /// 패키지 U3D WebPlayer 제어 마우스 오른쪽 메뉴 기능 표시 OCX 방패 /// </summary> public class U3DPlayer:AxUnityWebPlayerAXLib.AxUnityWebPlayer { #region 일정한 영역 정의, 마우스 정보 private const int WM_RBUTTONDOWN = 0x204; private const int WM_RBUTTONUP = 0x205; private const int WM_RBUTTONBLCLK = 0x206; #endregion /// <summary> /// 적당한 메시지 바로 해결을 차폐 메뉴는 문제가 표시됩니다. /// </summary> /// <param name="msg"></param> /// <returns></returns> public override bool PreProcessMessage(ref Message msg) { switch (msg.Msg) { case 0x204: //마우스 오른쪽 버튼을 누르면 메시지 this.SendMessage("ThiredViewCamera", "RightMouseButtonDown", null); this.SendMessage("FirstViewCamera", "RightMouseButtonDown", null); this.SendMessage("Main Camera", "RightMouseButtonDown", null); this.Focus(); return true; case 0x205://오른쪽 리프트 뉴스 this.SendMessage("ThiredViewCamera", "RightMouseButtonUp", null); this.SendMessage("FirstViewCamera", "RightMouseButtonUp", null); this.SendMessage("Main Camera", "RightMouseButtonUp", null); return true; case 0x206://Right-click on the message return true; } return base.PreProcessMessage(ref msg); } } | cs |
주의 : SendMessage 함수는 나의 관점에서 스크립트 메서드는 이 버그를 해결해야 합니다. 드래그 모델로 기술 된 파라미터를 전송되는 스크립트 Unity3D를 변경하는 것이 필요하다고 할 수 있습니다.
사실, 메시지 흐름이 통신하기 위해 마우스 메시지를 보냅니다. WPF -> OCX -> unity3D
Unity3D 모두 메시지 OCX를 전송 모델에 직접 메시지를 보낼 마우스 오른쪽 버튼을 생략 -> 지금 WPF 변경
Unity3D -> WPF 통신
1) 사실, Unity3D 및 WPF 통신 뿐만 아니라 Unity3D 스크립트에서 SendMessage 를 통해 상호 작용하도록 우리는 메시지를 보내는 이벤트를 지정할 수 있습니다.
1 | public void OnMouseUp() { Application.ExternalCall("Ip",aaa);//클라이언트 IP로 전송 } | cs |
참고 : 마우스 모델은 스크립트에 바인딩 할 때 스크립트가 해체 된 경우에는 Application.ExternallCall 메시지 보내기. 메시지는 IP로 WPF ("AAA") 에 보낸다는 것을 문자열이기 때문에, 당신은 그것을 조작하는 방법을 알고 있어야합니다.
2) WPF 는 어떻게 내가 보낸 메시지를 받을 수 있습니까
메타 데이터에서 UnityWebPlayer 에서 다음과 같이 입력하고 그런 대리자(콜백 함수) 가 있습니다. :
1 | public event _DUnityWebPlayerAXEvents_OnExternalCallEventHandler OnExternalCall | cs |
예를 들면 : 네, 매개 변수에 해당 자신의 WPF에서 함수를 구축 :
1 | private void ReturnIp(object sender, _DUnityWebPlayerAXEvents_OnExternalCallEvent e) { string Ip = e.value; } | cs |
인스턴스 생성시에 그냥 접근 UnityWebPlayer 대리자에 OnExternalCall 방법 :
1 | axPlayer.OnExternalCall += new _DUnityWebPlayerAXEvents_OnExternalCallEventHandler(ReturnIp); | cs |
따라서 UnityWebPlayer 가 보낼 때 OnExternalCall 메시지를 당신의 WPF 프로그램이 반환로 인한 메시지가 표시됩니다.
구체적으로는 혼자서 작업하는 방법.
SRC 는 동적 Unity3dPlayer 을 변경하는 속성
1) 우리는 마우스 메시지를 도청 할 때 2.2에서 그 클래스를 구현하고 AxUnityWebPlayerAXlib.AxUnityWebPlayer 을 계승하고 있습니다.
2) 다음과 같이 ActiveX 컨트롤 코드를 캡슐화 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class Unity3dControl:UserControl { public Unity3dControl() { } public void LoadScence(string Src) { if (Src != "" && Src != null)//加载的路径地址不为空 { axPlayer = new U3DPlayer(); this.axPlayer.BeginInit(); base.Controls.Add(this.axPlayer); this.axPlayer.EndInit(); this.axPlayer.src = Src; AxHost.State ocxState = this.axPlayer.OcxState; axPlayer.IsAccessible = false; this.axPlayer.Dispose(); this.axPlayer = new U3DPlayer(); this.axPlayer.BeginInit(); this.axPlayer.OcxState = ocxState; this.axPlayer.Dock = DockStyle.Fill; base.Controls.Add(this.axPlayer); } } } | cs |
당신은 그 LoadScence Src 속성을 설정 한 후 Unity3dControl 를 인스턴스화 할 때마다 그래, 당신은 동적 부하 모델을 제공 할 수 있습니다.
원본 사이트 : 关于使用WPF嵌入UnityWebPlayer问题解决
다음에도 최대한 유용한 정보를 가져오겠습니다.
'잡다한 자료(번역) > WinForm+Unity3D' 카테고리의 다른 글
WPF에 Unity을 합체, 양방향 통신 구현 (1) | 2015.07.09 |
---|---|
C# WinForm에 다른 응용 프로그램을 포함 형성하는 법 (1) | 2015.07.09 |
최근댓글