目錄
Update()、FixedUpdate()和LateUpdate()的區別
操作知識
角色移動(方法一)
gameObject.transform.Translate(Time.deltaTime * Speed, 0, 0);
//右移,其中Speed爲float類型變量,後兩個參數分別是豎直方向和圖層前後方向
GameObject.Find("player").transform.Translate(Time.deltaTime * Speed, 0, 0);
//尋找名字爲"Player"的對象,並讓它移動
//但是當對象過多時,會耗時很多
//此方法是讓物體每次都向目的方向瞬間平移一定距離,無視碰撞
//所以在撞到邊緣之後會出現不停抖動的情況,不推薦使用
角色移動(方法二)
transform.GetComponent<Rigidbody2D>().AddForce(Vector2.right*100);
//瞬間給當前物體施加一個水平向右的力使其速度爲100
//此方法適用於普通的物理物體,但是由於速度會疊加,沒有最大速度
//且方向控制很麻煩,也不推薦使用
角色移動(方法三)
Rigidbody2D Player;
float Speed = 600f;
void Start() {
Player = transform.GetComponent<Rigidbody2D>();
}
void Update () {
Player.velocity = new Vector2(Speed, Speed); //分別爲水平方向和豎直方向的速度
}
//這個方法最好,不但速度穩定檢測碰撞而且改變速度方便迅速,推薦移動角色時使用
角色移動(方法四)
Vector2 Speed = new Vector2(1, 0); //設置速度方向和大小
public Rigidbody2D rigidbody;
void FixedUpdate() {
rigidbody.MovePosition(rigidbody.position + speed * Time.deltaTime);
}
//每次都是瞬間移動過去再判斷是否有碰撞器的,當速度過大時可能會穿過其它碰撞器
方向鍵操控角色
//寫在Update函數裏
float BallX = Input.GetAxis("Horizontal"); //改爲“Vertical”即豎直方向
if (BallX ==1) {
//向右移動的代碼
}
if (BallX ==-1) {
//向左移動的代碼
}
//但是我發現它最後有一點延遲,原因不明,就不喜歡用
更改角色Sprite
//初始化(可以寫在Start函數裏)
SpriteRenderer Player;
public Sprite Picture; //Inspector界面拖拽Sprite賦值
Player = this.GetComponent<SpriteRenderer>();
//更改Sprite
Player.sprite = Picture;
獲取對象速度
Rigidbody2D Player;
Player = GetComponent<Rigidbody2D>(); //獲取當前的物理物體對象
float Speed = Player.velocity.magnitude;
獲取對象位置
Vector3 Pos = transform.position;
//把對象位置賦值給Pos(包含圖層一共三個數據)
//可用Pos.x Pos.y Pos.z調用
//或者這樣寫:
Vector3 Pos = gameObject.transform.position;
複製對象
Instantiate(Transform, new Vector2(0,0), Quaternion.identity);
//Transform處寫該類型的變量名一般可以public定義,然後拖拽賦值
//第二個參數是新對象的位置
銷燬對象
Player.gameObject.SetActive(false);
//Player爲對象名字
鼠標(手指)對對象的操作
void OnGUI() {
if (Event.current.type == EventType.MouseDown) {
//這裏寫鼠標按下(屏幕觸摸按下)對象的代碼
}
if (Event.current.type == EventType.MouseDrag) {
//這裏寫鼠標拖動(屏幕觸摸滑動)對象的代碼
}
if (Event.current.type == EventType.MouseUp) {
//這裏寫鼠標擡起(屏幕觸摸擡起)對象的代碼
}
}
獲取鼠標光標位置
Pos = Event.current.mousePosition;
//獲取當前光標位置,其中橫座標和縱座標分別是Pos.x和Pos.y,原點在左上角,單位爲1像素
隱藏鼠標光標
Cursor.visible = false; //隱藏
Cursor.visible = true; //顯示
播放音頻
AudioSource.PlayClipAtPoint(AudioClip, transform.localPosition);
//AudioClip就是音頻變量,賦值後就可以用了
Sleep(休眠)
Thread.Sleep(100);
//在文件開頭要加上導入語句:
using System.Threading;
讀寫存檔變量
PlayerPrefs.SetInt("讀取對象的名字", a); //把a的值寫入存檔裏
int a = PlayerPrefs.GetInt("讀取對象的名字"); //讀取存檔值,賦值給a
刪除變量存檔
PlayerPrefs.DeleteAll(); //刪除所有存檔
PlayerPrefs.DeleteKey("這裏是刪除對象的名字"); //刪除指定key對應的信息
按Esc退出遊戲
void Update() {
if (Input.GetKeyDown(KeyCode.Escape)) {
Application.Quit();
}
}
加載其它場景(Sence)
SceneManager.LoadScene("場景名");
響應鍵盤按鍵函數
if (Input.GetKey(KeyCode.LeftArrow)) { //按左向鍵
//這裏寫事件代碼
}
//KeyCode裏包含了基本所有按鍵
角色發生碰撞(接觸)事件函數
void OnCollisionEnter2D(Collision2D c) { //重載,可以沒有參數
if (c.gameObject.name == "碰撞對象的名字") {
//這裏寫操作代碼
}
}
鼠標相關函數
//針對腳本對應的對象
void OnMouseUp() { } //鼠標左鍵擡起(屏幕觸摸擡起)
void OnMouseDown() { } //鼠標左鍵按下(屏幕觸摸按下)
void OnMouseEnter() { } //鼠標光標指向
void OnMouseExit() { } //鼠標光標移開
觸發器常用函數
void OnTriggerStay() { } //player持續Trigger觸發事件
void OnTriggerEnter() { } //player觸碰Trigger觸發事件
void OnTriggerExit() { } //player離開Trigger觸發事件
顯示圖片
void OnGUI() {
GUI.DrawTexture(new Rect(Posx,Posy,Weight,Height), Texture);
//Texture爲圖片類型,位置爲(Posx,Posy),尺寸爲Weight * Height (像素)
}
顯示文字
void OnGUI() {
GUIStyle fontStyle = new GUIStyle(); //設置字體變量
fontStyle.normal.textColor = new Color(R,G,B); //R,G,B都在(0,1)之間
fontStyle.fontSize = 100; //字體大小
GUI.Label(new Rect(Posx,Posy,Weight,Height), "hello" , fontStyle); //顯示文本
}
代碼知識
求絕對值
int ans = Math.Abs(num); //求整數num的絕對值,賦值給ans
float ans = Mathf.Abs(num); //求浮點數num的絕對值,賦值給ans
求開方
float ans = Mathf.Sqrt(a);
//求a的開方,並賦值給ans
定義數組
int[] a = new int[4]; //定義長度爲4的一維數組a
int[,] a = new int[4, 4]; //定義4*4的二維數組a
int[] a=new int[5]{1,2,3,4,5}; //定義並初始化一維數組a
int[] a={1,2,3,4,5}; //定義並初始化一維數組a
定義二維向量座標
Vector2 a = new Vector2(10, 10);
//定義a,並賦值
隊列使用
//需要在開頭加:
using System.Collections.Generic;
//隊列名爲q,類型可改
Queue<int> q = new Queue<int>();
//進入隊列
q.Enqueue(a); //變量a的值進入隊列
//統計隊列長度
int size = q.Count; //把長度賦值給size;
//取出元素
int a = q.Peek(); //取出隊尾元素,賦值給a
int a = q.Dequeue(); //取出隊尾元素,賦值給a,並刪除隊尾元素
TrimExcess(); //重新設置隊列容量,刪除Dequeue後的元素
Clear(); //清空隊列
調試打印輸出
Debug.log(a); //輸出a的值(只能有一個參數)
print("哈哈哈"+a); //可以輸出變量字符串疊加,中間用“+”連接
讀寫其他腳本的變量
//假設腳本一的文件名爲Script1,先在第一個腳本將需要擴展的變量定義爲public,如
public static int a = 10;
//在第二個腳本中可以用Script1.a來使用並更改這個變量的值,如
int ans = Script.a;
//修改同理,如
Script.a=20;
使用其他腳本的函數
//假設被調用函數的腳本名爲Script1,且被調用的函數爲:
public static void Sum() {
//函數內容
}
//那麼在其他腳本使用該函數時寫作:
Script1.Sum();
技術探討
方括號的幾種用法
/*變量序列化*/
[SerializeField]
int a; //這裏,a只需在Inspector窗口中賦值一次,以後打開項目i都會有初始值了,這就叫序列化
//對於加了public的變量就不需要了,會自動序列化的,而對於private變量則需要加上才能序列化
[NonSerialized]
public int a; //這裏,a不會被序列化,Inspector窗口不會顯示該變量
[HideInInspector]
public int a; //這裏,a會被序列化,但是Inspector窗口不會顯示,顧名思義只是被隱藏起來了
/*使Component菜單下出現自定義的類*/
[AddComponentMenu("XXX/XXX/XXX")] //其中的“/”用來分割父類和子類
/*運行前執行腳本*/
[ExecuteInEditMode]
//這裏寫類
執行情況:
1.當場景中的某個物體發生變化時調用Update函數
2.當GameView接收到一個Event時調用ONGUI函數
3.當SceneVidw或者GameView重繪時調用OnRenderObject和其他的渲染回調函數
4.當加載時調用Awake函數
5.當第一次激活時調用Start函數
6.當該MonoBehavior在編輯器中被賦於給GameObject的時候調用Awake、Start函數
7.當Play按鈕被按下游戲開始後調用Awake、Start函數
8.當Play按鈕停止後調用Awake、Start函數
9.當在編輯器中打開包含有該MonoBehavior的場景的時候調用Awake、Start函數
/*在添加腳本的時候會自動添加寫上去的屬性*/
[RequireComponent(typeof(ClassName))] //ClassName即爲屬性名,比如Rigidbody
Update()、FixedUpdate()和LateUpdate()的區別
Update() 每一幀的時間不固定,受當前渲染的物體影響
FixedUpdate() 固定的時間間隔調用,故物理屬性的更新操作應它,這樣表現效果會更平滑逼真。
其時間間隔可以在項目設置中更改:Edit->Project Settings...->Time->Fixed Timestep
LateUpdate() 在所有Update函數調用後被調用,跟隨物體的攝相機用它效果最好,可防止瞬移和抖動
Awake()和Start()的區別
Awake()先於Start()執行。
使用方法:
在Awake()中獲取遊戲對象或者腳本實例的信息
在Start()中進行一些獲取之後的初始化設置
最近依次更新時間:2019.09.15