Unity 2D遊戲基本知識筆記

目錄

操作知識

角色移動(方法一)

角色移動(方法二)

角色移動(方法三)

角色移動(方法四)

方向鍵操控角色

更改角色Sprite

獲取對象速度

獲取對象位置

複製對象

銷燬對象

鼠標(手指)對對象的操作

獲取鼠標光標位置

隱藏鼠標光標

播放音頻

Sleep(休眠)

讀寫存檔變量

刪除變量存檔

按Esc退出遊戲

加載其它場景(Sence)

響應鍵盤按鍵函數

角色發生碰撞(接觸)事件函數

鼠標相關函數

觸發器常用函數

顯示圖片

顯示文字

代碼知識

求絕對值

求開方

定義數組

定義二維向量座標

隊列使用

調試打印輸出

讀寫其他腳本的變量

使用其他腳本的函數

技術探討

方括號的4種用法

Update()、FixedUpdate()和LateUpdate()的區別

Awake()和Start()的區別





操作知識


角色移動(方法一)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章