您好,登錄后才能下訂單哦!
我們主要使用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數值,數值越大的攝影機越優先顯示。
1:天空盒有接縫怎么解決?
答:在貼圖導入設置里設置Wrap Mode為"Clamp".
2:DDS格式怎么不顯示?
答:Unity不支持DDS格式,Unity會將除DDS外的其他格式圖片具有為DDS同樣的優化.
3:Unity如何動態載入外部模型等文件?
答:可以使用AssetBundle:http://unity3d.com/support/docum ... ce/AssetBundle.html
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即可.
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, 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);
結果是:String 2 = null
分析一下,由于self.string1與self.string2指向同一地址,且string2沒有retain內存地址,而self.string1=nil釋放了內存,所以string1為nil。聲明為weak的指針,指針指向的地址一旦被釋放,這些指針都將被賦值為nil。這樣的好處能有效的防止野指針。在c/c++開發過程中,為何大牛都說指針的空間釋放了后,都要將指針賦為NULL. 在這兒用weak關鍵字幫我們做了這一步。
//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;
}
Student.h:
#import <Foundation/Foundation.h> @interface Student : NSObject @property(nonatomic,retain) NSString * name; @property(nonatomic,assign) int age; @end
Student.m:
#import "Student.h" @implementation Student //動態方法,在main函數中類alloc了之后調用,但是要手動管理內存,要手動釋放 -(id) initWithAge:(int)age{ if (self == [super init]) { _age = age; } return self; } //靜態構造方法,在main函數中不需要你手動管理內存釋放 +(id)studentWithAge:(int)age{ Student *stu = [[[Student alloc] init] autorelease];\ stu.age = age; return stu; } -(NSString *)description{ return [NSString stringWithFormat:@"name:%@ age:%i創建了",_name,_age]; } -(void)dealloc{ NSLog(@"name:%@ age:%i被釋放了",_name,_age); [_name release]; [super dealloc]; } @end
main
1 #import <Foundation/Foundation.h> 2 3 #import "Student.h" 4 5 int main(int argc, const char * argv[]) 6 7 { 8 9 @autoreleasepool { 10 11 //動態方法需要手動釋放內存 12 13 Student *stu1= [[Student alloc] initWithAge:10]; 14 15 stu1.name = @"dingxiaowei"; 16 17 NSLog(@"%@",stu1); 18 19 [stu1 release]; 20 21 //靜態構造方法不需要你管理內存 22 23 Student *stu2 =[Student studentWithAge:20]; 24 25 stu2.name = @"wangning"; 26 27 NSLog(@"%@",stu2); 28 29 } 30 31 return 0; 32 33 }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。