Unity基礎學習(二)

在這里插入圖片描述

二、Mono中的重要內容

在這里插入圖片描述

1、延遲函數

(1)延遲函數定義

延遲執行的函數,可以設定要延遲執行的函數和具體延遲的時間

(2)延遲函數的使用

		#region 1、延遲函數//函數:Invoke(函數名/字符串,延遲時間/秒)//注意點//1.1 延遲函數第一個參數傳入的是函數名字符串//1.2 延遲函數沒有辦法傳入參數 #endregion#region 2、延遲重復執行函數//函數:InvokeRepeating(函數名,第一次執行的延遲時間,之后每次執行的間隔時間)#endregion#region 3、取消延遲函數//3.1 取消該腳本上的所有延遲函數//CancelInvoke()//3.2 指定函數名取消//CancelInvoke(函數名)#endregion#region 4、判斷是否有延遲函數//IsInvoking()#endregion

(3)延遲函數受對象失活銷毀影響

腳本依附對象失活 延遲函數可以繼續執行
腳本依附對象銷毀或腳本刪除 延遲對象無法繼續執行

2、協同程序

(1)Unity是否支持多線程

Unity中支持多線程,不過新開的線程無法訪問Unity場景中對象的內容
Unity中的多線程,即使沒有點擊運行,它也會一直執行,所以要記得關閉
多線程一般用于一些復雜計算,將輸出的結果存在公共變量中,供Unity主程序使用

(2)協同程序

(a)定義

協同程序是假的多線程,不是多線程

(b)作用

將代碼分時分步執行,不卡主線程
可以設置什么時候執行哪個步驟,多久時間執行下一步

(c)主要使用場景

異步加載文件
異步下載文件
場景異步加載
批量創建時防止卡頓

(3)協程的使用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Lesson9 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){//第二步   開啟協程函數Coroutine c1=StartCoroutine(MyFunc(1,"123"));Coroutine c2= StartCoroutine(MyFunc(1, "123"));//第三步   關閉協程//關閉所有StopAllCoroutines();//關閉指定協程StopCoroutine(c1);}IEnumerator MyFunc(int i,string str){//第一步   聲明協程函數//1.1   返回值為IEnumerator類型及其子類//1.2   函數通過yield return 返回值 進行返回//執行第一部分print(i);yield return new WaitForSeconds(5f);//執行第二部分print(str);yield return new WaitForSeconds(5f);//執行第三部分print("123456");//協程內允許寫死循環while (true){print("死循環,等3秒打印");yield return new WaitForSeconds(3f);}}
}

(4)yield return 不同內容的含義

在這里插入圖片描述

(5)協程受對象和組件失活銷毀的影響

協程開啟后
組件和物體銷毀 協程不執行
物體失活協程不執行,組件(腳本)失活協程執行

3、協同程序原理

(1)協程的本質

協程的本質是一個C#的迭代器方法,主要分為 協程函數本體 和 協程調度器 兩個部分

(a)協程函數本體

協程函數本體是一個能夠中間暫停返回的函數

(b)協程調度器

協程調度器是Unity內部實現的,會在對應的時機幫助我們繼續執行協程函數

(2)總結

協程的本質,就是利用C#迭代器函數分布執行的特點,加上協程調度邏輯實現的一套分時執行函數的規則

三、Resources資源動態加載

在這里插入圖片描述

1、Resources同步加載

(1)Resources資源動態加載的作用

通過代碼動態加載Resources文件夾下指定路徑資源
避免繁瑣的拖曳操作
一個工程中可以有多個Resources文件夾,通過API加載時,會自動去尋找同名文件

(2)常用資源類型

預設體對象——GameObject 注意:預設體對象加載需要實例化,其他資源可以直接用
音效文件——AudioClip
文本文件——TextAsset 注意:支持的文本資源格式 txt xml bytes json html csv
圖片文件——Texture
其他類型——需要什么類型用什么類型

(3)資源同步加載 普通方法

Object obj= Resources.Load("資源所在Resources文件夾下的路徑");//加載指定類型的資源
Resources.Load("資源名",typeof(資源類型));
//加載指定名字的所有資源
Object[] objs= Resources.LoadAll("資源名");

(4)資源同步加載 泛型方法

Resources.Load<資源類型>("資源名");

2、Resources異步加載

(1)異步加載介紹

當加載過大的資源會造成程序卡頓,Resources異步加載就是內部新開一個線程進行資源加載,不會造成主線程卡頓

(2)異步加載方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Lesson11 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){print("開始加載,當前幀為"+Time.frameCount);//異步加載不能馬上得到加載的資源   至少需要等一幀//1.通過異步加載中的完成時間監聽  使用加載的資源//這句代碼表示 Unity開了一個線程進行資源加載ResourceRequest rq = Resources.LoadAsync<GameObject>("Cube");//為 資源下載結束時   添加的一個監聽事件rq.completed += LoadOver;//2.通過協程使用加載的資源StartCoroutine(Load());}private void LoadOver(AsyncOperation rq){print("結束加載,當前幀為" + Time.frameCount);//加載結束  才能對資源進行使用Instantiate((rq  as ResourceRequest).asset);}IEnumerator Load(){ResourceRequest rq = Resources.LoadAsync<GameObject>("Sphere");//打印加載進度while (!rq.isDone){print("當前加載進度:" + rq.progress);yield return null;}//第一部分yield return rq;//Unity會自己判斷 資源是否加載完畢 加載完畢后才會繼續執行后面的代碼//實例化預制體Instantiate(rq.asset);//yield return null;第二部分//yield return new WaitForSeconds(3);第三部分}
}

(3)總結

1.完成事件監聽異步加載 ”線性加載“
優點:寫法簡單
缺點:只能在資源加載結束后進行處理
2.協程異步加載 ”并行加載“
好處:可以在協程中處理復雜邏輯,比如同時加載多個資源,加載進度條更新等
壞處:寫法較為復雜

3、Resources卸載資源

(1)Resources重復加載資源會浪費內存嗎

Resources加載一次資源后,該資源一直放在內存中作為緩存,二次加載時發現內存中存在該資源就會直接取出使用
所有多次加載資源不會浪費內存,但是會浪費性能

(2)如何手動釋放掉緩存中的資源

		 //卸載資源//1.卸載指定資源Resources.UnloadAsset(資源名稱);//注意:該方法 不能釋放 GameObject對象 因為它會用于實例化對象//它只能用于一些 不需要實例化的內容 比如 圖片 音效 文本等//一般情況很少單獨使用//2.卸載未使用的資源Resources.UnloadUnusedAssets();//該方法一般在過場景和GC一起使用

四、場景異步切換

1、場景同步切換

SceneManager.LoadScene(“場景名稱”);
缺點:
使用同步切換回刪除當前場景上所有對象,并去加載下一個場景的相關信息。如果當前場景或者下一個場景內容過多,就會導致同步切換過程耗時很久

2、場景異步切換

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;public class Lesson12 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){//同步場景切換SceneManager.LoadScene("Lesson12Test");//異步場景切換//1.通過事件回調函數 異步加載//AsyncOperation ao= SceneManager.LoadSceneAsync("Lesson12Test");//ao.completed += LoadSceneOver;//2.通過協程異步加載//注意:加載場景會把當前場景上沒有特別處理的對象都刪除了,所以協程中的部分邏輯可能是執行不了的//解決思路:讓處理場景加載的腳本依附的對象,過場景時不被移除DontDestroyOnLoad(this.gameObject);StartCoroutine(LoadScene("Lesson12Test"));   }private void LoadSceneOver(AsyncOperation ao){print("場景加載結束");}IEnumerator LoadScene(string name){//異步加載AsyncOperation ao = SceneManager.LoadSceneAsync(name);//等待場景加載完成//可以在加載過程中,做別的事情print("異步加載過程中,打印的信息");yield return ao;//場景加載完 再執行下面的邏輯print("異步加載結束后,打印的信息");}
}

五、輔助功能Linerender

1、Linerender介紹

Linerender是Unity提供的一個用于畫線的組件
用途:
繪制攻擊范圍
武器紅外線
輔助功能
其他畫線功能

2、Linerender參數相關

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

3、Linerender代碼相關

		//動態添加一個線段GameObject line = new GameObject();line.name = "Line";LineRenderer lineRenderer= line.AddComponent<LineRenderer>();//首尾相連lineRenderer.loop = true;//開始結束寬lineRenderer.startWidth = 0.02f;lineRenderer.endWidth = 1f;//開始結束顏色lineRenderer.startColor = Color.white;lineRenderer.endColor = Color.black;//設置材質lineRenderer.material = material;//設置點//要先設置點的個數lineRenderer.positionCount = 4;//設置對應每個點的位置lineRenderer.SetPositions(new Vector3[] {new Vector3(0,0,0),new Vector3(0,0,5),new Vector3(5,0,5),new Vector3(0,5,5)});//指定設置某個點lineRenderer.SetPosition(3, new Vector3(1, 5, 6));//設置是否使用世界坐標系//決定了 是否隨對象移動而移動 false——會跟隨對象移動,true——不會跟隨對象移動lineRenderer.useWorldSpace = false;//讓線段受光影響 會接受光數據 進行著色器計算lineRenderer.generateLightingData = true;

六、核心系統

1、物理系統之范圍檢測

(1)物理系統之碰撞檢測

碰撞產生必要條件:至少一個物體有剛體,兩個物體都必須有碰撞器
碰撞和觸發:碰撞會產生實際的物理效果,觸發看起來不產生碰撞但是可以通過函數監聽觸發
碰撞檢測主要用于實體物體之間產生物理效果時使用

(2)范圍檢測介紹

在指定位置 進行 范圍判斷 我們可以得到處于指定范圍內的 對象
目標是對 范圍內的對象進行處理 比如,受傷,掉血等
例如植物大戰僵尸的食人花

(3)如何進行范圍檢測

//范圍檢測//必備條件:想要被范圍檢測到的對象,必須具備碰撞器//注意點://1.范圍檢測相關API 只有當執行該句代碼時 進行一次范圍檢測 它是瞬時的//2.范圍檢測相關API 并不會真正產生一個碰撞器 只是碰撞判斷計算而已//1.盒裝范圍檢測//返回在該范圍內的觸發器  = Physics.OverlapBox(立方體中心點,立方體三邊大小,立方體角度,//                          檢測指定層級(不填檢測所有層),是否忽略觸發器(UseGlobal-使用全局設置,可以在Project Setting-PyPhysics中進行設置,//                          Collide-檢測觸發器 Ignore-忽略觸發器 不填使用UseGlobal))Collider[] colliders  =Physics.OverlapBox(Vector3.zero, Vector3.one, Quaternion.AngleAxis(45, Vector3.up), 1 << LayerMask.NameToLayer("UI"));//重點知識//關于層級//通過名字得到層級編號    LayerMask.NameToLayer//我們需要通過編號左移構建二進制數//這樣每一個編號的層級 都是 對應位為1的2進制數//我們通過位運算可以選擇想要的檢測層級//好處 一個int 就可以表示所有想要檢測的層級信息//另一個API//返回值:碰撞到的碰撞器數量//參數:傳入一個數組進行存儲Physics.OverlapBoxNonAlloc(Vector3.zero, Vector3.one, colliders);//2.球形范圍檢測// Physics.OverlapSphere(中心點,球形半徑,層級)Collider[] colliders1=Physics.OverlapSphere(Vector3.zero, 5f, 1 << LayerMask.NameToLayer("UI"));//另一個APIPhysics.OverlapSphereNonAlloc(Vector3.zero, 5f, colliders1);//3.膠囊范圍檢測//Physics.OverlapCapsule(上半圓中心點位置,下半圓中心點位置,圓的半徑,層級)Collider[] colliders2 = Physics.OverlapCapsule(Vector3.zero, Vector3.up, 1, 1 << LayerMask.NameToLayer("UI"));//另一個APIPhysics.OverlapCapsuleNonAlloc(Vector3.zero, Vector3.up, 1, colliders2);

2、物理系統之射線檢測

(1)射線檢測介紹

射線檢測可以在指定點發射一個指定方向的射線,判斷該射線與哪一些碰撞器相交,得到對應對象

(2)射線對象

		//1.聲明一個射線對象//Ray(起點,方向)Ray ray = new Ray(Vector3.right, Vector3.forward);print(ray.origin);//起點print(ray.direction);//方向//2.攝像機發射出的射線//模擬鼠標點擊發出射線Ray ray1 = Camera.main.ScreenPointToRay(Input.mousePosition); 

(3)碰撞器檢測函數

//碰撞檢測函數//射線檢測也是瞬時的,執行代碼時進行一次射線檢測//1.最原始的射線檢測Ray ray = new Ray(Vector3.zero, Vector3.forward);//返回一個布爾值 = Physics.Raycast(射線對象,最遠距離/米,層級,是否忽略發射器)bool isColl =Physics.Raycast(ray, 1000, 1 << LayerMask.NameToLayer("UI"));//2.獲取相交物體的信息//物體信息類 RaycastHitRaycastHit hitInfo;//Physics.Raycast(射線對象,物體信息類,最遠距離,層級)if (Physics.Raycast(ray,out hitInfo,1000, 1 << LayerMask.NameToLayer("UI"))){print(hitInfo.collider);//碰撞器信息print(hitInfo.point);//碰撞到的點print(hitInfo.normal);//法線信息print(hitInfo.transform.position);//碰到對象的位置信息print(hitInfo.distance);//碰撞對象與發射對象的距離}//3.獲取相交的多個對象RaycastHit[] raycastHits = Physics.RaycastAll(ray, 1000, 1 << LayerMask.NameToLayer("UI"));int count = Physics.RaycastNonAlloc(ray, raycastHits, 1000, 1 << LayerMask.NameToLayer("UI"));

(4)使用時注意的問題

距離和層級 都是int類型
當我們傳入參數時,一定要明確傳入的參數代表的是距離還是層數

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70679.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70679.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70679.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

20250212:ZLKMedia 推流

1:資料 快速開始 ZLMediaKit/ZLMediaKit Wiki GitHub GitHub - ZLMediaKit/ZLMediaKit: WebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT server and client framework based on C++11 文檔里面提供了各個系…

Holoens2開發報錯記錄02_通過主機獲取彩色和深度數據流常見錯誤

01.E1696 E1696 無法打開源文件 “stdio.h” 解決方法&#xff1a; 更新一下SDK 1&#xff09;打開Visual Studio Installer&#xff0c;點擊修改 2&#xff09;安裝詳細信息中自己系統對應的SDK&#xff0c;點擊修改即可 02.WinError 10060 方法來源 解決方法&#xff1a…

【Qt之QQuickWidget】QML嵌入QWidget中

由于我項目開始使用Widgets,換公司后直接使用QML開發&#xff0c;沒有了解過如何實現widget到qml過渡&#xff0c;恰逢面試時遇到一家公司希望從widget遷移到qml開發&#xff0c;詢問相關實現&#xff0c;一時語塞&#xff0c;很尷尬&#xff0c;粗略研究并總結下。 對qwidget嵌…

從單片機的啟動說起一個單片機到點燈發生了什么下——使用GPIO點一個燈

目錄 前言 HAL庫對GPIO的抽象 核心分析&#xff1a;HAL_GPIO_Init 前言 我們終于到達了熟悉的地方&#xff0c;對GPIO的初始化。經過漫長的鋪墊&#xff0c;我們終于歷經千辛萬苦&#xff0c;來到了這里。關于GPIO的八種模式等更加詳細的細節&#xff0c;由于只是點個燈&am…

ESP32S3:解決RWDT無法觸發中斷問題,二次開發者怎么才能使用內部RTC看門狗中斷RWDT呢?

目錄 基于ESP32S3:解決RWDT無法觸發中斷問題引言解決方案1. 查看報錯日志2. 分析報錯及一步一步找到解決方法3.小結我的源碼基于ESP32S3:解決RWDT無法觸發中斷問題 引言 在嵌入式系統中,RWDT(看門狗定時器)是確保系統穩定性的重要組件。然而,在某些情況下,RWDT可能無法…

對計算機中緩存的理解和使用Redis作為緩存

使用Redis作為緩存緩存例子緩存的引入 Redis緩存的實現 使用Redis作為緩存 緩存 ?什么是緩存&#xff0c;第一次接觸這個東西是在考研學習408的時候&#xff0c;計算機組成原理里面學習到Cache緩存&#xff0c;用于降低由于內存和CPU的速度的差異帶來的延遲。它是在CPU和內存…

vue3的實用工具庫@vueuse/core

1.什么是vueuse/core 是一個基于 ?Vue Composition API? 開發的實用工具庫&#xff0c;旨在通過封裝高頻功能為可復用的組合式函數&#xff08;Composables&#xff09;&#xff0c;簡化 Vue 應用的開發流程。 提供 ?200 開箱即用的函數?&#xff0c;覆蓋狀態管理、瀏覽器…

基于SSM的《計算機網絡》題庫管理系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘 要 《計算機網絡》題庫管理系統是一種新穎的考試管理模式&#xff0c;因為系統是用Java技術進行開發。系統分為三個用戶進行登錄并操作&#xff0c;分別是管理員、教師和學生。教師在系統后臺新增試題和試卷&#xff0c;學生進行在線考試&#xff0c;還能對考生記錄、錯題…

C++初階——簡單實現stack和queue

目錄 1、Deque(了解) 1.1 起源 1.2 結構 1.3 優缺點 1.4 應用 2、Stack 3、Queue 4、Priority_Queue 注意&#xff1a;stack&#xff0c;queue&#xff0c;priority_queue是容器適配器(container adaptor) &#xff0c;封裝一個容器&#xff0c;按照某種規則使用&#…

第2課 樹莓派鏡像的燒錄

樹莓派的系統通常是安裝在SD卡上的?。SD卡作為啟動設備,負責啟動樹莓派并加載操作系統。這種設計使得樹莓派具有便攜性和靈活性,用戶可以通過更換SD卡來更換操作系統或恢復出廠設置。 燒錄樹莓派的鏡像即是將樹莓派鏡像燒錄到SD卡上,在此期間會格式化SD卡,如果SD卡…

【Unity】URP管線Shader編程實例詳解 (1) : 漩渦效果shader

作者說 本系列教程適用于有編程基礎和圖形學基礎知識的讀者.如果對您有所幫助&#xff0c;請點個免費的贊和關注&#xff0c;您的支持就是我更新最大的動力&#xff01;如果你有任何想看的內容歡迎評論區留言&#xff01;本系列教程Github : https://github.com/Sky0Master/Un…

如何安裝vm 和centos

安裝 VMware Workstation&#xff08;以 Windows 系統為例&#xff09; 1. 下載 VMware Workstation 打開 VMware 官方網站&#xff08;Desktop Hypervisor Solutions | VMware &#xff09;&#xff0c;在頁面中選擇適合你系統的版本進行下載。如果你是個人非商業使用&#x…

STM32-心知天氣項目

一、項目需求 使用 ESP8266 通過 HTTP 獲取天氣數據&#xff08;心知天氣&#xff09;&#xff0c;并顯示在 OLED 屏幕上。 按鍵 1 &#xff1a;循環切換今天 / 明天 / 后天天氣數據&#xff1b; 按鍵 2 &#xff1a;更新天氣。 二、項目框圖 三、cjson作用 https://gi…

Wireshark簡單教程

1.打開Wireshark,點擊最上面欄目里面的“捕獲”中的“選項” 2.進入網卡選擇界面,選擇需要捕獲的選擇&#xff0c;這里我選擇WLAN 3.雙擊捕獲選擇出現下面界面 4.點擊如下圖紅方框即可停止捕獲 5.點擊下圖放大鏡可以進行放大 6.你也可以查詢tcp報文如下圖

【Http和Https區別】

概念&#xff1a; 一、Http協議 HTTP&#xff08;超文本傳輸協議&#xff09;是一種用于傳輸超媒體文檔&#xff08;如HTML&#xff09;的應用層協議&#xff0c;主要用于Web瀏覽器和服務器之間的通信。http也是客戶端和服務器之間請求與響應的標準協議&#xff0c;客戶端通常…

Unity Shader 學習13:屏幕后處理 - 使用高斯模糊的Bloom輝光效果

目錄 一、基本的后處理流程 - 以將畫面轉化為灰度圖為例 1. C#調用shader 2. Shader實現效果 二、Bloom輝光效果 1. 主要變量 2. Shader效果 &#xff08;1&#xff09;提取較亮區域 - pass1 &#xff08;2&#xff09;高斯模糊 - pass2&3 &#xff08;3&#xff…

【R語言】dplyr包經典函數summarise函數

dplyr包經典函數summarise函數&#xff0c;后面改名乘reframe函數了&#xff0c;但是summarise仍然適用 這個函數的返回結果是一個新的數據框&#xff0c;下面講一下幾種常見用法 示例數據為R自帶的數據集mtcars 1.不分組 mtcars %>%summarise(mean mean(disp), n n()…

使用DeepSeek/ChatGPT等AI工具輔助編寫wireshark過濾器

隨著deepseek,chatgpt等大模型的能力越來越強大&#xff0c;本文將介紹借助deepseek&#xff0c;chatgpt等大模型工具&#xff0c;通過編寫提示詞&#xff0c;輔助生成全面的Wireshark顯示過濾器的能力。 每一種協議的字段眾多&#xff0c;流量分析的需求多種多樣&#xff0c;…

vscode設置自動換行

vscode設置自動換行 方法 方法 點擊文件->首選項->設置。搜索word wrap -> 選擇 on 。 搜索Word Wrap&#xff0c;并把選項改為on。

QT 中的元對象系統(一):元對象和元數據

目錄 1.為什么需要元系統 2.元數據 3.模擬元對象系統 3.1.元對象聲明 3.2.對C擴展 3.3初始化元對象 3.4.使用元對象 4.QT的元系統 4.1.元對象系統基于QObject類、Q_OBJECT宏、元對象編譯器MOC實現 4.2.元對象系統的功能 4.3.Q_PROPERTY()的使用 4.4.Q_INVOKABLE使用…