Unity(一)Unity脚本程序开发
最近實驗室有AR的項目,需要用Unity進行開發,一邊學習一邊把知識總結下來。在開始項目之前討論過項目的技術方案,用Unity開發還是用Unreal開發,本人在兩種游戲引擎上都有過初步的接觸,認為Unreal作為后起之秀確實在某種程度上強于Unity,比如軟件的設計、畫面逼真程度,但作為一名程序員,實在對藍圖編程無感,對代碼更加放心,還是更喜歡Unity的編程風格,因此選擇了Unity,開始了漫長的Unity學習之路,學習資料是《Unity 5.X 3D游戲開發技術詳解與典型案例》,歡迎交流。
一、Unity腳本概述
Unity腳本繼承自MonBehaviour類,類中定義了各種回調方法,如Start、Update和FixedUpdate。
public class NewBehaviourScript: MonoBehaviour{...}開發腳本時,主要時繼承MonoBehaviour類并重寫其中特定的方法。
Start方法:游戲場景加載時被調用,在該方法可以寫一些游戲場景初始化的代碼。
Update方法:在每一幀渲染之前被調用,大部分游戲代碼在這里執行,除了物理部分的代碼。
FixedUpdate方法:在固定的物理時間步調調用一次,基本物理行為代碼執行的地方,如剛體Rigidbody,其中代碼的執行和游戲的幀速率無關。
需要注意的是,1.在創建腳本時,類名字必須匹配文件名。2.類中的成員變量可以時private、protected和public,如果想在屬性查看器中顯示,其必須是public類型的。3.盡量避免在類中使用構造函數。
二、Unity腳本的基礎語法
1.常用操作
Unity中很多對游戲對象的操作都是在腳本中修改對象的Transform(變換屬性)與Rigidbody(剛體屬性)參數來實現的。
讓物體繞x軸旋轉20°和讓物體向前移動1個單位長度:
this.transform.Rotate(20,0,0); //繞x軸旋轉20° this.transform.Translate(0,0,1) //向前移動1個單位長度第四個參數為Space枚舉類型,Space.Self相對于自身軸(默認),Space.World相對于世界坐標系統。
2.記錄時間
Time類中重要的變量為deltaTime,指的是從最近一次調用Update或FixedUpdate方法到現在的時間,如果想均勻地旋轉一個物體,不考慮幀速率的情況下,可以乘以Time.deltaTime。
public GameObject gameObject; //聲明一個游戲對象 void Update(){Vector3 te = gameObject.transform.position; // 獲取游戲對象的位置坐標te.y += 5*Time.deltaTime; //沿y軸每秒上升5個單位gameObject.transform.position = te; //設置游戲對象的位置坐標 }3.訪問游戲對象組件(Component)
組件屬于游戲對象,是游戲的屬性,變量是在腳本中體現的,常用的組件可以通過簡單的成員變量取得,所有的腳本都是組件。
?
| 組件名稱 | 變量名稱 | 組件名稱 | 變量名稱 |
| Transform | transform | Rigidbody | rigidbody |
| Renderer | renderer | Camera | camera |
| Light | light | Animation | animation |
| Collider | collider | ? | ? |
在Unity 腳本中,附加到游戲對象上的組件可以通過GetComponent方法獲得。
transform.Translate(1,0,0); //沿x軸移動一個單位,變量訪問 GetComponent<Transform>().Translate(1,0,0) //沿x軸移動一個單位,組件訪問也可以通過GetComponent方法獲取其他的腳本,比如有一個HelloWorld的腳本,里面有一個sayHello方法,HelloWorld腳本要與調用它的腳本附加在同一游戲對象上。
HelloWorld helloWorld = GetComponent<HelloWorld>(); //獲取“HelloWorld”腳本組件 helloWorld.sayHello(); //執行sayhello方法注意:C#中只有public類型的變量和方法才能在所有其他類中使用,private類型的變量和方法只能在自身類中使用,protected類型的變量和方法只能在子類和同命名空間下的類中使用。
4.訪問其他游戲對象
(1)通過屬性查看器指定參數。
(2)確定對象的層次關系,游戲對象在游戲組成對象列表中存在父子關系,在代碼中可以通過獲取Transform組件來找到子對象或父對象。
transform.Find("hand").Translate(0,0,1) //找到“hand”子對象 transform.parent.Translate(0,0,1) //找到父對象 transform.Find("hand").GetComponent<Test>().doSomething(); //找到子對象“hand”,同時執行“Test”腳本中的doSomething方法 transform.Find("hand").GetComponent<Rigidbody>()AddForce(0,0,2)//加一個沿z軸的大小為2的力(3)通過名字或標簽獲取游戲對象
FindWithTag方法獲取指定標簽的游戲對象,Find方法獲取指定名字的游戲對象。
GameObject name = GameObject.Find("somename"); //獲取名稱為“somename”的游戲對象 name.transform.Translate(0,0,1); name.GetComponent<Test>().doSomething(); //執行Test腳本中的doSomething方法 GameObject tag = GameObject.FindWithTag("sometag"); //獲取標簽為“sometag”的游戲對象 tag.GetComponent<Test>().doSomething();(4)通過傳遞參數獲取游戲對象
一些事件回調方法的參數中包含了特殊的游戲對象或組件信息,例如觸發碰撞事件的Collider組件。在OnTriggerStay方法的參數中有一個碰撞體參數,通過這個參數能得到碰撞的剛體。
void OnTriggerStay(Collider other){ //重寫OnTriggerStay方法if(other.GetComponent<Rigidbody>()){ //如果該游戲對象上有剛體組件other.GetComponent<Rigidbody>().AddForce(0,0,2); //給剛體施加一個力} }(5)通過組件名稱獲取游戲對象
Unity腳本中可以通過FindObjectsOfType方法和FindObjectOfType方法來找到掛載特定類型組件的游戲對象。
Test test = FindObjectOfType<Test>(); //理解為Test代表掛載Test組件的游戲對象的類 Debug.Log(test.gameObject.name); //類比this.gameObject,this理解為當前腳本組件 Test[] tests = FindObjectsOfType<Test>(); foreach (Test re in tests){Debug.Log(te.gameObject.name); }注:關于GameObject與gameObject的理解,GameObject是一個類,是一個容器,可實例化為游戲對象,包含不同組件;gameObject獲得當前腳本所掛載的對象,是一個實例化的結果,上例中test.gameObject可類比此意。gameObject是組件附加的游戲物體(不是組件,是MonoBehaviour類中可繼承的成員變量),一個組件總是被附加到一個游戲物體。
5.向量
Vector2類表示二維向量,Vector3表示三維向量。向量初始化:
public Vector3 position1 = new Vector3(); public Vector3 position2 = new Vector3(1,1,2); void Start(){position1.x = 1;position1.y = 1;position1.z = 2; }Vector3類中定義了很多常量,對應特殊的Vector3值。
| 常量 | 值 | 常量 | 值 |
| Vector3.zero | Vector(0,0,0) | Vector3.one | Vector(1,1,1) |
| Vector3.forword | Vector(0,0,1) | Vector3.up | Vector(0,1,0) |
| Vector3.right | Vector(1,0,0) | ? | ? |
Vector3求兩點之間的距離:
public Transform ren; //如果聲明的是一個組件變量,需要在屬性查看器中拖拽游戲對象到變量處并確定它的值 void Update(){if(Vector3.Distance(ren.position,transform.positon)<10){Debug.Log(ren.position);} }6.靜態成員變量
在C#腳本中可以通過static關鍵字來創建全局變量,這樣就可以在不同腳本間調用這個變量。
public static int test;如果想從另外一個腳本中調用變量,可以通過“腳本名.變量名”的方法來調用。
Test.test = 1; //為Test腳本中的“test”變量賦值未完待續
總結
以上是生活随笔為你收集整理的Unity(一)Unity脚本程序开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RANSAC算法的简单理解
- 下一篇: win32程序调试