2016年12月13日 星期二

Unity_關於UGUI中的RectTransform元件



控制UGUI中的RectTransform元件
http://www.cnblogs.com/nsky/p/5045201.html

//更改RectTransformwidthheight
player1LifeObject.GetComponent<RectTransform>().sizeDelta = new Vector2(player1Life, 30);

//參數依序代表RightTop
battleObject.GetComponent<RectTransform>().offsetMax = newVector2(GetComponent<RectTransform>().offsetMax.x, 1);

//參數依序代表LeftBotton
battleObject.GetComponent<RectTransform>().offsetMin = new Vector2(GetComponent<RectTransform>().offsetMin.x, 0);

另一種UGUI更有效的佈局方式,適應各種解析度(實用):
參考: https://segmentfault.com/a/1190000002422377

概念:
運用Rect Transform這個專為UI準備的屬性,中間有四個錨點(Anchors),當父曾級大小改變時,父層級距離四個錨點的距離不會改變

可以運用Anchors的對齊功能,來快速設定須要對齊父類別的哪個位置(這樣就可以適應各種大小的螢幕)

所以我們可以讓各個物件對齊父類別的邊界(要是父類別不是會自動縮放的Canvas,記得要先將父類的Anchors打開)

Unity_Canvas(畫布)



UnityUGUI元件(不是2D3DObject)都要建立在Canvas下面才會顯示出畫面,好處是可以控制Canvas下的物件有統一的解析度

隨著Camera縮放:
很好用的功能,會隨著Camera放大縮小,不會有物件變型的問題
Cavans > Render Mode . Screen Space - Camera > 接著在Render Camera指定要對照的Camera
Game顯示中顯示改成固定的(1024x768),可以得到等比例的效果

運用模式是主從式的關係,放在下面的節點也會蓋在上面的節點之上
這幾個屬性可以讓UI調至適合手機的解析度

Ui Scaler Mode :
  Constant Pixel Size      - 
使UI元件保留相同的大小(以像素为单位)無論屏幕大小。
  Scale With Screen Size - 
使UI元件自動調整屏幕。

  Screen Math Mode 
    Mathc Width Or Height  依寬度or高度
    Reference Resolution X Y  寬高大小
    Mathc Width Or Height 靠著高或靠著寬來調式大小


做法是調整成對應高(Mathc Width Or Height)來調整畫面大小,再調整成適合手機型號的分辨率
https://jerrard-liu.blogspot.tw/2015/05/canvas1.html

參考:
完整
http://k79k06k02k.com/blog/24/unity/unity-ugui-%E5%8E%9F%E7%90%86%E7%AF%87%E4%BA%8C%EF%BC%9Acanvas-scaler-%E7%B8%AE%E6%94%BE%E6%A0%B8%E5%BF%83

Unity_Prefab的介紹



Prefab

一個可重複建立的物件,可以事先將內容都制訂好,當需要的時機在clone出來使用

1.程式只能抓放在Resources資料夾中的內容(沒有就自行建立)
(建立出來的座標和旋轉角度皆為0)

2.要是到時候要指定Prefab物件的名稱,記的後面要加上(Clone)

具現化(Instantiate)Prefab
//1.物件名稱 2.建立時的座標(x,y,z) 3.建立時的角度(Quaternion.identity代表同一性)
// Quaternion.Euler(0,0,90)設定傾斜角度
Instantiate(Resources.Load("Cube Test"), new Vector3(3, 1, (float)-4.5), Quaternion.identity);


摧毀(Destroy)Prefab
GameObject  go= (GameObject)Instantiate();
Destroy(go);
Destroy(go,1.5f);  //1.5秒後銷毀

具現化後給予指定某些變數值
GameObject obj = (GameObject)Instantiate(Resources.Load("HeroPrefab"), new Vector3(transform.position.x , transform.position.y - 2f, transform.position.z), Quaternion.Euler(0, 0, 180));

//指定此物件中HeroShoot腳本的setDir方法
obj.GetComponent<HeroShoot>().setDir(DIR.DOWN);

具現化後指定父層級(例如ui放在canvas之下)
giftPrefab = (GameObject)Instantiate(Resources.Load("UISystem/Gift/GiftUI"), Vector3.zero, Quaternion.identity);
//指定父層級是誰          
 giftPrefab.transform.SetParent (GameObject.FindObjectOfType<Canvas>().transform);
//避免物件大小出問題,固定設成1         
giftPrefab.transform.localScale = Vector3.one;

呼叫PrefabScript的方法
//呼叫GiftTabPrefab這個ScriptsetGiftTabSource方法
giftTabPrefab[i].GetComponent<GiftTabPrefab>().setGiftTabSource(giftTabSource[i]); 
      
想從Prefab物件中控制Scenes上的非Prefab物件
在生成PrefabScript中就將GameObject指定進去,來讓各個動態生成的Prefab各自使用

Prefab中加入Script
        //建立一個物件,掛上自己這個Script,並且指定物件
        GameObject o = new GameObject();
        Recycler recycler = o.AddComponent<Recycler>();
        recycler.prefab = prefab;
        recycler.startSize = startSize;
        recycler.targetSize = targetSize;

在自己的物件上加入Script
gameObject.AddComponent<PlayerJoystick>();

Prefab放上Scenes修改後想儲存
按控制欄右上角的Apply就可以直接儲存