




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
Unity3D腳本中文參考(1)這是一個關于Unity內(nèi)部腳本如何工作的簡單概覽。Unity內(nèi)部的腳本,是通過附加自定義腳本對象到游戲物體組成。在腳本對象內(nèi)部不同的函數(shù)被特定的事件調(diào)用。最常用的列在下面:Update:這個函數(shù)在渲染一幀之前被調(diào)用。這里是大部分游戲行為代碼被執(zhí)行的地方,除了物理代碼。FixedUpdate這個函數(shù)在每個物理時間同步被調(diào)用一次。這是處理基于物理游戲行為的地方。在任何函數(shù)之外的代碼:在任何函數(shù)之外的代碼在物體被加載的時候運行。這個可以用來初始化腳本狀態(tài)。注意:文檔的這個部分假設你是用JS,參考用C#編寫腳本獲取如何使用C#和Boo編寫腳本的信息。你也能定義事件句柄。它們的名稱都以On開始,(例如OnCollisionEnter)。為了查看完整的預定義事件的列表,參考MonoBehaviour文檔。
概覽:常用操作大多數(shù)游戲物體的操作是通過游戲物體的Transform和/或Rigidbody來做的。在行為腳本內(nèi)部它們可以分別通過transform和rigidbody訪問。因此如果你想繞著Y軸每幀旋轉5度,你可以如下寫:functionUpdate(){
transform.Rotate(0,5,0);}如果你想向前移動一個物體,你應該如下寫:functionUpdate(){
transform.Transtate(0,0,2);}
概覽:跟蹤時間Time類包含一個非常重要的類變量,稱為deltaTime。這個變量包含從上一次調(diào)用Update或FixedUpdate(根據(jù)你是在Update函數(shù)還是在FixedUpdate函數(shù)中)到現(xiàn)在的時間量。所以對于上面的例子,修改它使這個物體以一個恒定的速度旋轉而不依賴于幀率:
functionUpdate(){
transform.Rotate(0,5*Time.deltaTime,0)}
移動物體:
functionUpdate(){
transform.Translate(0,0,2*Time.deltaTime);}如果你加或減一個每幀改變的值,你應該將它與Time.deltaTime相乘。當你乘以Time.deltaTime時,你實際表達:我想以10米/秒移動這個物體而不是10米/幀。這不僅僅是因為你的游戲將獨立于幀率運行,同時也是因為運動的單位容易理解。(10米/秒)另一個例子,如果你想隨著時間增加光照的范圍。下面的表達式,以2單位/秒改變半徑。functionUpdate(){
light.range*=2.0*Time.delta.Time;}
當通過力處理剛體的時候,你通常下不必用Time.deltaTime乘,因為引擎已經(jīng)為你考慮到了這點。
概覽:訪問其他組件組件被附加到游戲物體。附加Renderer到游戲物體使它在場景中渲染,附加一個Camera使它變?yōu)橄鄼C物體。所有的腳本都是組件,因為它們能被附加到游戲物體。最常用的組件可以作為簡單成員變量訪問:
Component
可如下訪問Transform
transformRigidbody
rigidbodyRenderer
rendererCamera
camera(onlyoncameraobjects)Animation
animationCollider
collider……等等。對于完整的預定義成員變量的列表,查看Component,Behaviour和MonoBehaviour類文檔。如果游戲物體沒有你想去同類型的組件,上面的變量將被設置為null。任何附加到一個游戲物體的組件或腳本都可以通過GetComponent訪問。
transform.Translate(0,1,0);//等同于GetComponent(Transform).Translate(0,1,0);注意transform和Transform之間大小寫的區(qū)別。前者是變量(小寫),后者是類或者腳本名稱(大寫)。大小寫不同使你能夠從類和腳本名中區(qū)分變量。應用我們所學,你可以使用GetComponent找到任何附加在同一游戲物體上的腳本和組件。請注意要使下面的例子能夠工作,你需要有一個名為OtherScript的腳本,其中包含一個DoSomething函數(shù)。OtherScript腳本必須與下面的腳本附加到相同的游戲物體上。
//這個在同一個游戲物體上找到名為OtherScript的腳本
//并調(diào)用它上面的DoSomething.
functionUpdata(){otherScript=GetComponent(OtherScript);otherScript.DoSomething();}
概覽:訪問其他游戲物體大多數(shù)高級的代碼不僅需要操作一個物體。Unity腳本接口有各種方法來找到并訪問其他游戲物體和組件。在下圖,我們假定有一個名為OtherScript.js的腳本附加到場景的游戲物體上。varfoo=5;functionDoSomething(param:String){
print(param+”withfoo:”+foo);}1.
通過檢視面板賦值引用。你可以通過檢視面板賦值變量到任何物體。//變量拖動到target槽的物體vartarget:Transform;functionUpdate(){
target.Translate(0,1,0);}你也可以在檢視面板中公開到其他物體的引用。下面你可以一個包含OtherScript的游戲物體到檢視面板中的target槽。//設置在檢視面板中賦值的target變量上的foo,調(diào)用DoSomething.vartarget:OtherScript;functionUpdate(){
//設置target物體的foo變量
target.foo=2;
//調(diào)用target上的DoSomething
target.DoSomething(“Hello”);}2.
通過物體層定位。對于一個已存在的物體,可以通過游戲物體的Transform組件來找到子和父物體://找到腳本所附加的//游戲物體的子“Hand”transform.Find(“Hand”).Translate(0,1,0);一旦在層次視圖中找到這個變換,你可以使用GetComponent來獲取其他腳本,//找到名為“Hand”的子。//調(diào)用附加到它上面的OtherScript腳本的DoSomething.transform.Form(“Hand”).GetComponent(OtherScript)DoSomething(“Hello”);
//找到名為”Hand”的子//然后應用一個力到附加在hand上的剛體transform.Find(“Hand”).rigidbody.AddForce(0,10,0);你可以循環(huán)所有的子。//變換的所有子向上移動10個單位for(varchild:Transformintransform){
child.Transform(0,1,0);}參考Transform類文檔獲取更多的信息3.
根據(jù)名稱或標簽定位你可以使用GameObject.FindWithTag和GameObject.FindGameObjectWithTag搜索具有特定標簽的游戲物體。使用GameObject.Find根據(jù)名稱查找物體。
functionStart()
{
//按照名稱
vargo=GameObject.Find(“SomeGuy”);
go.transform.Translate(0,1,0);
//按照標簽
varplayer=GameObject.FindWithTag(“Player”);
player.transform.Transform(0,1,0);}
你可以在結果上使用GetComponent,在找到的游戲物體上得到任何腳本或組件。
functionStart(){
//按名稱
vargo=GameObject.Find(“SomeGuy”);
go.GetComponent(OtherScript).DoSomething();
//按標簽
varplayer=GameObject.FindWithTag(“Player”);
player.GetComponent(OtherScript).DoSomething();}
一些特殊的物體有快捷方式,如主相機使用Camera.main。4.
作為參數(shù)傳遞一些事件消息在事件中包含詳細信息。例如,觸發(fā)事件傳遞碰撞物體的Collider組件到處理函數(shù)。OntriggerStay給我們一個碰撞器的引用。從這個碰撞器我們可以獲取附加到其上的剛體。functionOnTriggerStay(other:Collider){
//如果另一個碰撞器也有一個剛體
//應用一個力到它上面
if(other.rigidbody){
other.rigidbody.AddForee(0,2,0);
}}
或者我們通過碰撞器獲取附加在同一物體上的任何組件。functionOnTriggerStay(other:Collider){
//如果另一個碰撞器附加了OtherScript
//調(diào)用它上面的DoSomething
//大多數(shù)時候碰撞器不會附加腳本
//所以我們需要首先檢查以避免null引用異常
if(other.GerComponent(OtherScript)){
other.GetComponent(OtherScript).DoSomething();}}
注意通過上述例子中的other變量,你可以訪問碰撞物體中的任何組件。5一種類型的所有腳本
使用Object.FindObjectsOfType找到所有具有相同類或腳本名稱的物體,或者使用Object.FindObjectOfType找到這個類型的第一個物體。
functionStart()
{//找到場景中附加了OtherScript的任意一個游戲物體varother:OtherScipt=FindObjectOfType(OtherScript);other.DoSomething();}
來源:/blog/static/796146982010611112655758/概覽:向量
Unity使用Vector3類統(tǒng)一表示全體3D向量。3D向量的不同組件可以通過x,y和z成員變量訪問。varaPosition:Vector3;aPosition.x=1;aPosition.y=1;aPosition.z=1;
你也可能夠使用Vector3構造函數(shù)來同時初始化所有組件varaPosition=Vector3(1,1,1);
Vector3也定義了一些常用的常量值。vardirection=Vector3.up;//與Vector3(0,1,0);相同
單個向量上的操作可以使用下面方式訪問:someVector.Normalize();
使用多個向量的操作可以使用Vector3類函數(shù):theDistance=Vector3.Distance(oneVector,otherVector);
(注意你必須在函數(shù)名之前寫Vector3.來告訴JS在哪里找到這個函數(shù),這適用于所有類函數(shù)。)
你也可以使用普通數(shù)學操作來操縱向量。combined=vector1+vector2;
查看Vector3類文檔獲取完整操作和可用屬性的列表。
概覽:成員變量&全局變量
定義在任何函數(shù)之外的變量是一個成員變量。在Unity中這個變量可以通過檢視面板來訪問。任何保存在成員變量中的值也可以自動隨工程保存。
varmemberVariable=0.0;上面的變量將在檢視面板中顯示名為”MemberVariable”的數(shù)值屬性。如果你設置變量的類型為一個組件類型(例如Transform,Rigidbody,Collider,任何腳本名稱,等等)。然后你可以在檢視面板中通過拖動一個游戲物體來設置它們。
varenemy:Transform;
functionUpdate()
{
if(Vector3.Distance(enemy.position,transform.position)<10){
print(“Isensetheenemyisnear”);}}
你也可以創(chuàng)建私有成員變量。私有成員變量可以用來儲存那些在該腳本之外不可見的狀態(tài)。私有成員變量不會被保存到磁盤并且在檢視面板中不能編輯。當它被設置為調(diào)試模式時,它們在檢視面板中可見。這允許你像一個實時更新的調(diào)試器一樣使用私有變量。privatevarlastCollider:Collider;
functionOnColliderEnter(collisionInfo:Collision){
lastCollider=collisionInfo.other;}全局變量你也可以使用static關鍵字創(chuàng)建全局變量。著創(chuàng)造了一個全局變量,名為someGlobal。
//TheScriptName.js中的一個靜態(tài)變量
staticvarsomeGlobal=5;
//你也可以在腳本內(nèi)部像普通變量一樣訪問它
print(someGlobal);
someGlobal=1;為了從另一個腳本訪問它,你需要使用這個腳本的名稱上加上一個點和全局變量名。
print(TheScriptName.someGlobal);
TheScriptName.someGlobal=10;
來源:/blog/static/7961469820107934114974/Unity3d引用GUIQQ似展開像QQ一樣,你放上面你鼠標放上去它會向下展開.
varshow=false;
vargrow=false;
varmin=0.0;
varmax=50.0;
varheight=0.0;
varspeed=0.0;
//varskin:GUISkin;
functionOnGUI()
{
//GUI.skin=skin;
if(GUI.Button(Rect(5,5,104,25),"List"))
{
grow=true;
if(!show)
show=true;
}
if(show)
{
GUILayout.BeginArea(Rect(7,30,100,height),"","Box");
GUILayout.BeginVertical();
for(i=0;i<8;i++)
GUILayout.Button(i+".Title");
GUILayout.EndVertical();
GUILayout.EndArea();
}
if(grow)
{
speed+=Time.deltaTime*5.0;
height=Mathf.Lerp(min,max,speed);
if(Mathf.Approximately(height,max))
{
grow=false;
max=min;
min=height;
speed=0.0;
if(min==0)
show=false;
}
}
}Unity3d給物體添加力\o"Unity3D"Unity3D
2010-08-2617:08:43
閱讀62
評論0
字號:大中小
訂閱
第一種:
this.gameObject.rigidbody.AddForce(0,0,5);
加力的方向和力度
第二種:
this.gameObject.rigidbody.AddForceAtPosition(ts.position-this.transform.position,transform.position,ForceMode.Impulse);
(力的目標,本身,力的類型)引用U3D屏幕截圖\o"Unity3D"Unity3D
2010-08-2317:06:12
閱讀58
評論0
字號:大中小
訂閱本文引用自博者《U3D屏幕截圖》
引用博者
的
U3D屏幕截圖
functionScreenshotEncode()
{
//waitforgraphicstorender
yieldWaitForEndOfFrame();
//createatexturetopasstoencoding
vartexture:Texture2D=newTexture2D(Screen.width,Screen.height,TextureFormat.RGB24,false);
//putbufferintotexture
texture.ReadPixels(Rect(0.0,0.0,Screen.width,Screen.height),0.0,0.0);
texture.Apply();
//splittheprocessup--ReadPixels()andtheGetPixels()callinsideoftheencoderarebothprettyheavy
yield;
//createourencoderforthistexture
varencoder:JPGEncoder=newJPGEncoder(texture,75.0);
//encoderisthreaded;waitforittofinish
while(!encoder.isDone)
yield;
//saveourtestimage(couldalsouploadtoWWW)
File.WriteAllBytes(Application.dataPath+"/../testscreen-"+count+".jpg",encoder.GetBytes());
count++;
}
//簡便方法看下面:
functionOnMouseDown(){
Application.CaptureScreenshot("Screenshot.png");
}Unity3d射線(獲得鼠標點擊的坐標[x,y,z])\o"Unity3D"Unity3D
2010-08-1911:49:40
閱讀134
評論0
字號:大中小
訂閱usingUnityEngine;
usingSystem.Collections;
publicclassLu:MonoBehaviour
{
publicCameracam;
//Weneedtoactuallyhitanobject
RaycastHithitt=newRaycastHit();
//Usethisforinitialization
voidStart()
{
}
//Updateiscalledonceperframe
voidUpdate()
{
Rayray=cam.ScreenPointToRay(Input.mousePosition);
Physics.Raycast(ray,outhitt,100);
//
Debug.DrawLine(cam.transform.position,ray.direction,Color.red);
if(null!=hitt.transform)
{
print(hitt.point);//鼠標點擊的坐標
}
}
}Unity3d用代碼腳本建造一堵Cube墻\o"Unity3D"Unity3D
2010-08-1710:26:59
閱讀142
評論0
字號:大中小
訂閱C#版:
//Usethisforinitialization
voidStart()
{
for(inty=0;y<5;y++)
{
for(intx=0;x<5;x++)
{
GameObjectcube=GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.AddComponent<Rigidbody>();
cube.transform.position=newVector3(x,y,0);
}
}
}
JS版:
functionStart(){
for(vary=0;y<5;y++){
for(varx=0;x<5;x++){
varcube=GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.AddComponent(Rigidbody);
cube.transform.position=Vector3(x,y,0);
}
}
}Unity3d里RenderTexture在屏幕中做小屏幕用\o"Unity3D"Unity3D
2010-08-1613:39:06
閱讀181
評論2
字號:大中小
訂閱先做準備工作,我們要用到RenderTexture.先創(chuàng)建一張rendertexture圖片。
這時候這張照片是空的,因為我們沒指定攝像機。在頂視圖創(chuàng)建一個相機,調(diào)整好位置。在targettexture選項里,選擇剛才創(chuàng)建的rendertexture。
這時候rendertexture里面就有畫面了。如圖
接下來我們就要讓它顯示出來。代碼如下:
varpic:RenderTexture;
functionOnGUI
(){
GUI.Box(Rect(0,Screen.height-100,100,100),pic);
}
Unity3d里有關時間延遲\o"Unity3D"Unity3D
2010-08-1116:11:42
閱讀65
評論0
字號:大中小
訂閱IEnumeratorWaitAndPrint(floatwaitTime)
{
//pauseexecutionforwaitTimeseconds
yieldreturnnewWaitForSeconds(waitTime);
print("")
}
在其它方法里調(diào)用:
StartCoroutine(WaitAndPrint(3.0F));
好像在Update里不好用。沒試。
暫停Time.timeScale=0;
FixedUpdate功能將不會被調(diào)用時,時間刻度設置為零。untiy3d(運行性能)的美工方面需要知道的知識(二)\o"Unity3D"Unity3D
2010-08-1114:48:39
閱讀90
評論0
字號:大中小
訂閱總體來說:合并,合并,合并!如果你比較關心游戲的速度,請合并模型。最好能夠把合并的模型使用同樣的材質和貼圖(材質也要合)。RenderingStatistics窗口時很有用的!現(xiàn)在的圖形顯卡可以很好的支持很多的多邊形,但是他們他們還是有一些瓶頸的。所以如果你有一個有100個三角形的MESH,它渲染起來所需要花費的運算跟1500個面數(shù)的物體是沒有多大差別的。因此最佳的渲染設置時每個模型大約1500-4000個三角面。只有在游戲組件中的屬性欄中勾選MeshRenderer選項顯卡才會渲染相應的模型,并且在場景中的空的GameObject組件是不會被渲染的。
所以再次重復,最好的導入渲染設置時合并Objects直到他們每個模型在1500個三角面面甚至更高一些,并且為整個模型使用一個材質。如果只是把兩個模型合并在一起但是不共同使用同一個材質并不會給你的圖形帶來一點優(yōu)化。如果你想有效的合并物體,你需要保證你合并后的模型使用一個材質。(其實就是盡量減少材質球的數(shù)量)在你合并物體的時候需要知道一件事:如果你在你的場景中用到了很多小的燈光,你可以把場景中離得很近的物體合并為一個Object。按照上面的思路,如果一個MESH具有多個材質球,那就說明在計算機渲染的時候是要進行多重運算的。最普遍的你之所以一個MESH用多個材質的原因是因為兩個材質不能使用相同的貼圖。所以如果你想要優(yōu)化渲染設置,你最好確定你合并的那些MESH的材質是相同的。
Unity對于向顯卡導出各種多邊形是很擅長的,它可以很詳盡的把所有的圖形導入到顯卡,并且優(yōu)化數(shù)據(jù)。你需要做的只是確定你的圖形顯示卡正常工作。而不是要調(diào)整很多手動調(diào)節(jié)的設置。
Thenumberof
PixelLights
affectinganobjectheavilyaffectsperformance.
相當數(shù)量的實時燈光對于游戲速度也是有限制的。如果你想要有一個不錯的展示,并且不關心凹凸貼圖和實施燈光(BumpmappingorPixelLighting),可以去Edit->RenderSettings...然后設置PixelLightCoun為0.這將會給所有的Object使用頂點燈光。這將會讓所有的物件在每一幀都會被渲染一次。這是一個比較極端的LOD設置,所以你的游戲就可以再比較老的圖形顯卡下運行了。Pixellights
像素燈光如果你使用的是像素燈光,那么每個被這個燈光照射到的GameObject都會在每一幀被渲染一次。如果你合并了兩個距離很遠的物體,他就會增加物件的大小,然后你就會需要一些燈光來照亮這些物體。如果你的物件是分開的,燈光將不會渲染遠處的物體,這將會導致模型得到多次渲染,相比較沒有被合并的模型,我們并沒有得到多少實惠。因此,如果你的GameObject中有很多獨立物件的時候,你可以讓他們離得比較遠。當渲染一個模型的時候,UNTIY如果發(fā)現(xiàn)很多燈光在MESH的周圍,它將會找出那個是主要影響這個MSEH的燈光,在Edit->RenderSettings中的設置就是用來調(diào)整有多少個燈光最終作為像素燈光有多少作為頂點燈光。每一個燈光通過計算離MESH得距離和自己燈光強度來決定自己的重要程度。在游戲中的某些燈光是很重要的,所以,每一個燈光都會有一個RenderMode設置,這個用來設置哪一個可以被用來設置為ForcePixel
或者
ForceVertex.想象一下假如我們是一個駕車的游戲,你的角色在夜晚打開車燈,前面的車燈就是游戲中最重要的燈光。因此,前大燈的渲染模式將會被設置為ForcePixel當然如果你有一個不是很重要的燈光,也是選擇使用"ForceVertex"的渲染模式,這個方式也不會對游戲的速度有很大的影響的。影子陰影普遍運算量比較大。如果運用得當,可以讓游戲畫面出色,你也可以樂隊相關文檔。角色建模優(yōu)化你的角色應該只被用于一個蒙皮模型渲染器。當然有時候可能需要多個蒙皮的模型,但是如果你同時用兩個蒙皮來作為一個角色,它就相當于你進行了兩個角色的運算量。
你同樣需要保持MESH的材質數(shù)量盡可能低。一般建議身體的材質數(shù)量為2-3個,當然如果你有武器的材質,也是需要單獨一個的,因為你需要換武器。
減少骨骼的數(shù)量,一般來說游戲中的骨骼數(shù)量為15-60個。骨骼越少運行速度越快,一般來說30塊骨骼就可以讓角色動的很舒服了。如果你不是有特殊的設置,我們強烈建議每個角色30個骨骼。
多邊形的數(shù)量主要是看你對游戲的質量要求,500-6000個三角面是比較推薦的。如果你的游戲場景中將會出現(xiàn)多個角色,那么就要適當?shù)慕档鸵幌露噙呅螖?shù)量了。如果你想要在比較老的機器上運行,你需要更少的多邊形數(shù)量。比如,半條命2游戲的角色通常是2500-5000個三角面。達到AAA標準的次時代游戲比如像是PS3或者XBOX360上的游戲角色通常有5000-7000個三角面。
把IK控制器和FK控制器分離,當動畫導入以后,IK的節(jié)點將會烘焙到FK上,其實UNITY并不需要IK節(jié)點,你可以刪除它們。
創(chuàng)建一個公共的骨架,這樣就可以讓你讓不同的角色之間共享動作了。
給每一個骨骼正確的命名,方便團隊工作,也方便類似于Motionbuilder的動作軟件,不然你得每次指定骨骼。優(yōu)化綜合的圖形卡
優(yōu)化模型參數(shù)
使用盡量少的面
UV接縫的數(shù)量盡可能少
烘焙燈光烘焙燈光到光照貼圖或者到頂點顏色。MAYA具有不錯的制作光照貼圖的工具,UNITY可以從MAYA中導入第二個UV貼圖或者頂點顏色。制作環(huán)境的光照貼圖的流程要比直接在場景中打燈光要繁瑣的多,但是
運行速度明顯增快。
如果你使用全局光并且平滑光照貼圖,可以讓畫面效果明顯增強。
甚至次時代游戲比如戰(zhàn)爭機器始終在很多方面使用光照貼圖。通常他們在場景中使用光照貼圖,然后在上面放置一個動態(tài)燈光。在UNITY中也可以制作相應的光照貼圖Shader.來源于:/jdk900/blog/item/381acffea3e7993b5d6008df.htmluntiy3d(性能)的美工方面需要知道的知識(一)\o"Unity3D"Unity3D
2010-08-1114:43:15
閱讀131
評論0
字號:大中小
訂閱首先,向偉大的SAKARI團隊致敬,他們的游戲真不錯,我也想模仿一下。截圖如下:我其實在我桌子上的廢紙上記錄了很多相關的類似于上面的總結,結果因為是廢紙,丟了很多,不過還好,很多腦袋里面還有點印象,趁著沒忘干凈,趕緊記錄下來。(下面是正文)總結著來,不怎么有條理,湊活著看吧。1.引擎沒有說具體的面數(shù)限制,也許是跟VIRTOOLS一樣的標準,按機器性能而定。2.導入圖形或者MESH的方法無非兩種,一種是直接拷貝到文件目錄下的Assets文件夾下面,Unity3d引擎會自動找到添加的文件,并且能在PROJECT面板中找到它。另一種是我們在PROJECT面板中用右鍵菜單,導入素材。當然,我是用MAYA導入的,U3D引擎對于MAYA的支持還是不錯的,但是也需要注意,不要用中文的目錄結構,最好直接從MAYA的工程文件夾中導入,最好在導入MESH前先吧貼圖文件放到相應的文件夾,或者相關文件夾的子文件夾。在我們導入場景文件的時候,需要在導入設置中勾選創(chuàng)建碰撞,這樣導入的場景我們就可以踩在上面了。(這跟我們添加碰撞組件是有些不同德)3.Unity3d引擎支持大多數(shù)常用的貼圖,比如漫反射貼圖,高光貼圖,法線貼圖。如此一來,它就成了一個名副其實的次時代引擎了。當然與UNREAL引擎的強大材質編輯器不同,U3D引擎主要是編輯材質的方式是使用一種專門的語言,類似于CgFX和Direct3D的語法。當然如果不是專門的圖形程序員,我們只要掌握相關的SHADER的使用方法就可以了。在我們安裝完U3D引擎后,系統(tǒng)自帶的SHADER足夠我們?nèi)粘4蠖鄶?shù)情況下使用了。如果我們還有特殊的要求,可以去官網(wǎng)上下載相關的程序,然后把代碼保存為.shader的文件,放到相應的目錄底下,然后我們就有了這種SHADER。掌握并且理解了上面我說的亂七八糟的三點,你就可以作為一個U3D引擎的美工開始工作了。其中有幾個需要我們進行深入探討的幾個方面:一是導入的MESH的要求,如何減面,UV的情況怎樣,是否可以重疊UV。二是導入的貼圖規(guī)范,我們的各種貼圖要達到怎樣的程度才能導入,并不是直接拍了照片貼上就很有效果的,我們需要在三維軟件中烘焙,之后才能導入。還有光照貼圖怎么制作。三是各種材質的應用,比如說我們最常用在皮膚上的3S材質效果,如何在U3D引擎中實現(xiàn)這種效果?至此,你可以輕松的駕馭U3D引擎的Assets部分了。(松了一口氣,其實很簡單)然后我們要用引擎構建關卡。好吧現(xiàn)在你要成為一個U3D引擎的關卡設計師,當然這里面也有很多美工要做的事情。我們不用每天對著素材模型,貼圖罵娘了。作為關卡設計師,特別是U3D的,一定要有一個GAMEOBJECT的概念,在這個可愛引擎中,我們可以看到各種的元素都是由GAMEOBJECT組成的,在GAMEOBJECT上我們又可以添加組件在實現(xiàn)特定的功能,比如最簡單的位移。我在第一次使用這個引擎的時候,突然興致大發(fā)想要在場景中創(chuàng)建一盞燈,弄了半天都沒成,后來才明白,燈光是要附著在GAMEOBJECT上的。同理,聲音也是要附著在這上面的。還要有一個PREFABS得概念,就在層級菜單中的藍色文字所代表的屬性,其實就是在游戲中可以無限復制的意思,比如子彈,比如無數(shù)的需要出現(xiàn)的小物件兒。類似于三維軟件以及其他引擎,U3D的燈光分為那么普通的幾類,電光源、方向光、自然光。了解燈光的屬性和使用方法。還有U3D引擎的物理系統(tǒng)。當我看到這個系統(tǒng)的時候我的心都開花了,一想到各種獨立游戲中無敵的物理效果心里就暗爽。比如我們可以用最簡單的方法做一個足球游戲。********************還是做游戲好,這個引擎能做網(wǎng)頁游戲,也可以做PC單機游戲,網(wǎng)絡游戲,也可以做IPHONE平臺的手機游戲。真是萬能了!當然,上面很多都是初學時候的經(jīng)驗,下面是我后來加上的一些內(nèi)容,是經(jīng)過學習總結和辛苦翻譯的。讓你的游戲能夠順暢的運行是成功的第一個要求。感謝UNTIY,他們通過大量的優(yōu)化和調(diào)整可以讓這個引擎發(fā)布的游戲運行于各種不同性能的硬件系統(tǒng)。下面是一個通用的優(yōu)化游戲性能的方法。來源于:/jdk900/blog/item/ed33fe00ce1fdb1b738b65d3.htmlUnity3d拖拽物體的腳本\o"Unity3D"Unity3D
2010-07-3016:31:52
閱讀83
評論0
字號:大中小
訂閱functionOnMouseDown(){
varscreenSpace=Camera.main.WorldToScreenPoint(transform.position);
varoffset=transform.position-Camera.main.ScreenToWorldPoint(Vector3(Input.mousePosition.x,Input.mousePosition.y,screenSpace.z));
while(Input.GetMouseButton(0))
{
varcurScreenSpace=Vector3(Input.mousePosition.x,Input.mousePosition.y,screenSpace.z);
varcurPosition=Camera.main.ScreenToWorldPoint(curScreenSpace)+offset;
transform.position=curPosition;
yield;
}
}Unity3d<=實時陰影減少鋸齒\o"Unity3D"Unity3D
2010-07-2817:16:38
閱讀175
評論0
字號:大中小
訂閱這是我看《叫你自由》的視頻后寫的。多謝
=====================================================================實時陰影的資源優(yōu)化如何減少鋸齒感?1.
合理設置斜面常量的數(shù)值在燈光里調(diào)Shadows->ConstantBias
->ObjectSizeBias這兩個是斜面常量數(shù)值,主要是調(diào)解自身的鋸齒2.
盡量減小被投射陰影物體的面積(光投射的面積,越小越好)3.
不考慮資源的情況下,盡量使用大陰影貼圖貼圖尺寸:Edit->projectsettings->Quality這就是運行exe文件時的選擇質量就以Good為例:
Shadows
ShadowResolution
這個就是貼圖的分辨率
LowResolution
MediumResolution
默認
HighResolution
設置這個效果會好些
ShadowCascades
這個就是第四點要說的級別
NoCascades
TwoCascades默認
(把細節(jié)與宏觀分開)
FourCascades
設置成4級
ShadowDistance
(第5點)這個就是顯示陰影的距離,鏡頭遠處的陰影不會顯示
AntiAliasing
默認為Disabled(無)第7點
Disabled
2xMultiSampling
4xMultiSampling
8xMultiSampling
16xMultiSampling
根據(jù)機器配置選擇。4.
使用4級陰影貼圖5.
盡量減小陰影對攝影機的可見距離6.
軟陰影可達到抗陰影鋸齒效果軟陰影在燈光里調(diào)Shadows->Type
陰影的類型
NoShadows
默認無
HardShadows
SoftShadows
選擇這個軟陰影7.
系統(tǒng)抗鋸齒打開后,也會有少許效果Unity3d物體運動到指定位置(X,Y,Z)\o"Unity3D"Unity3D
2010-07-2817:11:11
閱讀70
評論0
字號:大中小
訂閱intsmooth=2;
Quaterniontarget=Quaternion.Euler(0,0,0);//目標
//Dampentowardsthetargetrotation
transform.rotation=Quaternion.Slerp(transform.rotation,target,Time.deltaTime*smooth);控制GUITexture的位置,置頂、置底、靠左、靠右、全屏的JS\o"Unity3D"Unity3D
2010-07-2114:03:09
閱讀115
評論0
字號:大中小
訂閱
varRelative:boolean;
varTop:boolean;
varRight:boolean;
functionOnGUI(){
otherScript=GetComponent(GUITexture);//將GUITexture傳遞過來
thetexture=otherScript.texture;//獲取GUITexture的紋理
if(Relative==true){
if(thetexture.width>thetexture.height){
W=Screen.width;
H=(Screen.width*thetexture.height)/thetexture.width;
}else{
W=(Screen.height*thetexture.width)/thetexture.height;
H=Screen.height;
}
}else{
W=thetexture.width;
H=thetexture.height;
}
if(Top==true){
Y=Screen.height-H;
}elseY=0;
if(Right==true){
X=Screen.width-W;
}elseX=0;
otherScript.pixelInset=Rect(X,Y,W,H);
//print(otherScript.pixelInset);
}
沒使用前:
全屏按比例縮放:置頂:
置頂、靠右:
來源于:/article/Unity3D/30.htmUnity3d拖動GUI(拖動圖片)\o"Unity3D"Unity3D
2010-07-1414:20:00
閱讀67
評論0
字號:大中小
訂閱varwindowRect=Rect(20,20,120,50);
functionOnGUI(){
//Registerthewindow.
windowRect=GUI.Window(0,windowRect,DoMyWindow,"MyWindow");
}
//Makethecontentsofthewindow
functionDoMyWindow(windowID:int){
//Makeaverylongrectthatis20pixelstall.
//Thiswillmakethewindowberesizablebythetop
//titlebar-nomatterhowwideitgets.
GUI.DragWindow(Rect(0,0,10000,20));
}
根據(jù)這個內(nèi)容可以想到鼠標點擊拖動圖片::varimage:Texture;
varguiTexture:Rect;functionAwake()
{
guiTexture.width=image.width;
guiTexture.height=image.height;
}
functionOnGUI()
{
guiTexture=GUI.Window(0,guiTexture,popWin,"");
}
functionpopWin(winId:int)
{
GUI.DrawTexture(Rect(0,0,guiTexture.width,guiTexture.height),image);
GUI.DragWindow();
}讓js編輯器SciTEG永久支持中文\o"Unity3D"Unity3D
2010-07-1315:00:15
閱讀51
評論0
字號:大中小
訂閱今天收獲真不小實在忍受不了每次打開都要設置uncode==utf-8嘗試修改了些屬性果然實現(xiàn)了
假如你的代碼中有中文這個設置是很爽的。以后注釋也可以中文了。
說方法:
1.用記事本打開D:\ProgramFiles\Unity\Editor\Data\Tools\UniSciTE\SciTEGperties
//你裝的路徑
2.找到#Internationalisation這一行下面的都是設置編碼的(鄙視一下居然是Japanese)
3.可以把下面這段的都刪除掉到#output.code.page=65001這里
然后把下面粘貼到這個位置(改把chinese作為注釋)
4.大功告成。試一下打些中文然后選擇中文如果不亂碼(不改這個選擇中文會亂碼)恭喜你成功!
===========================================================================
#Internationalisation
#Chineseinputcodepage936andChinesecharacterset136
code.page=936
character.set=136
#Unicode
code.page=65001
character.set=136
#RequiredforUnicodetoworkonGTK+:
LC_CTYPE=en_US.UTF-8
output.code.page=65001
======================================================================================
來源于:/viewtopic.php?f=22&t=67讓Unity的腳本編輯器默認顯示行號\o"Unity3D"Unity3D
2010-07-1314:22:05
閱讀61
評論0
字號:大中小
訂閱U的腳本編輯器默認是不顯示行號的,每次打開都要勾選,很麻煩,剛剛發(fā)現(xiàn)一個辦法可以修改編輯器的設置,首先找到編輯器的配置文件,比如:我的配置文件路徑
D:\Unity\Editor\Data\Tools\UniSciTE\SciTEGperties
找到之后用文本編輯器打開它,讓后在里面隨便哪一行加上這句
line.margin.visible=1
保存一下再重新打開編輯器看看.U3d喚醒的數(shù)學知識\o"Unity3D"Unity3D
2010-07-1313:54:38
閱讀49
評論0
字號:大中小
訂閱太久沒運用幾何知識了,u3d也確實封裝掉了太多的知識,搞得就只會用函數(shù)而不懂原理了,很多公式一時還真記不起來,這幾天居然拿出了紙在推導一些公式,以懷念我從小學到大學值得驕傲的數(shù)學知識。
1.角度與弧度互轉(別告訴我連弧度是什么你都不知道了)
弧度=角度*3.14159f/180.0f
角度=弧度*180.0f/3.14159f
向量旋轉應用:
staticfunctionRotateTowards(from:Vector3,to:Vector3,maxRadiansDelta:float,maxMagnitudeDelta:float):Vector3
解釋:將向量from向to向量旋轉maxRadiansDelta弧度變化maxMagnitudeDelta幅度(長度)。
maxRadiansDelta是選擇的弧度(不是角度哦)
2.向量旋轉(之前不懂上面那個函數(shù)的時候,到處找公式自己寫旋轉-.-)
對于p=(x,y)這個向量向逆時針旋轉且大小不改變所得到的向量如下:
p:(x,y)>p':(x*cos(d)-y*sin(d),x*sin(d)+y*cos(d))
如果是向順時針旋轉則:
p:(x,y)>p':(x*cos(-d)-y*sin(-d),x*sin(-d)+y*cos(-d))
3.向量相乘
點乘,得到的是內(nèi)積是實數(shù)
差乘,得到的是外積是向量,垂直于原向量的平面(右手法則)
向量a·向量b=a1a2+b1b2+c1c2
向量a×向量b=
|ijk|
|a1b1c1|
|a2b2c2|
=(b1c2-b2c1,c1a2-a1c2,a1b2-a2b1)
4.復數(shù)乘法的幾何意義(這個才叫困擾我n久的東西,阿杜當年也不重點講下-,-)
復數(shù)乘法(叉乘)的幾何意義實際上就是對復數(shù)進行旋轉
對最簡單的復數(shù)p=x+yi來說,和另一個復數(shù)q=(conα,sinα)相乘,則表示把p沿逆時針方向旋轉α:
p’=pq
來源于:/viewtopic.php?f=24&t=100控制輸入系統(tǒng)-Input類實例講解\o"Unity3D"Unity3D
2010-07-1313:39:59
閱讀49
評論0
字號:大中小
訂閱獲取鍵盤某一(這里是空格鍵)按鍵狀態(tài)(bool):Input.GetKeyDown(KeyCode.Space)這是最不通用的寫法,不推薦
獲取虛擬按鍵(這里是Jump)按鍵狀態(tài)(bool):Input.GetButton("Jump")推薦用這種寫法,用戶可以設置按鍵Jump為空格鍵(默認就是空格)
獲取遙感(或iphone感應)垂直軸力度(是一個0-1之間的float):Input.GetAxis("Vertical“)推薦寫法,鍵盤的話默認按w或者up會瞬間提到1,要是遙感的話可以控制一個度,再乘以力的方向向量的話,就可以控制汽車之類的加速了。如果你直接寫成鍵盤的w或者d,那就沒辦法控制力度了。
獲取遙感(或iphone感應)水平軸力度(同上):Input.GetAxis("Horizontal")
獲取鼠標中鍵狀態(tài):Input.GetAxis("MouseScrollWheel")
注:有些遙感可能水平方向會轉超過1或者小于0的值出來(例如汽車遙感),為了避免錯誤的計算(乘以負數(shù)的話向量的方向可是會相反的),可以配合數(shù)學函數(shù)Mathf.Clamp01()來固定他的值在0和1之間。例如:
motor=Mathf.Clamp01(Input.GetAxis("Vertical"));//設置汽車引擎力度為垂直方向力度用于揮動的旗幟效果(shader)\o"Unity3DShader版塊"Unity3DShader
2010-07-1310:36:46
閱讀104
評論0
字號:大中小
訂閱//Originalshaderbycboe-Mar,23,2009
//Enhancedto3axismovementbySeon-Jan,21,2010
//
//Requirements:assumesyouareusingasubdividedplanecreatedwithX(width)*Z(height)whereYisflat.
//Requirements:assumesUVas:leftX(U0)isattatchedtopole,andTopZ(V1)isattopofpole.
//
//Enjoy!
Shader"Selfmade/FlagWave"
{
Properties
{
_Color("MainColor",Color)=(1,1,1,1)
_MainTex("Texture",2D)="white"{}
}
SubShader
{
Pass
{
CULLOff
CGPROGRAM
#pragmavertexvert
#pragmafragmentfrag
#include"UnityCG.cginc"
#include"AutoLight.cginc"
float4_Color;
sampler2D_MainTex;
//vertexinput:position,normal
structappdata{
float4vertex:POSITION;
float4texcoord:TEXCOORD0;
};
structv2f{
float4pos:POSITION;
float2uv:TEXCOORD0;
};
v2fvert(appdatav){
v2fo;
floatsinOff=v.vertex.x+v.vertex.y+v.vertex.z;
floatt=-_Time*50;
floatfx=v.texcoord.x;
floatfy=v.texcoord.x*v.texcoord.y;
v.vertex.x+=sin(t*1.45+sinOff)*fx*0.5;
v.vertex.y=sin(t*3.12+sinOff)*fx*0.5-fy*0.9;
v.vertex.z-=sin(t*2.2+sinOff)*fx*0.2;
o.pos=mul(glstate.matrix.mvp,v.vertex);
o.uv=v.texcoord;
returno;
}
float4frag(v2fi):COLOR
{
half4color=tex2D(_MainTex,i.uv);
returncolor;
}
ENDCG
SetTexture[_MainTex]{combinetexture}
}
}
Fallback"VertexLit"
}鼠標控制object\o"Unity3D"Unity3D
2010-07-1310:14:14
閱讀43
評論0
字號:大中小
訂閱你鼠標轉換的position是沒有z值的,用鼠標控制物體的方法:
//vartarget:Transform;
vardistance=20.0;
varmySpeed=250.0;
privatevarx=0.0;
privatevary=0.0;
privatevarz=0.0;
varxMinLimit=30;
varxMaxLimit=120;
varyMinLimit=30;
varyMaxLimit=120;
varzMinLimit=30;
varzMaxLimit=120;
functionStart(){
varangles=transform.eulerAngles;
x=angles.y;
y=angles.x;
z=angles.z;
}
functionLateUpdate(){
if(Input.GetMouseButton(0)){
//x+=Input.GetAxis("MouseX")*mySpeed*0.02;
//x=ClampAngle(x,xMinLimit,xMaxLimit);
y-=Input.GetAxis("MouseY")*mySpeed;
y=ClampAngle(y,yMinLimit,yMaxLimit);
//z+=Input.GetAxis("MouseY")*mySpeed*0.02;
//z=ClampAngle(z,zMinLimit,zMaxLimit);
}
varrotation=Quaternion.Euler(x,y,z);
transform.rotation=rotation;
//varposition=rotation*Vector3(0.0,0.0,-distance)+target.position;
//transform.position=position;
}
staticfunctionClampAngle(angle:float,min:float,max:float){
if(angle<-360)
angle+=360;
if(angle>360)
angle-=360;
returnMathf.Clamp(angle,min,max);
}
代碼完全可用:使用方法就是你把腳本放進你的物體里就可以用鼠標控制。
來源于:/viewtopic.php?f=16&t=235GUI中的圖片跟隨鼠標旋轉,鼠標用圖片代替\o"Unity3D"Unity3D
2010-07-1309:50:40
閱讀55
評論0
字號:大中小
訂閱最近要做一款類似于“祖瑪”的游戲,要用到一張圖像跟隨鼠標旋轉。所以研究了一下圖片跟隨鼠標旋轉。
代碼不多,主要代碼就是旋轉角度的計算。
varMid:Texture2D;
varmouse:Texture2D;//鼠標圖片
varmousePs=Vector2.zero;//鼠標的位置
privatevarangle:float;
functionUpdate(){
mousePs=Input.mousePosition;//獲取鼠標位置
angle=180-Mathf.Atan2(mousePs.x-250,Screen.height-mousePs.y-250)*Mathf.Rad2Deg;//計算選擇角度
}
functionOnGUI(){
Screen.showCursor=false;
GUIUtility.RotateAroundPivot(angle,Vector2(250,250));
GUI.DrawTexture(Rect(200,200,100,100),Mid);
GUIUtility.RotateAroundPivot(-angle,Vector2(250,250));
GUI.DrawTexture(Rect(mousePs.x,Screen.height-mousePs.y,25,25),mouse);
}
來源于:/viewtopic.php?f=18&t=9說明幫助GUI的制作(可以開關圖片或視頻)\o"Unity3D"Unity3D
2010-07-1309:41:14
閱讀44
評論0
字號:大中小
訂閱GUI.Toggle()gui001.jpg(64.66KiB)被瀏覽206次
varmystyle:GUIStyle;
//定義了GUI自己更換皮膚的功能。
varGUIx=100;
varGUIy=10;
varGUIyup=22;
varGUIw=90;
varGUIh=20;
vartoggleBool=true;
//設置一個可見開關,并初始化為true正確。
functionOnGUI()
{
toggleBool=GUI.Toggle(Rect(Screen.width-GUIx,GUIy+GUIyup*5,GUIw,GUIh),toggleBool,"help",mystyle);
//創(chuàng)建一個GUI開關并等于自定義屬性toggleBool項目。
GetComponent(GUIBoxRender).enabled=toggleBool;
//這個開關決定GUIBoxRender這個名字的腳本是否使用。
}
制作一個GUI開關,即Toggle按鈕,這個GUI的功能是通過點擊來傳輸true和false的功能,其輸入Boolean類型。它不同于按鈕Button屬于執(zhí)行程序功能。這個開關決定兩種結果,即對和錯。而Button只是決定是否啟用程序,注意區(qū)分。
其中GetComponent(GUIBoxRender).enabled這個的翻譯是“獲得程序腳本文件(文件名).是否允許使用”如果輸入的結果是true,那么這個腳本會使用。如果輸入的是false,那么這個腳本就會關閉(但不刪除)。
注意:這個GetComponent(GUIBoxRender).enabled只使用于GUI腳本,對于物體的開關需要使用renderer.enable并將腳本落在物體上。
注意:文件名的大小寫和格式不能出錯。
GUI
varmystyle:GUIStyle;
varGUIx=200;
varGUIy=10;
varGUIyup=22;
functionOnGUI()
{
GUI.Button(Rect(Screen.width-GUIx,GUIy+GUIyup*6,200,227),"",mystyle);
}
這個很簡單,主要創(chuàng)建一個開關,開關除了具有按鈕功能,還具有添加圖片功能。并且分辨率和清晰度遠遠高于Teture2D以及GUITexture的效果。
我們只要在Mystyle的屬性中的Normal中添加一個貼圖即可,注意GUI.Button的大小要與制作的貼圖大小一致,可以允許比例縮小。
來源:/viewtopic.php?f=18&t=110
轉帖機器人,不回站內(nèi)短信GUI里面圖片的旋轉(附帶鐘表例子)\o"Unity3D"Unity3D
2010-07-1309:34:39
閱讀31
評論0
字號:大中小
訂閱以前一直不知道在GUI里面畫出的圖片可以旋轉,所以遇到想要旋轉圖片時,都是把圖片貼到一個面片上,旋轉面片,很是不方便,最近發(fā)現(xiàn)在GUI里是可以旋轉圖片的,所以寫到這里分享給大家。下面貼一個例子,利用圖片旋轉寫的一個鐘表的代碼,不廢話,直接上代碼。
varTu1:Texture2D;
varTime1:float=0;
functionFixedUpdate(){
Time1+=Time.deltaTime;
}
functionOnGUI(){
GUI.Label(Rect(250,170,161,62),getTime(Time1));
GUIUtility.RotateAroundPivot(6*Time1,Vector2(103,200));
GUI.DrawTexture(Rect(100,100,6,100),Tu1)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025湖北省安全員考試題庫及答案
- 包租廠房合同范本
- 倉庫招聘合同范本
- 加工車庫門窗合同范本
- 勞務合同租賃合同范本
- 個人單位用人合同范本
- 單位購車職工使用合同范本
- 刮瓷墻面修補合同范本
- 冷庫搬運服務合同范本
- 業(yè)主瓷磚采購合同范本
- 《網(wǎng)店運營與管理》整本書電子教案全套教學教案
- 打印版 《固體物理教程》課后答案王矜奉
- CAD術語對照表
- 學術論文的寫作與規(guī)范課件
- 香港牛津新魔法Newmagic3AUnit4Mycalendar單元檢測試卷
- 中考《紅星照耀中國》各篇章練習題及答案(1-12)
- Q∕GDW 11612.43-2018 低壓電力線高速載波通信互聯(lián)互通技術規(guī)范 第4-3部分:應用層通信協(xié)議
- 自動化物料編碼規(guī)則
- 第1本書出體旅程journeys out of the body精教版2003版
- [英語考試]同等學力英語新大綱全部詞匯
- 最簡易的帕累托圖制作方法簡介PPT課件
評論
0/150
提交評論