從零開始的unity2017筆記【基本程式碼用法,追加中..】
零、標頭檔案
using UnityEngine.SceneManagement;(場景切換要用)
using UnityEngine.UI;(對ui物件進行操作時要用)
一、寫在start()前面的
public(公開的) 命名引數時在其前面加m_則在元件上顯示的引數名不會帶m_,會自動首字母大寫,這種方法更能讓命名物件不會衝突,而且更明顯這是命名的物件。(因此推薦在public上命名的引數都加m_)(用public宣告的引數都可以直接把物件拖進腳本里)
protected(受保護的,只有當前類的成員與繼承該類的類才能訪問)
private (完全私有的,只有當前類中的成員能訪問到)
(下面例子都屬常見宣告方式public和protected)
public Transform m_xxx;(一般用來宣告指向Hierarchy裡面的某一物件)
public GameObject m_xxx;(這個和上面的效果一樣...暫時還不知道其區別)
private Vector3 pos;(設定一個pos變數,儲存的是x y z的座標值)
public XXXXXXXX m_?(裡面的XXXXXX是根據你所需什麼物件或者元件或者指令碼的性質型別而定)
public static m_?(加了static的引數就可以被其他指令碼使用這個引數而不用再建立)
聲音方面:
public AudioClip m_yyy;(用來宣告音樂檔案)
protected AudioSource m_audio;(宣告使用聲音源控制元件,下面都以m_audio為例子)
動畫方面:
public Animator anim;(一般都這樣用anim來宣告動畫機)
物理方面:
private CapsuleCollider col;(一般這樣來用col命名去宣告碰撞體屬性,以控制高度,寬度等等)
其他:
void Awake()(這個函式將在start前呼叫)
二、寫在start()裡面的
m_xxx.gameObject.SetActive
m_xxx=transform.Find("xxx").gameObject;
m_xxx.SetActive(false);(隱藏對應物件/可改為顯示對應物件,這種方式應用於用GameObject宣告的物件)
pos = (某物件).transform.position;(用pos儲存當前物件的xyz座標值)
GetComponent<AudioSource>();(要用什麼元件的時候就要用這個函式去獲取)
聲音方面:
m_audio = this.GetComponent<AudioSource>();(將m_audio指向當前物件的音源元件(必須給當前元件加上聲音元件))
m_audio.clip=m_yyy;(指定音效檔案)
m_audio.loop=true;(設定是否迴圈播放該檔案)
動畫方面:
物理方面:
col = GetComponent<CapsuleCollider>();(將col指向當前物件裡面的碰撞體)
其他方面:
InvokeRepeating("函式名", float時間,float時間);【InvokeRepeating()這個函式用於在指定時間間隔週期呼叫一個函式】
三、可以在合適地方用的
SceneManager.LoadScene("xxscene");(場景切換,需要標頭檔案支援)
Application.Quit();(退出遊戲程式,打了包才會生效)
Debug.Log("這裡被成功呼叫");(此程式碼被執行就會在控制檯出現想說的內容,可以是引數值,自己設定的字串等)
printf("xxx");(同上也是在控制檯出現輸出的東西)
Instantiate(要複製的物件, 位置, 方向);(複製物件的函式,複製子彈物件,場景相同物體生成什麼的)
pos呼叫時則是pos.x、pos.y、pos.z來用
this.transform.position = pos;(與此同時也可以這樣來給pos賦新值後再改變當前物件的位置position改為rotation就是改變物件方向)
Destroy(this.gameObject,time);(這個函式用於刪除某物件,time可有可無,有time的時候就是在time時間結束後自動刪除物件,單位是秒)
UnityEngine.Random.Range(2, 5);(這個函式用於產生隨機數,括號裡是隨機數上下限。這裡的可以有的值是2、3、4的整數)
要是我要在當前物件使用當前的指令碼去控制其他物件裡面某個子物件的元件怎麼辦?
那就要:
public transform m_xxx;//指向某個物件
private XXX(某個元件的型別) m_yyy;//宣告那個元件的型別引數
在start()中:
m_yyy=m_xxx.Find("那個物件的子物件名").GetComponent<XXX(那個元件的型別)>();
m_yyy.zzz(那個元件裡面的某些引數值)=進行修改等等操作;
聲音方面:
m_audio.Play();(播放音效,m_audio需要先被指定一個音效clip)
m_audio.PlayOneShot(m_yyy);(第二種播放音效的方法,不用事先給m_audio指定,只播放一次)
動畫方面:
anim.SetBool("death", false);(動畫機中的動畫觸發條件,這裡是bool型,還有int、trigger、float型等,在動畫機處自己設定)
物理方面:
col.height = 2.1f;(這裡設定碰撞體的高度為2.1,同理也可以用width設定寬度)
this.m_xxx.Translate(this.m_xxx.forward * Time.deltaTime * (速度引數), Space.World);(forward是往前移動,time.deltatime是物件重新整理一次的時間,這裡就是說該物件每重新整理一次(可能和重新整理幀有關)就往前移動,移動速度和“速度引數”相關,自己設定,Space.World則應該是表示是在大地圖空間裡面移動,應該還有一種方法是讓他在攝像機位置裡移動)
this.m_xxx.RotateAround(this.m_xxx.position, new Vector3(0, 1, 0), Time.deltaTime * (角度引數));(讓物件旋轉,主要設定角度引數來改變轉動速度和方向,Vector3(x軸, y軸, z軸))
裝置輸入處理:
Input.GetMouseButtonDown(0);(檢測滑鼠按下哪個鍵;0左,1右,2中鍵)
Input.GetButtonDown("jump");(這種方法是在【edit】-【project setting】-【input】裡面設定好各種基本按鍵的檢測方法。比如我在裡面命名一個“jump”按鍵,設定按下空格生效。因此在這裡檢測時檢測這個“jump”就等於檢測了空格space鍵)
Input.GetAxis("Horizontal");(同上,檢測到Horizontal為名的按鍵按下後返回的是在該設定裡面的【axis】裡面的值,一般用來調整移動速度什麼的)
Input.GetKeyDown(KeyCode.Q);(而這種方法是直接檢測你按下鍵盤的哪個按鍵,與上面的有區別,此外在下一次按下這個鍵之前這個輸入只會響應一次)
Input.GetKey(KeyCode.Q);(這種方法也是檢測按下哪個鍵,不過這在你鬆開按鍵前卻是不斷響應這個輸入,也就是說:QQQQQQQQQQQQQQQQQQ.....)
同理上面有down的語句也有對應的up語句,GetKeyUp(),顧名思義是鬆開按鍵的時候觸發
四、一般要寫在update()函式裡的
m_xxx.Translate(0,1,0,Space.self));(表示某物件在y軸上按1的速度移動,而後面的引數“space.self”可有可無,若沒有和設定為space.self則表示為以當前移動物件自身為參照進行移動,若設為space.world則是以世界座標進行參照移動)
m_xxx.Rotate(30, 0, 0,space.self);(表示某物件按x軸以30的速度旋轉,“space.self”同上)
五、一些常用函式
void OnTriggerEnter(Collider other)(檢測本物件的碰撞體是否與other的碰撞體(並且other的碰撞體設定了“is trigger”)相交,相交就函式生效)
2D方面的函式:
void OnCollisionStay2D(Collision2D col)(該指令碼的當前物件和其他碰撞體接觸時生效)
void OnCollisionEnter2D(Collision2D coll)(該指令碼的當前物件與其他碰撞體相交時觸發(暫時不是很理解這個和下面triggerenter的區別和用法))
void OnCollisionExit2D(Collision2D col)(該指令碼的當前物件不和其他碰撞體接觸時生效)
void OnTriggerStay2D(Collider2D coll)(該指令碼的當前物件和其他碰撞體接觸時生效並且當前碰撞體設定了“is trigger”)
void OnTriggerEnter2D(Collider2D coll)(該指令碼的當前物件和其他碰撞體相交時生效並且當前碰撞體設定了“is trigger”)
void OnTriggerExit2D(Collider2D coll)(該指令碼的當前物件不和其他碰撞體接觸時生效並且當前碰撞體設定了“is trigger”)
(2018/8/3作了小修改)