igdshare 110220: 以傳統程式開發者角度切入 unity3d

42
以傳統程式開發者的角度 切入UNITY3D

Upload: igdshare

Post on 25-May-2015

2.047 views

Category:

Technology


4 download

DESCRIPTION

An introductory to Unity3D engine for programmers who are already familiar with SDL, D3D, OpenGL, Ogre.. or so. http://blog.igdshare.org http://www.youtube.com/user/igdshare

TRANSCRIPT

Page 1: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

以傳統程式開發者的角度切入UNITY3D

Page 2: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

傳統程式開發者

程式開發的過程以非視覺化方式來完成視覺化的程式

Windows

Windows 32API,MFC

Windows

VB, C#, DotNet, ( Windows Forms )

Page 3: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

傳統程式開發者

程式開發的過程以非視覺化方式來完成視覺化的程式

3D Game

Ogre, SDL,DX API,OpenGL API

3D Game

Unity3D …

Page 4: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

Unity3D

Rendering Engine Editor Publishing

Page 5: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

Unity3D

Rendering Engine Editor Publishing

Page 6: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

Unity3D

Rendering Engine Editor Publishing

Page 7: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

程式開發者在 Unity3D 中的角色

Editor

Publishing System (Compiler)

成品 (執行檔)

物件反應, 行為

3D模型執行流程

美工貼圖

場景編輯

Page 8: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

程式開發者在 Unity3D 中的角色

Editor

物件反應, 行為

3D模型

場景編輯

執行流程

美工貼圖

Publishing System (Compiler)

成品 (執行檔)

Page 9: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

程式開發者在 Unity3D 中的角色

Editor

物件反應, 行為

3D模型

場景編輯

執行流程

美工貼圖

Publishing System (Compiler)

成品 (執行檔)

Unity3D API

Page 10: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

如何開始?

新增一個 Script File (C#, javascript,…) 使用 Unity 提供的 API 設定此 Script File 為 Main Camera 的行為 (依

附在 Main Camera 上)。

Init.csInit.js

OnAwake

Update

OnRenderObject

OnDisable

於初始化程式時呼叫

每繪一個 frame 呼叫一次

每繪一個 frame 呼叫一次

於程式結束時呼叫

Page 11: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

如何開始?

將 unity3d 當成 rendering engine 來使用 Unity3d editor 視為輔助工具

Debug 快速視覺化編輯場景

Page 12: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

如何變換場景 ? 如何隱藏視窗外框 ? 執行時期載入模型及圖檔 ? 要不要使用 Unity3D 提供的 GUI ? 使用 MeshText 還是 GUI Text ? 使用 Unity3D 提供的 IME 支援 ? 如何擷取 Unity3D 的 WndProc Message ? Embedded html browser ? 使用 Lua Script engine ?

Page 13: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

如何變換場景 ? 變換 editor 預編的場景 (scene)

Loadlevel LoadlevelAdditive

變換程式動態產生的場景 Multi-camera with culling mask Create and Destroy object

Page 14: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

如何變換場景 ? 如何隱藏視窗外框 ? 執行時期載入模型及圖檔 ? 要不要使用 Unity3D 提供的 GUI ? 使用 MeshText 還是 GUI Text ? 使用 Unity3D 提供的 IME 支援 ? 如何擷取 Unity3D 的 WndProc Message ? Embedded html browser ? 使用 Lua Script engine ?

Page 15: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

如何隱藏視窗外框 ? unity 沒有這個 api Dllimport win32 api

GetActiveWindow HWND GetWindowLong SetWindowLong

Page 16: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

如何變換場景 ? 如何隱藏視窗外框 ? 執行時期載入模型及圖檔 ? 要不要使用 Unity3D 提供的 GUI ? 使用 MeshText 還是 GUI Text ? 使用 Unity3D 提供的 IME 支援 ? 如何擷取 Unity3D 的 WndProc Message ? Embedded html browser ? 使用 Lua Script engine ?

Page 17: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

執行時期載入模型及圖檔 ? 使用 Unity 支援的指令 (WWW)

只能載入特定格式檔案 (jpg, png, fbx, .asset,…)

自行對檔案解碼 freeimage library …

Page 18: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

執行時期載入模型 3dsmax, maya,… 輸出或轉成 fbx 檔案… 使用 editor 載入 fbx 模型並利用 editor 預編場景

(各個模型位置, 旋轉角度,…) 輸出成 .asset 格式檔案 上述工作可由美術獨立完成 程式執行時使用 WWW api 將 .asset 檔案載入

Page 19: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

執行時期載入圖檔 程式執行時使用 WWW api 將 .jpg 或 .png 載入

限制 只能載入 jpg, png 格式檔案 載入非 2次方大小圖檔會自動對圖片進行線性濾

鏡縮放

Page 20: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

如何變換場景 ? 如何隱藏視窗外框 ? 執行時期載入模型及圖檔 ? 要不要使用 Unity3D 提供的 GUI ? 使用 MeshText 還是 GUI Text ? 使用 Unity3D 提供的 IME 支援 ? 如何擷取 Unity3D 的 WndProc Message ? Embedded html browser ? 使用 Lua Script engine ?

Page 21: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

要不要使用 Unity3D 提供的 GUI ? 快速, 基本功能完整, 可更換 skin

限制 GUI 不可與 GameObject 互動 GUI 的移動, 旋轉, 縮放, uv coord 控制,不如

GameObject 來的容易 不可使用自訂的 shader

Page 22: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

要不要使用 Unity3D 提供的 GUI ? 自製 UI 所需要的功能

使用正交投影矩陣之 Camera 3D Mesh + Texture 3D Text

Page 23: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

如何變換場景 ? 如何隱藏視窗外框 ? 執行時期載入模型及圖檔 ? 要不要使用 Unity3D 提供的 GUI ? 使用 MeshText 還是 GUI Text ? 使用 Unity3D 提供的 IME 支援 ? 如何擷取 Unity3D 的 WndProc Message ? Embedded html browser ? 使用 Lua Script engine ?

Page 24: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

使用 MeshText 還是 GUI Text ? MeshText

可用於 GUI Text 可與 3d object 互動 貼圖於 3d 物件上 被 3d 物件摭蔽

可自訂 shader

GUI Text 只用於 GUI

Page 25: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

使用 MeshText 還是 GUI Text ? 將 Camera 的投影模式設定成 Orthographic,並設

定 Orthographic Size 為 Screen.height 的 0.5 倍。 設定 3D Text 物件 Scale 的 x, 和 y 固定是 10

倍,此時的 Font Size 值效果將與 GUI Text 的 Font Size 值效果相同。

Page 26: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

使用 MeshText 還是 GUI Text ?

Page 27: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

如何變換場景 ? 如何隱藏視窗外框 ? 執行時期載入模型及圖檔 ? 要不要使用 Unity3D 提供的 GUI ? 使用 MeshText 還是 GUI Text ? 使用 Unity3D 提供的 IME 支援 ? 如何擷取 Unity3D 的 WndProc Message ? Embedded html browser ? 使用 Lua Script engine ?

Page 28: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

使用 Unity3D 提供的 IME 支援 ? Unity3d 支援 IME,

只顯示 composition window Candidate window, Reading Window, 仍舊使用 win32 native window 來顯示

Page 29: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

使用 Unity3D 提供的 IME 支援 ? 全螢幕模式下無法顯示 Reading Window 及

Candidate Window。

Page 30: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

使用 Unity3D 提供的 IME 支援 ? 自製 IME

IME 處理函數 (參考 DX SDK) 關閉原本 Unity3D 在 IME 的功能 接管 Unity3D 原本的 WndProc function, 處理 IME 相關之

message。

Page 31: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

如何變換場景 ? 如何隱藏視窗外框 ? 執行時期載入模型及圖檔 ? 要不要使用 Unity3D 提供的 GUI ? 使用 MeshText 還是 GUI Text ? 使用 Unity3D 提供的 IME 支援 ? 如何擷取 Unity3D 的 WndProc Message ? Embedded html browser ? 使用 Lua Script engine ?

Page 32: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

如何擷取 Unity3D 的 WndProc Message ?

Windows

Unity WndProc Function

Page 33: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

如何擷取 Unity3D 的 WndProc Message ?

Windows

Custom WndProc Function

Unity WndProc Function

Page 34: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

如何擷取 Unity3D 的 WndProc Message ?

pUnityWndProc =(WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC, (LONG)CustomWndProc);

Page 35: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

如何變換場景 ? 如何隱藏視窗外框 ? 執行時期載入模型及圖檔 ? 要不要使用 Unity3D 提供的 GUI ? 使用 MeshText 還是 GUI Text ? 使用 Unity3D 提供的 IME 支援 ? 如何擷取 Unity3D 的 WndProc Message ? Embedded html browser ? 使用 Lua Script engine ?

Page 36: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

Embedded html browser QtWebKit

本身具有 html renderer, 輸出成 bmp 格式圖檔

Unity3D WebKit Wrapper QtWebKitDLL

URL URL

BYTE Image(RGBA32)

float Texture(Color Array)

Page 37: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

Embedded html browser

Page 38: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

Embedded html browser

Page 39: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

如何變換場景 ? 如何隱藏視窗外框 ? 執行時期載入模型及圖檔 ? 要不要使用 Unity3D 提供的 GUI ? 使用 MeshText 還是 GUI Text ? 使用 Unity3D 提供的 IME 支援 ? 如何擷取 Unity3D 的 WndProc Message ? Embedded html browser ? 使用 Lua Script engine ?

Page 40: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

使用 Lua Script engine ?

Unity3D

C#, javascript,…

Lua Script Game Logic

High level GameAPIHigh level Rendering API

Page 41: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

幾個開發中遇到的疑問

使用 Lua Script engine ? Compiling lua dll with stdcall Dllimport lua function

Page 42: igdshare 110220: 以傳統程式開發者角度切入 Unity3D

thank you

[email protected]