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问题解决


다음에도 최대한 유용한 정보를 가져오겠습니다.


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기