2012年5月30日 星期三

用程式取得物件的貼圖大小需注意的地方

我希望能用貼圖的大小, 來決定場景的佈置, 攝影機的可視範圍 ... 等 在程式一起動時, 會先到 Resources 的資料夾, 將圖片 Load 進來, 使用下列語法 ... gameObject.Find("bg").renderer.material.mainTexture = Resources.Load("texture"); 

但 ... 當我用下列語法想取得圖片的大小時 ... var _width = gameObject.Find("bg").renderer.material.mainTexture.width; var _height = gameObject.Find("bg").renderer.material.mainTexture.height; 

得到的結果都 ... width , height 都是 1024

 是否是我方法使用錯誤, 或是我疏忽哪裡的設定了?


 原因很簡單,因為貼圖長寬必需為2的冪次方,因此當Unity載入貼圖時會自動將貼圖resize成最接近的2^n尺吋。 你的圖是1024x768,1024沒問題,但768的高度unity必需取決於要轉成1024或是512,最後unity的公式是轉為1024。 正常來說,uv貼圖都必需為2^n的正方型圖,但unity可以允許寬高不等,但還是都必需為2的冪次方尺寸,若不想讓unity自動縮圖減少失真,最好就是做貼圖時就直接做成2^n的正方型貼圖。 (有些引擎讀入非2^n正方型的貼圖連顯示都不能顯示,因為unity會自動幫使用者重設圖片所以才會讓人忘記這個原則) 若你今天圖不是要拿來做3d貼圖而是要拿來做GUI,必需將Texture Type設為GUI,如此一來就能保留原來的尺寸了。

2012年5月29日 星期二

使用 transform.LookAt 時, 需注意的地方

在使用 transform.LookAt (注視目標) 時, 


transform.LookAt(GameObject.transform.position);


由於預設會注視包含目標物的 x, y, z 軸座標, 
如果在 2D 場景下, 可能會發生物件翻轉的問題, 此時可以利用 


transform.rotation = Quaternion.Euler(0,transform.rotation.eulerAngles.y,0);

此方法只注視某一座標軸, 可確保物件正確的旋轉角度.

接下來可使用

transform.position = Vector3.MoveTowards(transform.position,  GameObject .transform.position, Time.deltaTime*0.5);

讓物件移動至目標物, Vector3.MoveTowards 也可以使用在, 點擊滑鼠左鍵, 讓物件移動到該位置上

2012年5月28日 星期一

使用 renderer.material.mainTexture = texture 應注意的問題

使用 renderer.material.mainTexture = texture 換圖,
在銷毀物件的時候還會殘留一個未知的物件(從Profiler看);
會讓程式執行一兩天後記憶體超過一倍,
以下為解決方法

在使用 renderer.material.mainTexture = texture; 來換texture的時候,
Unity會將這個GameObject的material在複製一個,
然後去改變這新製出來的Material的texture。
(不複製material的話,所有共用同一個material的Texture都會一併變更) 
所以,改material.mainTexture時,已多創建(複製)一個物件了。 
解法是在Destroy(gameObject)時,
順便也Destroy(renderer.material)就可以了~