我希望能用貼圖的大小, 來決定場景的佈置, 攝影機的可視範圍 ... 等
在程式一起動時, 會先到 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月30日 星期三
2012年5月29日 星期二
使用 transform.LookAt 時, 需注意的地方
在使用 transform.LookAt (注視目標) 時,
transform.LookAt(GameObject.transform.position);
由於預設會注視包含目標物的 x, y, z 軸座標,
如果在 2D 場景下, 可能會發生物件翻轉的問題, 此時可以利用
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)就可以了~
在銷毀物件的時候還會殘留一個未知的物件(從Profiler看);
會讓程式執行一兩天後記憶體超過一倍,
以下為解決方法
在使用 renderer.material.mainTexture = texture; 來換texture的時候,
Unity會將這個GameObject的material在複製一個,
然後去改變這新製出來的Material的texture。
(不複製material的話,所有共用同一個material的Texture都會一併變更)
所以,改material.mainTexture時,已多創建(複製)一個物件了。
解法是在Destroy(gameObject)時,
順便也Destroy(renderer.material)就可以了~
訂閱:
文章 (Atom)