我們主要使用3dsmax2010進行制作,輸出FBX的類型導入Unity3D中,。默認情況下,,3dsmax8可以和U3D軟件直接融合,自動轉換為FBX物體,。 注意事項如下: 1.面數(shù)控制 在MAX軟件中制作單一GameObject物體的面數(shù)不能超過65000個三角形,,即32500個多邊形Poly,如果超過這個數(shù)量的物體不會顯示出來,,這就需要我們合理分布多邊形和模型數(shù)量,。打開MAX場景,選擇File/Properties/SummaryInfo可以打開文件屬性記錄,。其中Faces可以看到每個物體的實際數(shù)量,,個體數(shù)量不能超過65000個Faces面。 2.建??刂?/span> Unity3D軟件支持Line渲染和編輯之后所產生的模型,。大部分模型都依靠Polygon進行制作。在模型表面可以承認多出四邊形的面,,但不渲染交錯的面,。默認情況下,U3D引擎是不承認雙面材質的,,除非使用植物材質球Nature類型,。所以在制作窗戶、護欄等物體,,如果想在兩面都能看到模型,,那需要制作出厚度,或者復制兩個面翻轉其中一個的Normal法線,。 3.文件的放置 模型可以繼承MAX的材質,,但是文件的設置要按照以下形式進行放在項目的Assets文件夾內,,新創(chuàng)建一個Object文件夾,。并在其中創(chuàng)建Materials和Texture文件夾(分別自動存放材質球和貼圖)。模型物體并列保存在Object文件夾內,。這個規(guī)律模式不要打亂,,否則會破壞整個系統(tǒng)邏輯,。 4.材質數(shù)量控制 如果一個物體給與一個材質球,那么Unity3D對于材質數(shù)量和貼圖數(shù)量沒有任何的限制,。如果一個物體給與多個材質球,,我們需要用Multi/SubObject來實現(xiàn),但是這種羅列的材質球的數(shù)量沒有嚴格的控制,,但盡量保持在10以內,,過多的數(shù)量會導致一些錯誤。如果不使用Multi/SubObject材質球,,也可以選擇一些面,,然后給與一個材質球。這樣系統(tǒng)會自動將其轉換成Multi/SubObject材質,。綜合而言Unity3D軟件對于材質的兼容還是很好的,。 5.物體的質感 Diffuse Diffuse Bumped Bumped Specular 這三種類型為常用類型,其中Bumped需要增加Normal法線貼圖來實現(xiàn)凹凸,。 Decal 這種材質為貼花材質,,即相當于Mask類型,可以再Decal(RGBA)貼與一個帶有Alpha通道的圖像,,形成和原圖像相疊加的效果,。 Diffuse Detail 這種材質可以創(chuàng)造出污跡和劃痕的效果,即相當于Blend混合材質,。 Reflective 其中各種類型可以創(chuàng)造出金屬反射效果,,需要增加Cubmap貼圖。 Transparent 其中各種類型可以創(chuàng)造出透明的效果,,需要增加具有Alpha的通道貼圖,。 注意:如果要做玻璃貼圖,,Alpha如果全是灰色或黑色(即要求全透明),那么Alpha就會失效,,如果要全透明,,材質Alpha其中必須至少有1像素為白色。 Nature 其中SoftOcclusion Leaves類型主要應用于片狀的樹葉材質,。 6.物體尺寸 默認情況下U3D系統(tǒng)單位1等于1米,,等于軟件1單位。如果我們制作是按照實際大小比例制作,,那么導入U3D引擎會自動變成原來的1%的大小,。因為默認情況下,U3D的FBXImporter中的Scale Factor的數(shù)值為0.01,。那個我們可以將ScaleFactor的數(shù)值恢復為1,,但是這樣會占用模型資源,比較消耗物理緩存,。我們也可以將這個物體從Hierarchy中選擇,,并使用Scale放大100倍,這種設置可以有很多好處,,并且還能通過用腳本制作動畫,。 7.關于復制 場景中的燈光布局,重復的模型物體都可以使用系統(tǒng)Prefab進行關聯(lián)復制,,這樣可以改變一個參數(shù)的同時將所有關聯(lián)物體屬性改變,。 8.山脈控制 在創(chuàng)建山脈之后,選擇Terrain/Set Resolution可以設置山脈的大小和屬性,。需要注意的是,,默認情況下TerrainWidth和Terrain Height為1000米。如果設置這個數(shù)值太小,,那么繪制草的時候會產生偏移,,因為草的尺寸必須減少到0.1的單位。也就是說,,山脈在處理0.1單位的時候會產生0.01的偏差,,如果模型太小,這種偏差是顯而易見的,,所以建議用戶不要讓模型過小,。 9.光暈控制 光暈又稱為Lens Flare即燈光光效??梢赃x擇一個GameObject物體給與Component/Rendering/LensFlare,,并在Flare中增加一個StandardAssets/Light Flares/50mm Zoom項目。這樣在運行之后就會產生光暈。但有時候如果光暈太遠太高卻看不到,。一種辦法是將光暈離近,,另一種辦法是將所有攝影機Camera的Far clip plane的數(shù)值增加。 10.攝影機控制 如果場景中有多架攝影機,,那么如何確定第一打開時間所顯示的攝影機,,就需要設置Camera屬性中的Depth數(shù)值,數(shù)值越大的攝影機越優(yōu)先顯示,。 posted @ 2013-08-02 20:49 蓬萊仙羽 閱讀(3) 評論(0) 編輯 1:天空盒有接縫怎么解決? posted @ 2013-08-02 20:46 蓬萊仙羽 閱讀(1) 評論(0) 編輯 strong關鍵字與retain關似,用了它,,引用計數(shù)自動+1,,用實例更能說明一切
@property (nonatomic, strong) NSString *string1; @property (nonatomic, strong) NSString *string2;
有這樣兩個屬性,
@synthesize string1; @synthesize string2;
猜一下下面代碼將輸出什么結果,?
self.string1 = @"String 1"; self.string2 = self.string1; self.string1 = nil; NSLog(@"String 2 = %@", self.string2);
結果是:String 2 = String 1
接著我們來看weak關鍵字: 如果這樣聲明兩個屬性:
@property (nonatomic, strong) NSString *string1; @property (nonatomic, weak) NSString *string2;
@synthesize string1; @synthesize string2;
self.string1 = @"String 1"; self.string2 = self.string1; self.string1 = nil; NSLog(@"String 2 = %@", self.string2);
分析一下,,由于self.string1與self.string2指向同一地址,且string2沒有retain內存地址,,而self.string1=nil釋放了內存,,所以string1為nil。聲明為weak的指針,,指針指向的地址一旦被釋放,,這些指針都將被賦值為nil。這樣的好處能有效的防止野指針,。在c/c++開發(fā)過程中,,為何大牛都說指針的空間釋放了后,都要將指針賦為NULL. 在這兒用weak關鍵字幫我們做了這一步,。 posted @ 2013-08-02 17:29 蓬萊仙羽 閱讀(3) 評論(0) 編輯 摘要: 最全的C語言試題總結第一部分:基本概念及其它問答題 1,、關鍵字static的作用是什么?這個簡單的問題很少有人能回答完全,。在C語言中,,關鍵字static有三個明顯的作用:1). 在函數(shù)體,一個被聲明為靜態(tài)的變量在這一函數(shù)被調用過程中維持其值不變,。2). 在模塊內(但在函數(shù)體外),,一個被聲明為靜態(tài)的變量可以被模塊內所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問,。它是一個本地的全局變量,。3). 在模塊內,,一個被聲明為靜態(tài)的函數(shù)只可被這一模塊內的其它函數(shù)調用。那就是,,這個函數(shù)被限制在聲明它的模塊的本地范圍內使用,。大多數(shù)應試者能正確回答第一部分,一部分能正確回答第二部分,,同是很少的人能懂得第三部分,。這是一個閱讀全文 posted @ 2013-07-30 13:15 蓬萊仙羽 閱讀(7) 評論(0) 編輯 //C++單例模式:指一個類只生成一個對象 #include <iostream> using namespace std;
class A{ public: static A* getA(); static A* a; int b = 0; void funAdd(){ b++; cout<<b<<"\n"; }; void funClear(){ b = 0; } };
A *A::a = NULL; A *A::getA() { if (a == NULL) { a = new A; } return a; }
int main(int argc, const char * argv[]) { for (int i=0; i<10; i++) { (A::getA())->funAdd(); if (i == 4) { (A::getA())->funClear(); } } return 0; } posted @ 2013-07-29 19:01 蓬萊仙羽 閱讀(4) 評論(0) 編輯 Student.h:
Student.m:
main
|
|