我們主要使用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+>.
5:如何使用烘焙貼圖(多重紋理)?
答:不要使用Shell貼圖,直接将烘焙圖賦予貼圖的"自發光"通道之上.
6:怎麼屏蔽Webplayer右鍵菜單?
答:<param name="disableContextMenu" value="true" />
7:為什麼水面沒有實時反射效果?
答:隻有專業版才支援這種反射效果.
8:怎麼做錄影機漫遊動畫?
答:Max正常制作錄影機漫遊動畫,倒到Unity中後,将Unity的Camea拖拽到Max導出的錄影機Gameobject物體之上,作為其子物體即可.
9:如何自定義Webplayer載入Logo及進度條?
答:<param name="logoimage" value="Logo檔案名" />,<param name="progressbarimage" value="進度條名" />,<param name="progressframeimage" value="進度條外框名" />.
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 <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;
<a target="_blank">OC對象的動态和靜态構造差別</a>
Student.h:
Student.m:
main