Unity3D常用程式碼收集總結
阿新 • • 發佈:2019-02-10
//建立一個名為"Player"的遊戲物體 //並給他新增剛體和立方體碰撞器. player=new GameObject("Player"); player.AddComponent("Rigidbody"); player.AddComponent("BoxCollider"); //建立一個沒有名稱的遊戲物體 //並給他新增剛體和立方體碰撞器.Transform總是被新增到該遊戲物體. player=new GameObject(); player.AddComponent("Rigidbody"); player.AddComponent("BoxCollider"); //新增名為FoobarScript的指令碼到遊戲物體 gameObject.AddComponent("FoobarScript"); //新增球形碰撞器到遊戲物體 gameObject.AddComponent("FoobarCollider"); 注意,沒有RemoveComponent(),來移除元件,使用Object.Destroy. //不啟用該遊戲物體. gameObject.active=false; //附加到這個遊戲物體的動畫元件(只讀)(如果沒有為null) var other: GameObject; other.animation.Play(); //附加到這個遊戲物體的聲音元件(只讀)(如果沒有為null) var other: GameObject; other.audio.Play(); //附加到這個遊戲物體的相機(只讀)(如果沒有為null) var other: GameObject; other.camera.fieldOfView=45; //附加到這個遊戲物體的碰撞器(只讀)(如果沒有為null) var other: GameObject; other.collider.material.dynamicFriction=1; //附加到這個遊戲物體的恆定力(只讀)(如果沒有為null) var other: GameObject; other.constantForce.relativeForce=Vector3(0,0,1); //附加到這個遊戲物體的GUIText,GUITexture(只讀)(如果沒有為null) var other: GameObject; other.guiText.text="HelloWorld"; //附加到這個遊戲物體的HingeJoint(只讀)(如果沒有為null) var other: GameObject; other.hingeJoint Spring.targetPosition=70; //遊戲物體所在的層,一個層在[0...32]之間. Layer可以用來選擇性的渲染或忽略投射. //設定遊戲物體到忽略投射物體的層上 gameObject.layer=2; //附加到這個遊戲物體的光影(只讀)(如果沒有為null) var other: GameObject; other.light.range=10; //附加到這個遊戲物體的網路視(只讀)(如果沒有為null) var other: GameObject; other.networkView.RPC("MyFunction",RPCMode.All,"someValue"); //附加到這個遊戲物體的粒子發射器(只讀)(如果沒有為null) var other: GameObject; other.particleEmitter.emite=true; //附加到這個遊戲物體的渲染器(只讀)(如果沒有為null) var other: GameObject; other.renderer.material.color=Color.green; //附加到這個遊戲物體的剛體(只讀)(如果沒有為null) var other: GameObject; other.rigidbody.AddForce(1,1,1); //標籤可以用來標識一個遊戲物體。標籤在使用前必須在標籤管理器中定義。 gameObject.tag="Player"; //附加到這物體的變換. (如果沒有為null) var other: GameObject; other.transform.Translate(1,1,1); //在這個遊戲物體或其任何子上的每個MonoBehaviour上呼叫methodName方法。 //通過使用零引數,接收方法可以選擇忽略parameter。如果options被設定為 SendMessageOptions.RequireReceiver,那麼如果這個訊息沒有被任何元件接收時將列印一個 錯誤訊息。 ///使用值5呼叫函式ApplyDamage gameObject.BroadcastMessage("ApplyDamage",5); //所有附加到該遊戲物體和其子物體上指令碼中的 //ApplyDamage函式都將呼叫 function ApplyDamage(damage) { print(damage) } //立即死亡觸發器 //銷燬任何進入到觸發器的碰撞器,這些碰撞器被標記為Player. function OnTriggerEnter(other: Collider) { if(other.gameObject.CompareTag("Player")) { Destroy(other.gameObject); } } 如果遊戲物體有type型別的元件就返回它,否則返回null. 你可以使用這個函式 訪問內建的元件或指令碼. GetComponent是防衛其他元件的主要方法。對於Javascript指令碼的型別總是指令碼顯示 在工程檢視中的名稱。例如: function Start() { var curTransform: Transform; curTransform=gameObject.GetComponent(Transform); //這等同於 curTransform=gameObject.transform; } function Update() { //為訪問附加在同一遊戲物體上 //其他指令碼內的公用變數和函式 //(ScriptName為Javascript檔名) var other: ScriptName=gameObject.GetComponent(ScriptName); //呼叫該指令碼中的DoSomething函式 other DoSomething(); //設定其他指令碼例項中的另一個變數 other.someVariable=5; } //返回type型別的元件,這個元件位於這個遊戲物體或任何它的子物體上,使用深度優先搜尋。 //只有啟用的元件被返回。 var script: ScriptName=gameObject.GetComponentInChildren(ScriptName); script.DoSomething(); //返回該遊戲物體上所有type型別的元件。 //在這個遊戲物體和所有它的子物體上 //的HingeJoints上禁用彈簧 var hingeJoints=gameObject.GetComponents(HingeJoint); for(var joint: HingeJoint in hingeJoints) { joint.useSpring=false; } //返回所有type型別的元件,這些元件位於該遊戲物體或任何它的子物體上。 //只有啟用的元件被返回。 //在這個遊戲物體和所有它的子物體上 //的所有HingeJoints上禁用彈簧 var hingeJoints=gameObject.GetComponentsInChildren(HingeJoint); for(var joint: HingeJoint in hingeJoints) { joint.useSpring=false; } //在一個特定的時間取樣動畫,用於任何動畫目的。 //出於效能考慮建議使用Animation介面,這將在給定的time採用animation,任何被動化的元件屬性都將被這個取樣值替換,多數時候你會使用Animation.Play. SampleAnimation //用於當你需要以無序方式或給予一些特殊的輸入在幀之間跳躍時使用。參見:Aniamtion //通過取樣每一幀或動畫剪輯 var clip.AniamtionClip function Update() { gameObject.sampleAnimation(clip, clip.length-Time.time); } //設定這個物體和所以子游戲物體的機會狀態。 gameObject.SetActiveRecursion(true); //用幾何的網格渲染器和適當的碰撞器建立一個遊戲物體。 ///在場景中建立一個平面,球體和立方體 function Start() { var plane:GameObject= GameObject.CreatePrimitive(PrimitiveType.Plane); var cube=GameObject.CreatePrimitive(PrimitiveType.Cube); cube.transform.position=Vector3(0,0.5,0); var sphere=GameObject.CreatePrimitive(PrimitiveType.Sphere); sphere.transform.position=Vector3(0,1.5,0); var capsule=GameObject.CreatePrimitive(PrimitiveType.Capsule); capsule.transform.position=Vector3(2,1,0); var cylinder=GameObject.CreatePrimitive(PrimitiveType.Cylinder); cylinder.transform.position=Vector3(-2,1,0); } static function Find(name: string): GameObject 描述:依據name查詢物體並返回它. 如果沒有物體具有名稱name返回null. 如果name包含'/'字元它將像一個路徑名一樣穿 越層次,這個函式只返回啟用的遊戲物體。 出於效能考慮建議不要在每幀中都是有該函式,而是在開始時呼叫並在成員變數中快取結果 或者用GameObject.FindWithTag. //這返回場景中名為Hand的遊戲物體. hand=GameObject.Find("Hand"); //這將返回名為Hand的遊戲物體. //在層次試圖中Hand也許沒有父! hand=GameObject.Find("/Hand"); //這將返回名為Hand的遊戲物體. //它是Arm>Monster的子. //在層次試圖中Monster也許沒有父! hand=GameObject.Find("/Monster/Arm/Hand"); //這將返回名為Hand的遊戲物體. //它是Arm>Monster的子. //Monster有父. hand=GameObject.Find("/Monster/Arm/Hand"); 這個函式最常用與在載入時自動連結引用到其他物體,例如,在MonoBehaviour.Awake 或MonoBehaviour.Start內部. 處於效能考慮你不應該在每幀中呼叫這個函式,例如 MonoBehaviour.Update內. 一個通用的模式是在MonoBehaviour.Start內將一個遊戲物體賦給 一個變數. 並在MonoBehaviour.Update中使用這個變數. //在Start中找到Hand並在每幀中選擇它 private var hand: GameObject; function Start() { hand=GameObject.Find("/Monster/Arm/Hand"); } function Update() { hand.transform.Rotate(0,100*Time.deltaTime,0); } function FindGameObjectsWithTag(tag: string): GameObject[] 描述:返回標記為tag的啟用物體列表,如果沒有發現返回null. 標籤在使用前必須在標籤管理中定義。 //在所有標記為"Respawn"的物體位置處 //例項化respawnPrefab var respawnPrefab: GameObject; var respawns=GameObject.FindGameObjectsWithTag("Respawn"); for(var respawn in respawns) Instantiate(respawnPrefab, respawn.position, respawn.rotation); //列印最接近的敵人的名稱 print(FindClosestEnemy().name); //找到最近的敵人的名稱 function FindClosestEnemy(): GameObject { //找到所以標記為Enemy的遊戲物體 var gos: GameObject[] gos=GameObject.FindGameObjectsWithTag("Enemy"); var closest: GameObject; var distance=Mathf.Infinity; var position=transform.position; //遍歷它們找到最近的一個 for(var go: GameObject in gos) { var diff=(go.transform.position-position); var curDistance=diff.sqrMagnitude; if(curDistance<distance) { closest=go; distance=curDistance; } } return closest; } 返回標記為tag的一個啟用遊戲物體,如果沒有發現返回null. 標籤在使用前必須在標籤管理中定義。 //在標記為"Respawn"的物體位置處 //例項化一個respawnPrefab var respawnPrefab: GameObject; var respawns=GameObject.FindWithTag("Respawn"); Instantiate(respawnPrefab, respawn.position, respawn.rotation); 主材質的紋理縮放。 這與使用帶有"_MainTex"名稱的GetTextureScale或SetTextureScale相同。 function Update() { var scalex=Mathf.Cus(Timetime)*0.5+1; var scaleY=Mathf.Sin(Timetime)*0.5+1; renderer.material.mainTextureScale=Vector2(scaleX,scaleY); } 參見:SetTextureScale.GetTextureScale. 在這個材質中有多少個pass(只讀). 這個最常用在使用GL類之間繪製的程式碼中(只限於Unity Pro). 例如,Image Effects使用 材質來實現屏幕後期處理. 對材質中的每一個pass(參考SetPass)它們啟用並繪製一個全屏 四邊形。 這裡是一個全屏圖形效果的例子,它反轉顏色。新增這個指令碼到相機並在播放模式中 檢視。 private var mat: Material; function Start() { mat=new Material( "Shader"Hidden/Invert"{"+ "SubShader{"+ "Pass{"+ "ZTestAlways Cull Off ZWrite Off"+ "SetTexture[_RenderTex]{combine one-texture}"+ "}"+ "{"+ "}"+ ); } function OnRenderImage(source: RenderTexture, dest: RenderTexture){ RenderTexture.active=dest; source.SetGlobalShaderProperty("_RenderTex"); GL.PushMatrix(); GL.LoadOrtho(); //對於材質中的每個pass(這裡只有一個) for(var i=0; i<mat.passCount; ++i){ //啟用pass mat.SetPass(i); //繪製一個四邊形 GL.Begin(GLQUADS); GL.TEXCoord2(0,0); GL.Vertex3(0,0,0.1); GL.TEXCoord2(1,0); GL.Vertex3(1,0,0.1); GL.TEXCoord2(1,1); GL.Vertex3(1,1,0.1); GL.TEXCoord2(0,1); GL.Vertex3(0,1,0.1); GL.End(); } GL.PopMatrix(); } 參見:SetPass函式,GL類,ShaderLab documentation. 該材質使用的著色器。 //按下空格鍵時, //在Diffuse和Transparent/Diffuse著色器之間切換 private var shader1=Shader.Find("Diffuse"); private var shader2=Shader.Find("Transparent/Diffuse"); function Update() { if(Input.GetButtonDown("Jump")) { if(renderer.material.shader--shader1) rendere.material.shader=shader2; else renderer.material.shader=shader1; } } 參見:Shader.Find方法,Material, ShaderLab documentation. 從一個源shader字串建立一個材質。 如果你有一個實現自定義特效的指令碼,你需要使用著色器和材質實現所有的影象設定。 在你的指令碼內使用這個函式建立一個自定義的著色器和材質。在建立材質後,使用SetColor, SetTexture, SetFloat, SetVector, SetMatrix來設定著色器屬性值。 //建立一個附加混合材質並用它來渲染 var color=Color.white; function Start() { var shader Text= "shader"Alpha Additive"{"+ Properties{_Color("Main Color", Color)=(1,1,1,0)}"+ "SubShader {"+ "Tags {"Queue"="Transparent"}"+ "Pass {"+ "Blend One One ZWrite Off ColorMask RGB"+ "Material {Diffuse[_Color]Ambient[_Color]}"+ "Lighting On"+ "SetTexture[_Dummy]{combine primary double, primary}"+ "}"+ "}"+ "}"; renderer.material=new Material(shaderText); renderer.material.color=color; } 獲取一個命名的顏色值。 數多shader使用超過一個顏色,使用GetColor來獲取propertyName顏色。 Unity內建著色器使用的普通顏色名稱; "_Color"為材質的主顏色。這也能夠通過color屬性訪問。 "_SpecColor"為材質的反射顏色(在specular/glossy/vertexlit著色器中使用)。 "_Emission"為材質的散射顏色(用在reflective著色器中使用)。 print(renderder.material.GetColor("_SpecColor)); 獲取一個命名紋理。 數多shader使用超過一個紋理。使用GetTexture來獲取propertyName紋理。 Unity內建著色器使用的普通紋理名稱; "_MainTex"為主散射紋理. 這也能夠通過mainTexture屬性訪問。 "_BumpMap"為法線貼圖。 "_LightMap"為光照貼圖。 "_Cube"為發射立方體貼圖。 function Start() { var tex=renderer.material.GetTexture("_BumpMap"); if(tex) print("My bumpmap is "+ tex.name); else print("I have no bumpmap!"); } function GetTextureOffset(propertyName: string): Vector2 function GetTextureScale(propertyName: string): Vector2 Mathf.Lerp 插值 當t = 0返回from,當t = 1 返回to。當t = 0.5 返回from和to的平均值。 // 在一秒內從minimum漸變到maximum var minimum = 10.0; var maximum = 20.0; function Update () { transform.position = Vector3(Mathf.Lerp(minimum, maximum, Time.time), 0, 0); } //像彈簧一樣跟隨目標物體 var target : Transform; var smooth = 5.0; function Update () { transform.position = Vector3.Lerp ( transform.position, target.position, Time.deltaTime * smooth); } //混合兩個材質 var material1: Material; var material2: Material; var duration=2.0; function Start() { //首先使用第一個材質 renderer.material=material[]; } function Update() { //隨著時間來回變化材質 var lerp=Mathf.PingPong(Time.time, duration)/duration; renderer.material.Lerp(material1, materail2, lerp); } 設定一個命名的顏色值。 數多shader使用超過一個顏色。使用SetColor來獲取propertyName顏色. Unity內建著色器使用的普通顏色名稱; "_Color"為材質的主顏色. 這也能夠通過color屬性訪問. "_SpecColor"為材質的反射顏色(在specular/glossy/vertexlit著色器中使用). "_Emission"為材質的散射顏色(用在vertexlit著色器中). "_ReflectColor"為材質的反射顏色(用在reflective著色器中). function Start() { //設定Glossy著色器這樣可以使用反射顏色 renderer.material.shader=Shader.Find("Glossy"); //設定紅色的高光 renderer.material.SetColor("_SpecColor", Color.red); } SetFloat(propertyName: string, value: float): void 描述:設定一個命名的浮點值。 function Start() { //在這個材質上使用Glossy著色器 renderer.material.shader=Shader.Find("Glossy"); } function Update() { //動畫Shininess值 var shininess=Mathf.PingPong(Time.time, 1.0); renderer.material.SetFloat("_Shininess, shininess); } Mathf.PingPong 乒乓 function Update () { // Set the x position to loop between 0 and 3 //設定x位置迴圈在0和3之間 transform.position = Vector3( Mathf.PingPong(Time.time, 3), transform.position.y, transform.position.z); } //如果當前變換z軸接近目標小於5度的時候,列印"close" var target : Transform; function Update () { var targetDir = target.position - transform.position; var forward = transform.forward; var angle = Vector3.Angle(targetDir, forward); if (angle < 5.0) print("close"); } Vector3.ClampMagnitude 限制長度 返回向量的長度,最大不超過maxLength所指示的長度。 也就是說,鉗制向量長度到一個特定的長度。 var abc : Vector3; function Start () { abc=Vector3(0,10,0); abc=Vector3.ClampMagnitude(abc, 2); //abc返回的是Vector3(0,2,0) abc=Vector3.ClampMagnitude(abc, 12); //abc返回的是Vector3(0,10,0) } Vector3.Dot 點乘 對於normalized向量,如果他們指向在完全相同的方向,Dot返回1。如果他們指向完全相反的方向,返回-1。對於其他的情況返回一個數(例如:如果是垂直的Dot返回0)。對於任意長度的向量,Dot返回值是相同的:當向量之間的角度減小,它們得到更大的值。 // detects if other transform is behind this object //檢測其他變換是否在這個物體的後面 var other : Transform; function Update() { if (other) { var forward = transform.TransformDirection(Vector3.forward); var toOther = other.position - transform.position; if (Vector3.Dot(forward,toOther) < 0) print ("The other transform is behind me!"); } } Vector3.forward 向前 寫Vector3(0, 0, 1)的簡碼,也就是向z軸。 transform.position += Vector3.forward * Time.deltaTime; Vector3.magnitude 長度 向量的長度是(x*x+y*y+z*z)的平方根。 Vector3.Max 最大 返回一個由兩個向量的最大元件組成的向量 var a : Vector3 = Vector3(1, 2, 3); var b : Vector3 = Vector3(4, 3, 2); print (Vector3.Max(a,b)); // prints (4.0,3.0,3.0) Vector3.one Vector3(1, 1, 1)的簡碼。 transform.position = Vector3.one; Vector3.operator * 運算子 // make the vector twice longer: prints (2.0,4.0,6.0) //使該向量變長2倍 print (Vector3(1,2,3) * 2.0); Vector3.operator + // prints (5.0,7.0,9.0) print (Vector3(1,2,3) + Vector3(4,5,6)); static function Project (vector : Vector3, onNormal : Vector3) : Vector3 投射一個向量到另一個。 返回一個向量,這個向量由vector投射到onNormal。 返回0如果onNormal幾乎等於或等於0; 即vector垂直投射到onNormal與原點連線的線上的點 Transform就是U3D所封裝的矩陣運算,所實現的功能不過就是物體矩陣的運算罷了 SimplePath 提供任何型別的高階尋路功能。 包含尋路、轉向、路徑平滑、動態障礙物避免、地形編輯。 使用者手冊檢視地址:http://www.alexkring.com/SimplePath/SimplePath.pdf API:http://www.alexkring.com/SimplePath/Doxygen/html/index.html Demo Video:http://www.youtube.com/watch?v=sTb59eKp6qM 500 Agents Pathfinding + Dynamic Obstacle Avoidance:http://youtu.be/8ZNaNdOFXRw //載入test下所有資源 function Start () { //需將textres轉為Texture2D[] var textures:Object[] = Resources.LoadAll("_texture/test"); Debug.Log("textures.Length: " + textures.Length); } //基於時間滾動主紋理 var scrollSpeed=0.5; function Update() { var offset=Time.time*scrollspeed; renderer.material.mainTextureOffset=Vector2(offset,0); } 參見:SetTextureOffset.GetTextureOffset.