天天看點

Unity3D項目開發一點經驗

我們主要使用3dsmax2010進行制作,輸出FBX的類型導入Unity3D中。預設情況下,3dsmax8可以和U3D軟體直接融合,自動轉換為FBX物體。

注意事項如下:

1.面數控制

      在MAX軟體中制作單一GameObject物體的面數不能超過65000個三角形,即32500個多邊形Poly,如果超過這個數量的物體不會顯示出來,這就需要我們合理分布多邊形和模型數量。打開MAX場景,選擇File/Properties/SummaryInfo可以打開檔案屬性記錄。其中Faces可以看到每個物體的實際數量,個體數量不能超過65000個Faces面。

2.模組化控制

      Unity3D軟體支援Line渲染和編輯之後所産生的模型。大部分模型都依靠Polygon進行制作。在模型表面可以承認多出四邊形的面,但不渲染交錯的面。預設情況下,U3D引擎是不承認雙面材質的,除非使用植物材質球Nature類型。是以在制作窗戶、護欄等物體,如果想在兩面都能看到模型,那需要制作出厚度,或者複制兩個面翻轉其中一個的Normal法線。

3.檔案的放置

      模型可以繼承MAX的材質,但是檔案的設定要按照以下形式進行放在項目的Assets檔案夾内,新建立一個Object檔案夾。并在其中建立Materials和Texture檔案夾(分别自動存放材質球和貼圖)。模型物體并列儲存在Object檔案夾内。這個規律模式不要打亂,否則會破壞整個系統邏輯。

4.材質數量控制

      如果一個物體給與一個材質球,那麼Unity3D對于材質數量和貼圖數量沒有任何的限制。如果一個物體給與多個材質球,我們需要用Multi/SubObject來實作,但是這種羅列的材質球的數量沒有嚴格的控制,但盡量保持在10以内,過多的數量會導緻一些錯誤。如果不使用Multi/SubObject材質球,也可以選擇一些面,然後給與一個材質球。這樣系統會自動将其轉換成Multi/SubObject材質。綜合而言Unity3D軟體對于材質的相容還是很好的。

5.物體的質感

Diffuse       Diffuse Bumped        Bumped Specular

這三種類型為常用類型,其中Bumped需要增加Normal法線貼圖來實作凹凸。

Decal

這種材質為貼花材質,即相當于Mask類型,可以再Decal(RGBA)貼與一個帶有Alpha通道的圖像,形成和原圖像相疊加的效果。

Diffuse Detail

這種材質可以創造出污迹和劃痕的效果,即相當于Blend混合材質。

Reflective

其中各種類型可以創造出金屬反射效果,需要增加Cubmap貼圖。

Transparent

其中各種類型可以創造出透明的效果,需要增加具有Alpha的通道貼圖。

注意:如果要做玻璃貼圖,Alpha如果全是灰色或黑色(即要求全透明),那麼Alpha就會失效,如果要全透明,材質Alpha其中必須至少有1像素為白色。

Nature

其中SoftOcclusion Leaves類型主要應用于片狀的樹葉材質。

6.物體尺寸

      預設情況下U3D系統機關1等于1米,等于軟體1機關。如果我們制作是按照實際大小比例制作,那麼導入U3D引擎會自動變成原來的1%的大小。因為預設情況下,U3D的FBXImporter中的Scale Factor的數值為0.01。那個我們可以将ScaleFactor的數值恢複為1,但是這樣會占用模型資源,比較消耗實體緩存。我們也可以将這個物體從Hierarchy中選擇,并使用Scale放大100倍,這種設定可以有很多好處,并且還能通過用腳本制作動畫。

7.關于複制

      場景中的燈光布局,重複的模型物體都可以使用系統Prefab進行關聯複制,這樣可以改變一個參數的同時将所有關聯物體屬性改變。

8.山脈控制

       在建立山脈之後,選擇Terrain/Set Resolution可以設定山脈的大小和屬性。需要注意的是,預設情況下TerrainWidth和Terrain Height為1000米。如果設定這個數值太小,那麼繪制草的時候會産生偏移,因為草的尺寸必須減少到0.1的機關。也就是說,山脈在處理0.1機關的時候會産生0.01的偏差,如果模型太小,這種偏差是顯而易見的,是以建議使用者不要讓模型過小。

9.光暈控制

       光暈又稱為Lens Flare即燈光光效。可以選擇一個GameObject物體給與Component/Rendering/LensFlare,并在Flare中增加一個StandardAssets/Light Flares/50mm Zoom項目。這樣在運作之後就會産生光暈。但有時候如果光暈太遠太高卻看不到。一種辦法是将光暈離近,另一種辦法是将所有攝影機Camera的Far clip plane的數值增加。

10.攝影機控制

       如果場景中有多架攝影機,那麼如何确定第一打開時間所顯示的攝影機,就需要設定Camera屬性中的Depth數值,數值越大的攝影機越優先顯示。

<a target="_blank">Unity3D使用過程中常見的20個問題</a>

1:天空盒有接縫怎麼解決?

答:在貼圖導入設定裡設定Wrap Mode為"Clamp".

2:DDS格式怎麼不顯示?

答:Unity不支援DDS格式,Unity會将除DDS外的其他格式圖檔具有為DDS同樣的優化.

3:Unity如何動态載入外部模型等檔案?

4:腳本編輯器有文法提示嗎?

答:有的,Win版使用Ctrl+I,Mac版使用Ctrl+&gt;.

5:如何使用烘焙貼圖(多重紋理)?

答:不要使用Shell貼圖,直接将烘焙圖賦予貼圖的"自發光"通道之上.

6:怎麼屏蔽Webplayer右鍵菜單?

答:&lt;param name="disableContextMenu" value="true" /&gt;

7:為什麼水面沒有實時反射效果?

答:隻有專業版才支援這種反射效果.

8:怎麼做錄影機漫遊動畫?

答:Max正常制作錄影機漫遊動畫,倒到Unity中後,将Unity的Camea拖拽到Max導出的錄影機Gameobject物體之上,作為其子物體即可.

9:如何自定義Webplayer載入Logo及進度條?

答:&lt;param name="logoimage" value="Logo檔案名" /&gt;,&lt;param name="progressbarimage" value="進度條名"  /&gt;,&lt;param name="progressframeimage" value="進度條外框名" /&gt;.

10:GUI上怎麼使用中文字?

答:導入任意中文字型,然後定義GUISkin字型為該字型即可.

11:購買一個授權可以安裝幾台電腦?

答:可以安裝于2個系統之上比如一個Win版一個Mac版.

12:Max檔案扔到Unity中怎麼說導入失敗?

答:下載下傳最新版Fbx插件,用Max導出Fbx檔案然後扔Unity中.

13:如何不讓攝像頭穿透模型,離模型近了就像模型露面了?

答:設定相機的Near clip plane,調小一點,但是不要給負數.

14:怎麼用雙面貼圖?

答:Unity中可設定雙面Shader,最簡單有效的辦法是直接做成雙面的實體模型.

15:導入的Fbx模型尺寸小于Max中的尺寸?

答:在Unity中該檔案的導入設定中設定縮放因子為1.

16:如何給相機添加Glow效果?

答:選中相機對象,在菜單中選中Component-Image Effects-Glow賦予該元件即可(專業版才支援此特效)

17:怎麼設定Webplayer預設尺寸?

答:到菜單Edit-Project Settings-Player中設定Default Web Screen尺寸即可.

18:怎麼設定可執行檔案的啟動Banner?

答:到菜單Edit-Project Settings-Player中設定Resolution Dialog Banner.

19:如何設定霧效?

答:到菜單Edit-Render Settings中開啟Fog及設定Fog Color等即可.

20:如何設定預設Skybox天空盒?

答:到菜單Edit-Render Settings中設定Skybox Material即可.

<a target="_blank">@property中strong跟weak的差別</a>

strong關鍵字與retain關似,用了它,引用計數自動+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

由于string2是strong定義的屬性,是以引用計數+1,使得它們所指向的值都是@"String 1", 如果你對retain熟悉的話,這了解并不難。

接着我們來看weak關鍵字:

如果這樣聲明兩個屬性:

@property (nonatomic, weak) NSString *string2;  

并定義 

@synthesize string1;   

再來猜一下,下面輸出是什麼?

 self.string1 = @"String 1";   

結果是:String 2 = null

分析一下,由于self.string1與self.string2指向同一位址,且string2沒有retain記憶體位址,而self.string1=nil釋放了記憶體,是以string1為nil。聲明為weak的指針,指針指向的位址一旦被釋放,這些指針都将被指派為nil。這樣的好處能有效的防止野指針。在c/c++開發過程中,為何大牛都說指針的空間釋放了後,都要将指針賦為NULL. 在這兒用weak關鍵字幫我們做了這一步。

<a target="_blank">C語言面試</a>

<a target="_blank">C++中單例模式</a>

//C++單例模式:指一個類隻生成一個對象

#include &lt;iostream&gt;

using namespace std;

class A{

public:

    static A* getA();

    static A* a;

    int b = 0;

    void funAdd(){

        b++;

        cout&lt;&lt;b&lt;&lt;"\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&lt;10; i++) {

        (A::getA())-&gt;funAdd();

        if (i == 4) {

            (A::getA())-&gt;funClear();

        }

    return 0;

<a target="_blank">OC對象的動态和靜态構造差別</a>

Student.h:

Student.m:

  

main

繼續閱讀