腳本生命周期:
- Awake:腳本喚醒,此方法相當於類的初始化方法,只執行一次
- Start:只執行一次
- Update:正常更新,用於更新邏輯,每幀調用一次
- LateUpdate:推遲更新:在Update之后執行,每幀調用一次
- OnGUI:繪制界面,每幀調用
- OnDestroy:當前腳本銷毀時調用
- FixedUpdate:固定更新:根據固定時間來更新,常用於模型移動等操作,在Edit->Project Setting->Time菜單可更改更新頻率。這個執行先后,根據頻率有關,默認在Update之前
腳本創建對象:GameObject.CreatePrimitive(類型),類型是PrimitiveType.
獲取對象:
- 通過名稱:GameObject.Find("路徑/對象名"),
- 通過標簽:GameObject.FindWithTag("標簽"),
- 通過標簽取多個:GameObject.FindObjectsWithTag("標簽");得到一個數組
給對象添加組件(腳本):
- 添加:游戲實例對象.addComponent();
- 取得:游戲實例對象.getComponent();
- 刪除:由於組件自身沒有刪除方法,要刪除需要父類執行Object.Destory(游戲對象|游戲組件),
克隆游戲對象:
Instantiate("要克隆對象',位置,轉動角度),
銷毀對象:
Destroy("對象",延遲幾秒); 也可以刪除組件如:Destroy(對象.getComponent("組件名"));刪除后引發OnDestroy()事件
控制游戲對象變換:Transform
任何一個游戲對象在創建時都會附帶一個Transform(變換)組件,而且無法刪除。該組件常用方法有:
位置:Transform.Position 值:Vector3
旋轉:Transform.Rotation
X軸轉:Vector3.right Y軸轉:Vector3.up Z軸轉:vector.forward
繞某點轉:RotateAround(點位置Vector3類型,角度:也是X,Y,Z三個方向);
縮放:Transform.localScale, 值:Vector3(X,Y,Z), 三個方向系數
JS和C#方法互調:
取得組件:cs = obj.GetComponent("組件名");,cs.方法();
工具類:時間,等待,隨機,數學,四元數
時間:Time,主要用來獲取當前的系統時間
- Time.time 游戲運行總時間
- Time.delaTime 獲得Update()方法完成上幀所用時間
- Time.fixedTime FixedUpdate()方法固定消耗時間總和
- Time.fixedDelaTime 固定更新上一幀所消耗的時間
等待:WaitForSeconds(秒數),使游戲主線程進入等待狀態,返回值為IEnumerator類型,
調用方式
yield return new WaitForSeconds(時間)
隨機數:Random.Range(最小值,最大值);
數學:Mathf
光源:點光源PointLight,聚光燈Spotlight,平行光DirectionalLight
攝像機:
放射觀察,垂直觀察,代碼中設置這兩種觀察方式:取得攝象機,然后攝像機.isOrthoGraphic = ture| false,對應垂直與放射,
切換攝像機:攝像機.action = true|false,開|關
物理引擎:剛體,力,碰撞與休眼,磁撞器,角色控制器,射線,關節,粒子,
剛體:Rigidbody
力:
- 普通力,需要設定方向與大小, obj.rigidbody.AddForce(1000,0,1000)添加一個X,Y兩軸的1000力,
- 目標位置力:設定目標點的位置和大小。obj.rigidbody.AddForceAtPosition(力大小,目標點坐標,力模式ForceMode.模式)
碰撞與休眠:一旦剛體移動,就可以在系統方法中監聽剛體的碰撞事件,有三種事件處理函數。
- 進入:OnCollisionEnter(Collision cl){}
- 碰撞中:OnCollisionStay(Collision cl){}
- 結束:OnCollisionExit(Collision cl){}
- 三個事件的參數可以通過cl.gameObject得到當前碰撞的游戲對象
體眠:就是讓物體進入靜態狀態,比如我們可以在結束事件里寫上l.gameObject.rigidbody.Sleep();
碰撞器:當剛體添加碰撞器后,相互會反彈,反彈力度由物理材質決定的,添加碰撞器,選擇游戲對象->Component->Physics
- 盒子碰撞器(BoxCollider): 適用於立方體對象之間
- 球體碰撞器(SphereCollider): 適用於球體對象之間
- 膠囊碰撞器(CapsuleCollider): 適用於膠囊體對象之間
- 網格碰撞器(MeshCollider): 由自定義模型的自身網格決定
- 車輪碰撞器(WheelCollider): 適用於車輪與地面或其它對象之間
物理材質
物理材質可設定物體的表面材質,不同的材質可影響碰撞后的物理效果,Unity提供了物理材質包,
Import Package->Physic Materials,有5種常用,彈性(Bouncy),冰(Ice),金屬(Metal),橡膠(Rubber),木頭(Wood),
角色控制器:Unity已經提供了角色控制器的包,其中有第一人稱與第三人稱,只需要導入即可Import Package->Character Controller,導入后呵以找到First Person Controller和3rd Person Controller兩個,直接拖動到游戲場景中,就可以看到相關效果,另外,也可以給別的游戲對象添加控制組件
控制組件:當我們導入角色控制器后,如果想要給別的游戲對象添加角色控制器,如何添加,只需要確定你導入角色控制器,然后選定你的游戲對象,Component->Physics->Character Controller即可,添加后需要在腳本中添加相應的處理,取得組件GetComponent<CharacterController>(),常用組件方法:移動有SimpleMove()和Move(),
射線:從某個點向一個方向發射的一條無終點的錢,一旦與其它對象碰撞,將停止發射。
//創建一個射線 Ray ray = new Ray(Vector3.zero,transform.position); //創建一個從攝像機到鼠標之間的射線 Ray ray= Camera.main.ScreenPointToRay(Imput.mousePosition); //計算射線起點與終點 RaycastHit hit; physics.RayCast(ray,out hit,100); //判斷是否打中對象 if(physics.Raycast(ray,out hit)) { //打中 }
關節,粒子,布料
路徑渲染:屬於特效渲染組件,用於跟隨運動中的游戲對象。添加:Component->Effects->Trail Renderer,
鍵盤事件:
// Update is called once per frame void Update () { if (Input.GetKeyDown (KeyCode.A)) { //按下A鍵 } if (Input.GetKeyUp (KeyCode.A)) { //抬起A鍵 } //長按 if (Input.GetKey (KeyCode.A)) { //記錄按下的幀數 Keyframe++; } if (Input.anyKeyDown) { //任意鍵被按下 } if (Input.anyKey) { //任意鍵被長按 Keyframe++; } //鼠標事件,0左鍵,1右鍵,2中鍵 if (Input.GetMouseButtonDown(0)) { //鼠標當前位置 Input.mousePosition; } if (Input.GetMouseButtonUp(0)) { } //長按 if (Input.GetMouseButton(0)) { //任意鍵被長按 MouseFrame++; } }
自定義按鈕:Edit->Project Settings->Input,對應的自定義按鈕事件:Input.GetButtonDown(),Input.GetButton(),InputGetButtonUp()
按鈕軸:Input.getAxis();
持久化數據-PlayerPrefs類:
//保存整型 PlayerPrefs.SetInt("test",100); PlayerPrefs.SetFloat("test",100.00f); PlayerPrefs.SetString("test","afaf"); //讀取整型,參數,數據名稱,默認值, int i= PlayerPrefs.GetInt("test",112); if(PlayerPrefs.HasKey("test")){ //刪除所有 PlayerPrefs.DeleteAll(); //刪除某項 PlayerPrefs.DeleteKey("test"); }
自定義文件-FileInfo,StreamWriter,StreamReader:
應用程序類:Application
//切換新場景 Application.loadedLevel("場景ID"); //截屏 Application.CaptureScreenshot("name.png"); //打開URL Application.OpenURL("http://www.baidu.com"); //退出應用 Application.Quit(); //當前場景名 Application.loadedLevelName;