Unity快手上手【熟悉unity編輯器,C#指令碼控制元件一些屬性之類的】

2023-04-13 12:00:52

Unity學習參考檔案和開發工具

☺ unity的官網檔案:https://docs.unity3d.com/cn/current/Manual/ScriptingSection.html

■ 學習方式:

首先了解unity相關概述,快速認識unity編輯器,然後抓住重點的學:遊戲物件、元件|C#指令碼、預製體、UI

學習過程你會發現,其實Unity中主要是用c#進行開發。

因為在這個過程中,無非就是,對遊戲物件通過掛載的C#指令碼,修改一下元件的一些屬性,控制一下啟用之類的操作。到了UGUI,同樣,也是通過掛載的C#指令碼,監聽到事件發生後,呼叫一下C#指令碼定義的方法處理一下事件。

■ 開發工具:

unity、visual studio



1、Unity 概述

(1) 什麼是Unity

Unity是一套具有完善體系與編輯器的跨平臺遊戲開發工具,也可以稱之為遊戲引擎遊戲引擎是指一些編寫好的可重複利用的程式碼與開發遊戲所用的各功能編輯器Unity目前已超過50%的遊戲引擎市場佔有率。

遊戲引擎=可複用程式碼+各種開發工具


(2) Unity引擎優勢

1.基於C#程式設計,擁有易上手、高安全性的特性

2.獨特的面向元件遊戲開發思想讓遊戲開發更加簡單易複用

3.擁有十分成熟的所見即所得開發編輯器

4.擁有良好生態圈,商城中包含大量成熟的功能指令碼與資源

5.強大的跨平臺特性,可以製作PC、主機、手機、AR、VR等多平臺遊戲


2、Unity Hub

管理Unity專案,當電腦中有多個unity不同版本的專案的時候,管理就比較麻煩,可以通過unity hub 對各個不同的unity hub專案管理。



3、認識unity編輯器


(1) unity恢復預設視窗: Windows-> Layouts-> Default


(2) 專案設定

  • 包括:物理、聲音、質量、編輯器設定等等


(3) 全域性設定

  • 編輯器的常用設定


  • 擴充套件工具,設定一下指令碼使用visual studio 開啟


(4) unity選單欄介紹

■ 檔案 File:檔案的常規操作[專案/場景建立、儲存等,還有打包專案]

■ 編輯 Edit:複製、剪下、貼上等操作

■ 資源 Assets:建立[指令碼、場景、動畫等等]、匯入匯出等等

■ 遊戲物件 GameObject:會在遊戲場景中真正顯示出來

■ 元件 Component:非常重要,因為unity是面向元件的

  • 元件和遊戲物件是不可分隔的關係,一個遊戲物件身上可以掛多個元件


■ 2d 和 3d 場景的切換:

  • 點一下2D,就變成了3D場景


(5) unity 專案的執行,是執行的是整個場景,而非單個的遊戲物件

  • 執行的單位是場景!



4、對遊戲物件的常見操作

(0) transform 屬性相關的操作的工具列


(1) 拉伸

  • 重置為000


(2) 隱藏或顯示圖層中的遊戲物件


(3) 看到遊戲物件的網格形狀

  • 為了方便觀察,一般選擇 Shaded Wireframe


(4) 選擇遊戲物件:直接滑鼠點選一下即可


(5) 右鍵-眼睛環繞


(6) 手的模式下,結合滑鼠滾輪,可以進行拖拽,調遠調近觀察

  • 進入手的模式,快捷方式,直接按住滑鼠滾輪

  • 和右鍵-眼睛環繞一樣,都是為了更好地全面觀察遊戲物件


(7) 父子游戲物件,父遊戲物件的座標改變會一起改變子游戲物件的座標

  • 一個遊戲物件,建立後的預設座標位置 position,預設是相對於世界座標的位置,簡稱為世界座標位置
  • 如果一個遊戲物件,變成了另外一個遊戲物件的子游戲物件,那麼它的座標就是相對位置-【相對於父遊戲物件的位置】,簡稱相對位置

  • 最外層的遊戲物件


  • 對於父子游戲物件的座標軸位置,父座標軸位置預設在父子游戲物件的中間:

  • 可以設定一下為軸心,父座標位置即可回到父遊戲物件身上


  • 座標軸,全域性是針對世界座標


(8) unity 打包操作

  • 在unity 中將圖片、模型檔案[字尾是.fbx]等素材進行打包

  • 打包完的檔案型別是 Unity package file


(9) 標籤和圖層

  • 標籤:一般是咱自己用於在程式碼中,判斷遊戲物件是否是咱想要的遊戲物件
  • 圖層:是unity做的一種歸類劃分,歸類之後,可以給攝像機等做過濾顯示;比如攝像機對於這個圖層的是不顯示的,還有對於碰撞,這個圖層可以不去碰撞等等。



5、元件

(1) 什麼是元件

元件就是功能,需要給遊戲物件新增什麼功能就只需給它新增上元件。

在Unity中,遊戲物體是不具備任何功能的,如果想要為其新增功能,那麼就需要為它新增該功能的元件,而每一個元件其實就是一個引擎內部的元件指令碼或是由自己編寫的元件指令碼 。也就是說,一個遊戲物體(GameObject)會包含多個元件(Component),每一個元件又是一個元件指令碼。

  • 比如:給遊戲物件新增上重力元件,該遊戲物件就會往下掉。
  • 又比如:transform 也是一個元件。
  • 又比如:燈光之所以是燈光,那是因為它比別人多了一個燈光的元件。遊戲物件其實都是預設自帶了一些元件,比如立方體自帶上了立方體的元件,球自帶上了球的元件。
  • 一個遊戲物件(圖層外層)對應一個指令碼,當需要的功能[元件]不存在的時候,需要自己手動編寫指令碼!

(2) 手動編寫C#指令碼

  • 在專案中手動新增上C#指令碼

  • 新增上指令碼

每個遊戲物件之所以表現形式不同,是因為繫結到他們身上的元件指令碼不同!


(3) 元件的生命週期

  • 從 Awake 到 OnDestroy:
  • Awake 之後就是啟用OnEnale,然後是開始Start
  • 改變:按幀改變Update-LateUpdate,按固定時間頻率改變FixedUpdate
  • 取消啟用OnDisable:和啟用OnEnable是一對
  • 最後如果刪除了元件,則會執行銷燬OnDestroy

▪ 啟用OnEnale和取消啟用OnDisable:


■ 指令碼的生命週期的執行順序

  • 如果有多個指令碼,test1.cs、test2.cs、test3.cs

  • 指令碼的執行順序是:會想把test1.cs、test2.cs、test3.cs 的所有Awake方法執行完[如果有手動寫Awake方法的情況!],接著是從test1.cs到test2.cs最後到test3.cs 執行下一個生命週期-啟用OnEanale[如果有手動寫OnEanale方法的情況!],然後又是從從test1.cs到test2.cs最後到test3.cs 執行下一個生命週期Start......

    ▷ 現階段的生命週期從Awake開始,每次都是從專案中第一個指令碼到最後一個指令碼,執行。

    ▷ 接著進入下一個生命週期,所有的指令碼也是從專案中第一個指令碼到最後一個指令碼,執行當前的生命週期!

  • 如果想要更改專案中指令碼之間的生命週期的執行順序,可以在編輯->專案設定->指令碼執行順序設定一下

    • 順序新增錯了,直接拖拽更改即可



6、預製體和變體

(1) 什麼事預製體

其實,就是把場景中做好的東西[獨立的遊戲物件]封裝成預製體[生成一個檔案]。

  • 預製體的字尾是 .prefab

(2) 預製體好處:


(3) 預製體和場景的遊戲物件的區別:

① 直接修改預製體,則場景中的遊戲物件會同步發生改變。但是如果只直接修改了場景中的遊戲物件,預製體不變。

  • 包括了直接在預製體身上掛著元件,場景中的遊戲物件會同步掛載。

② 想要實現修改場景中的遊戲物件,預製體同步發生改變:

  • 選擇「開啟」模式

③ 場景中的遊戲物件,掛載了元件,想要同步掛載到預製體身上:

  • 單個掛載:

  • 批次掛載:override批次應用到預製體


(4) 通過場景中的遊戲物件,快速選中預製體


(5) 變體

預製件變體:對當前的遊戲物件,生成一個變體,變體會依賴舊的預製體。
當舊的預製體發生改變,變體也會跟著一起改變。但是變體改變,預製體不會發生改變。



7、動態修改遊戲物件的屬性

(1) 遊戲物件和所掛載的C#指令碼之間的關係:


(2) C#指令碼的類中新增了一個屬性物件,將該屬性物件和Unity的遊戲物件進行關聯


(3) 通過預製體,在場景中範例化出遊戲物件

  • 結果1:


  • 結果2:


■ EmptyTest.cs 內容如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/**
 * EmptyTest 類是繫結在場景SamepleScene下的遊戲物件Empty身上
 * 補充,課外小知識,C#的 Debug.Log 方法,其實就是相當於 前端專案的 console.log 方法,也就是開發過程中用於列印紀錄檔的
 */
public class EmptyTest : MonoBehaviour
{
    public GameObject Cube;
    //預製體
    public GameObject Prefab;


    // Start is called before the first frame update
    void Start()
    {
        //當前類的屬性gameObejct就對應了unity當前指令碼所繫結的遊戲物件
        GameObject gameObject = this.gameObject;
        Debug.Log("gameObject: " + gameObject);
        Debug.Log("gameObject的名稱:" + gameObject.name);
        Debug.Log("gameObject的標籤:" + gameObject.tag);
        Debug.Log("gameObject的圖層:" + gameObject.layer);
        Debug.Log("Empty下的Cude的name:" + Cube.name);//子物體的名稱
        Debug.Log("Empty下的Cude的繼承的父類別的啟用狀態:" + Cube.activeInHierarchy);//子物體繼承關係的啟用狀態【看所繼承的父物體的啟用狀態】
        Debug.Log("Empty下的Cude的自身的啟用狀態:" + Cube.activeSelf);//子物體自身的啟用狀態
        Debug.Log("Empty的transform:" + transform.position);//位置
        Debug.Log("Empty下的Cude的transform:" + transform.Find(Cube.name).position);//位置
        //給遊戲物件新增上元件,通過拿到遊戲物件.AddComponent方法
        gameObject.AddComponent<MeshFilter>();
        Cube.AddComponent<AudioSource>();
        //獲取其他元件【這個其他元件,其實就是排除掉Transform這個必須的元件後的其他元件】
        Debug.Log("Empty獲取其他元件:" + GetComponent<BoxCollider>());
        Debug.Log("Cube獲取其他元件:" + Cube.GetComponent<BoxCollider>());
        //從子物體身上獲取元件
        // GetComponentInChildren<BoxCollider>();
        //從父物體身上獲取元件
        //GetComponentInParent<BoxCollider>();

        //全域性查詢--細節,就是首字母大寫了,小寫的是屬性
        //所謂的全域性查詢,其實就是對當前的C#指令碼所處的場景SamepleScene下進行全域性查詢 
        GameObject testGameObject = GameObject.Find("TestGameObject");
        //還可以通過標籤名獲取到遊戲物件
        GameObject testGameObejct2 = GameObject.FindWithTag("enemy");
        Debug.Log("testGameObject:" + testGameObject);
        Debug.Log("testGameObject2:" + testGameObejct2);
        //還可以設定遊戲物件是否啟用
        testGameObject.SetActive(false);//取消啟用

        //需求:通過預製體,在場景中範例化出遊戲物件
        //預製體的型別也是GameObject
        // Instantiate(Prefab);
        // 範例化出遊戲物件,並且是當前掛載了C#指令碼的遊戲物件的子物體
        GameObject capsule = Instantiate(Prefab, transform);
        // 銷燬遊戲物件
        Destroy(capsule);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

8、Application 讀寫檔案需要用到的類

(1) Application 讀寫檔案


(2) Application 還有控制許可權的作用,比如控制遊戲後臺執行,開啟連結,退出遊戲


9、遊戲場景

■ 核心類-場景管理類 SceneManager:和場景的建立、場景切換|載入、場景的獲取、場景數量、場景解除安裝有關


■ 關於場景的常用屬性:場景名稱、場景是否已載入、場景路徑、場景索引、場景中獨立的遊戲物件


■ 非同步載入場景並獲取進度

  • 通過協程的方式[協程,其實就是協助型別的多執行緒] StartCoroutine(任務);
  • 在Update中獲取到進度,因為Update是輸出每一幀的改變


▷ 通過計時器控制場景跳轉:



10、transform

(1) 位置、旋轉、縮放、向量


(2) transform 其他關係


(2) transform 父子關係

遊戲物件的父子級關係,其實是通過transform 維持的


......



11、Unity GUI(簡稱UGUI)

GUI:Graphical User Interface 圖形化使用者介面或圖形使用者介面。

  • GUI,是平面的,在2d下操作

  • UI 常用的控制元件

  • UI 最基本的是 畫布Canvas ,相當於螢幕。

    • 最基本的UI就是畫布Canvas,其他UI控制元件-Text、Image、Button等等都是放在畫布上面的,作為Canvas的子控制元件。
  • UI 另外最基本的是 事件系統EventSystem ,其實就是把很多常見的事件,比如點選事件,封裝起來。


(1) Canvas,相當於螢幕

■ Canvas元件的渲染模式一般預設是螢幕空間-覆蓋

  • 攝像機是拍攝到真正的遊戲畫面,3d畫面。攝像機拍攝到畫面會先被渲染出來。
  • UI 覆蓋:會覆蓋到攝像機拍攝的畫面之上。所以,UI 永遠可以在最上層顯示。
  • 這也符合大多數真實的遊戲情況,UI 顯示在遊戲畫面之上。比如,開啟一個揹包介面或者人物屬性介面,不可能被遊戲場景的物體,比如被樹木遮蓋住。


■ Canvas元件的縮放模式一般是選擇按螢幕解析度縮放

  • Canvas 做了適配,要真正生效,Canvas 下的第一層子控制元件也是要做適配。

  • 第一層的子控制元件做適配:

    • 錨點是設定在父物體身上的。

    • 控制元件錨點的作用:控制元件永遠會和錨點保持一定的距離。


(2) 事件繫結:以Button這個UI為例

① 在畫布Canvas 下新增UI-Button,在專案下建立一個C#指令碼,然後把C#指令碼掛載到Button身上

② 接著在C# 方法,寫一個點選事件發生時的處理方法 BtnClick()

③ 最後在Button 元件下面的On Click() 新增上C# 指令碼中,點選事件發生時的處理方法 BtnClick()


(3) 管理UI 元件-面板Panel[佈局、對齊、適配的軸點位置等]


(4) 關於GUI常見的UI【text、button、slider等等】 的一些操作詳情,可以參考文章:




如果本文對你有幫助的話記得給一樂點個贊哦,感謝!