NGUI 基礎知識


UIRoot

管理 scalePixelPerfect : 像素匹配,圖片不會被縮放,除非屏幕高度小於 Minimum Height 或者大於 maximum  Height,如果那樣的話,就使用 FixedSize。

FixedSize : 圖片都會被等比縮放。

FixedSizeOnMobile : 意思是PC用 PixelPerfect,手機用 FixedSize。

 

 

Sprite的各種類型

Simple: 簡單的填充,縮放

Sliced: 九宮格,要設置好border

Tiled: 重復平鋪

Filled: 各種填充,像技能的冷卻360度旋轉。

 

Anchor

None:

Unified: 可以指定另外一個對象,以這個對象來對准我。分為 left, right, top, bottom。

Advanced: 可以分別為 left, right, top, bottom 指定一個對象來對齊,也就是可以指定4個。

 

Sprite像按鈕一樣響應

新建一個Sprite -> Add Component -> 腳本 -> Button -> 自定義鼠標上移、點擊時的顏色 -> 自定義 onClick 事件,可以指定對象,調用某個對象腳本的某個函數等

 

如何拖動界面

UISprite

1. 添加一個 Drag Object Component

2. 添加 Box Collider,要填 Size (操作:scene中右擊 Sprite -> Attach -> BoxCollider)

3. Anchor 要設為 None,否則拖了之后又會回到原位

 

設置控件對齊

選中某個控件 -> Anchors -> Type 選中為 Unified -> 選擇要對齊到哪個對象 -> 設置對齊。

可以實現諸如左上角、中間等對齊方式。

 

button上面放置一個 Label,鼠標放在 Label 上面,點不到 button ,為什么?

因為 Label 上面也有 BoxCollider,他會接收消息,他把按鈕擋住了。解決辦法:去掉 Label 的 BoxCollider 組件。

 

為什么自帶的demo中按鈕附加了2個 UI Button  組件?

注意, UI Button 有一個 Tween Target 選項,他表示要對哪個對象進行顏色過渡。(這個可能很有用

有2個 UI Button 組件是因為,1個是給 Button 的 Sprite 使用的,一個是給 Button 上面的 Label 使用的。

 

(接上一條)為什么不給 Label 自己也添加一個 UI Button 組件?

看上一個問題,因為 Label 本身沒有 Collider ,他無法接收事件!

 

對於一個 Button,你可以在他的 UI Button 組件中響應 OnClick 事件。那么如何響應 OnHover 事件?

答:添加 EventTrigger 組件。

 

如何讓一個控件逐漸變大變小?

TweenHeight, TweenWidth

 

如何在按下鍵盤的時候等同於按下按鈕?

UIKeyBinding

 

NGUI是Bitmap字體,Unity是動態字體

在控件上面Attach一個Box Clider ,他才可以接收事件。

 

如果在運行時查看鼠標下的UI控件是哪一個?

選中Camera -> 在 Inspector 中查看 UICamera 的屬性,有一個 Debug ,給他打勾。

然后運行程序,鼠標放在哪個控件上面,左上角就會顯示那個控件的名字。

但是,只有控件有 Box Collider 組件時,也就是他必須能接收消息,才可以選中他。

 

UIWidget 是啥玩意兒

UIWidget 是不可見的矩形,他不畫圖,但是他可以接收事件。可以用於包含其他控件。他包含 Anchor。 Sprite,Label 都是從 Widget 繼承的。

 

Panel 深度的優先級比普通的 Widget 高!!

事件是先傳給 Depth 較高的 Panel,如果這個 Panel 中的某個 Widget( 不知道什么是 Widget?看上一條)擋住了鼠標,那么事件是不可能傳遞到 Depth 較低的 Panel 上去的。

注意:Panel 本身是不會擋住鼠標的,只有擺在他上面的 Widget 會擋住。

主要用途:Container,Scroll View 中使用。

 

 

當發生鼠標無法響應的bug時,如何知道鼠標事件是被誰擋住了?

選擇 UIRoot 下的 Camera -> 定位到 UI Camera 組件 -> 勾選 Debug。再運行,屏幕上會顯示鼠標下是哪個控件。

 

如何在編輯器中使用 UI Button 的 onClick 選項?

假設這個含有 UI Button 組件的對象叫做 btn,假設有一個界面叫 Bag,在 Bag 上面添加一個腳本,里面定義一個 public void Toggle() {},必須要 public void 並且不能有參數,

把 Bag 對象拖到 UI Button 組件的 onClick 選項中,然后你就可以選擇 Toggle() 函數了。當按鈕被點擊后, Bag 的 Toggle() 函數就會被調用。

假如 Toggle() 函數是這樣實現的:

1 public void Toggle()
2 {
3     gameobject.setActive(!gameobject.activeSelf);
4 }

那么這個 btn 就實現了,開關包裹界面的功能。

 

關於 Box Collider 的注意事項

如果你是先選中一個對象,再右擊->Attach->Box Collider,添加完后 Box Collider 的 Size 會自動填寫成控件的大小;

如果你是在 Inspector 中點擊 "Add Component"按鈕去添加 Box Collider 組件,Size 是不會自動填的!

 

Grid控件的使用

1. 將對象做為 Grid 的子對象即可受 Grid 管理

2. 在 Inspector 中,右擊 Grid,選擇 ‘Execute’,可以在編輯器中即看到控件按順序排列好

 

-------------------------------------------------------------------------------------------------------------------------------

------------ Scroll View -------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------------------

 

Scroll View 使用流程

NGUI,或者說 Unity,要為對象添加功能,都是同一種方法:那就是為對象添加組件,通常都是腳本,然后再對此組件設置一些參數就可以達到目的。

要滾動 Scroll View,第1步:右擊要被鼠標拖動的對象(當然這個對象必須要有 Box Collider 對象),Attach -> Drag Scroll View。第2步:將 Scroll View 設置給 添加的那個組件做為參數即可。

 

1. NGUI -> create -> Scroll View

2. 將對象 btn1 做為 sv 的子對象,這些子對象就會在這個 sv 中間,出不去

3. 為btn1添加拖動事件:btn1 -> attach -> box collider

4. 拖動方向改為垂直:選sv -> inspector -> UIScroll View -> Movement -> Vertical

5. 選sv -> 右擊 -> create -> invisible widget ,命名為 dragBg,將其的 Depth 設為最大

6. dragBg -> 右擊 -> attach -> box collider

7. dragBg -> 右擊 -> attach -> drag scroll view

8. 將 sv2 拖至 dragBg's Inspector 中的 scroll view

9. 如果要讓整個scrollView 內部都可以響應拖動,可能要新建另一個 panel。scroll View 本身也是帶一個panel。

 

 

拖動:

1、為對象添加腳本 Drag and Drop Item 腳本,你就可以拖着他走了。

2、如果一個對象既有 Drag and Drop Item  和  Drag Scroll View,現在看來似乎前者要優先。

3、為一個panel添加一個  drag and drop root,就可以將對象拖動經過他,不過這個panel的深度要比較高,也就是比較前面!!原理是什么?原理是,如果在scroll view中,拖東西出來的話,不會顯示的,會被Clip。所以你需要有一個root,當一個具有 drag and drop item 的對象被拖動時,這個對象會自己將自己的parent設置為這個root,這樣他才可以被拖出來。

4、添加 grid 控件:NGUI -> create -> gird

5、一個 grid 控件,實際上就是啥呢,就是一個 GameObject + UIGrid 腳本。一模一樣的。

6、創建一個sprite,添加組件 Drag and Drop Container,然后可以指定 Reparent target,可以把對象重新定義父結點。你可以把一個對象拖到container上,在drag and drop item 腳本中,當 Release 時,當前鼠標下的對象是 OBJ,會去搜索 OBJ 是否具有一個 Container 的父結點,如果有,就他了

 

Localization

可以處理多種語言,待研究。

 

Font Maker

制作 Bitmap Font

NGUI 的事件是由 UICamera 發的

 

自定義 Prefab 的縮略圖

-----------------------------------

創建一個子對象,名字叫做 NGUI Snapshot Point 30,30表示像素,可以改

然后將這個子對象拖到你喜歡縮放的位置就可以了,3D的也可以!

NGUI Snapshot Point 0.1 10 30

0.1near 10 far 30 大小

-----------------------------------

更簡單的方法:

創建一個子對象,添加組件 snapshot,這個組件有一個 update snapshot 按鈕,點它,他會自動更新snapshot,也會更新這個子對象的名字

注意,他的tag是editor only

運行時修改屬性值

運行時,可以動態修改 Inspector 中的值,可以立即見到變化,當退出運行時,值會恢復。

引用還是用標簽查找?

在A腳本中想實例化B對象。是將B類型做為A腳本的變量,暴露在 Inspector 中,將 B 對象拖過去;

還是在A腳本中通過標簽查找? O

Layer & Sorting Layer

Static Objects

什么是 Preset

Inspector可以鎖住,讓他固定顯示某個Object的信息

Inspector可以改為debug模式,他可以顯示private信息

Lightmapping: 靜態的光源,不是實時計算的

Performance Issues and Limitations with Non-Uniform Scaling

Tips for Working with Transforms

Importance of Scale

sprite renderer(2D) 和 mesh renderer(3D)

Adding Random Gameplay Elements

Default Values

On some importers it is possible to specify default values for the field references or similar. To specify a default value open the object selector on the field you wish to set a default value for and select an value from the object selector.

Once your texture has been imported, you should assign it to a Material. The material can then be applied to a mesh, Particle System, or GUI Texture. Using the Import Settings, it can also be converted to a Cubemap or Normalmap for different types of applications in the game.

 

Unity supports Resource Folders in the project to allow content to be supplied in the main game file yet not be loaded until requested. In Unity Pro, Unity iOS Advanced and Unity Android Advanced, you can also create Asset Bundles.

 

To build an Asset Bundle, you call BuildPipeline.BuildAssetBundle() from inside an Editor script. In the arguments, you specify an array of Objects to be included in the built file, along with some other options. This will build a file that you can later load dynamically in the runtime by usingAssetBundle.Load().

 

 resources.assets

  • Materials: renderer.material and renderer.sharedMaterial
  • Meshes: meshFilter.mesh and meshFilter.sharedMesh
  • Physic Materials: collider.material and collider.sharedMaterial

 

Special Folders and Script Compilation Order

腳本編譯順序:

腳本編譯一共分為4個階段,一個腳本何時被編譯取決於他所在的文件夾。

后面編譯的可以引用前面編譯的。

腳本編譯順序:

階段1、文件夾名為 Standard Assets, Pro Standard Assets and Plugins. 不管是不是頂層

階段2、文件夾名為 Standard Assets/Editor, Pro Standard Assets/Editor and Plugins/Editor. 不管是不是頂層

階段3、文件夾名不為 Editor,不管是不是頂層

階段4、其他地方的腳本

頂層文件夾 WebPlayerTemplates 將不被編譯,只有頂層才不被編譯

 

Execution Order of Event Functions

 

預編譯宏

Platform Dependent Compilation

Platform Custom Defines 預定義宏

File -> Building Settings -> Player Setting -> Other Settings -> Scripting Define Symbols

 

1 Mecanim {

    Generic

    Humanoid
}

2 Legacy (Unity 3.x)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM