Unity面試八股文之基礎篇

文章目錄

    • 前言
    • 1. Unity的生命周期
      • 加載第一個場景
      • Editor
      • 在第一次幀更新之前
      • 幀之間
      • 更新順序
      • 協程
      • 銷毀對象時
      • 退出時
    • 2. Unity 協程和線程,進程的區別
    • 3. 本地坐標系 世界坐標系
    • 4. 碰撞器和觸發器的區別
    • 后話

前言

開設這個欄目的博文會寫一些有關unity的面試題目,在面試的過程中,考官可能會問到的東西,雖然更多的是問有關項目經歷的,但是這些內容也會涉獵到。


1. Unity的生命周期

下圖是Unity官方給出的腳本生命周期流程圖。

加載第一個場景

場景開始時將調用以下函數(為場景中的每個對象調用一次)。

Awake:始終在任何 Start 函數之前并在實例化預制件之后調用此函數。(如果游戲對象在啟動期間處于非活動狀態,則在激活之后才會調用 Awake。)
OnEnable:(僅在對象處于激活狀態時調用)在啟用對象后立即調用此函數。在創建 MonoBehaviour 實例時(例如加載關卡或實例化具有腳本組件的游戲對象時)會執行此調用。

Editor

Reset:調用 Reset 可以在腳本首次附加到對象時以及使用 Reset 命令時初始化腳本的屬性。
OnValidate:每當設置腳本的屬性時都會調用 OnValidate,包括反序列化對象時,這可能發生在不同的時間,例如在編輯器中打開場景時和域重新加載后。

在第一次幀更新之前

Start:僅當啟用腳本實例后,才會在第一次幀更新之前調用 Start。

幀之間

OnApplicationPause:在幀的結尾處調用此函數(在正常幀更新之間有效檢測到暫停)。在調用 OnApplicationPause 之后,將發出一個額外幀,從而允許游戲顯示圖形來指示暫停狀態。

更新順序

跟蹤游戲邏輯和交互、動畫、攝像機位置等的時候,可以使用一些不同事件。常見方案是在 Update 函數中執行大多數任務,但是也可以使用其他函數。

FixedUpdate:調用 FixedUpdate 的頻度常常超過 Update。如果幀率很低,可以每幀調用該函數多次;如果幀率很高,可能在幀之間完全不調用該函數。在 FixedUpdate 之后將立即進行所有物理計算和更新。在 FixedUpdate 內應用運動計算時,無需將值乘以 Time.deltaTime。這是因為 FixedUpdate 的調用基于可靠的計時器(獨立于幀率)。

Update:每幀調用一次 Update。這是用于幀更新的主要函數。

LateUpdate:每幀調用一次 LateUpdate(在 Update 完成后)。LateUpdate 開始時,在 Update 中執行的所有計算便已完成。LateUpdate 的常見用途是跟隨第三人稱攝像機。如果在 Update 內讓角色移動和轉向,可以在 LateUpdate 中執行所有攝像機移動和旋轉計算。這樣可以確保角色在攝像機跟蹤其位置之前已完全移動。

通常,不應依賴為不同的游戲對象調用相同事件函數的順序 - 除非順序明確記錄或可設置。(如果需要對播放器循環進行更細粒度的控制,可以使用 PlayerLoop API。)

不能指定為同一 MonoBehaviour 子類的不同實例調用事件函數的順序。例如,一個 MonoBehaviour 的 Update 函數可能會在另一個游戲對象(包括其父級或子級游戲對象)上的相同 MonoBehaviour 的 Update 函數之前或之后調用。

可以指定一個 MonoBehaviour 子類的事件函數應在不同子類的事件函數之前調用(使用 Project Settings 窗口的 Script Execution Order 面板)。例如,如果有兩個腳本,EngineBehaviour 和 SteeringBehaviour,可以設置 Script Execution Order,這樣 EngineBehaviours 始終在 SteeringBehaviours 之前更新。

協程

Update 函數返回后將運行正常協程更新。協程是一個可暫停執行 (yield) 直到給定的 YieldInstruction 達到完成狀態的函數。 協程的不同用法:

yield 在下一幀上調用所有 Update 函數后,協程將繼續。
yield WaitForSeconds 在為幀調用所有 Update 函數后,在指定的時間延遲后繼續。
yield WaitForFixedUpdate 在所有腳本上調用所有 FixedUpdate 后繼續。如果協同程序在 FixedUpdate 之前生成,那么它會在當前幀的 FixedUpdate 之后繼續運行。
yield WWW 在 WWW 下載完成后繼續。
yield StartCoroutine 將協程鏈接起來,并會等待 MyFunc 協程先完成。

銷毀對象時

OnDestroy:對象存在的最后一幀完成所有幀更新之后,調用此函數(可能應 Object.Destroy 要求或在場景關閉時銷毀該對象)。

退出時

在場景中的所有活動對象上調用以下函數:

OnApplicationQuit:在退出應用程序之前在所有游戲對象上調用此函數。在編輯器中,用戶停止播放模式時,調用函數。
OnDisable:行為被禁用或處于非活動狀態時,調用此函數。


2. Unity 協程和線程,進程的區別

  • 其實很簡單,首先需要理解進程和線程是怎么一回事:進程是Windows系統中的一個基本概念,他包含著運行一個程序所需要的基本資源。一個正在運行的應用程序在操作系統中被視為一個進程,進程可以包括一個或多個線程。
  • 進程和線程的區別通過以上,一目了然。
  • 再談談線程和協程的區別。一般應用一個應用程序只使用線程這一“資源”。
  • 需要明確,Unity只使用了一個線程,但是,我們需要”同時做很多事“,那Unity作為單線程,該如何去做,協程,就來了,協程是一種”偽線程“。 協同程序(coroutine).,即協作式程序,一系列互相依賴的協程間依次使用CPU,每次只有一個協程工作,而其他協成處于休眠狀態。協程實際上是在一個線程中,只不過每個協程對CPU進行分時,協程可以訪問和使用unity的所有方法和component。
  • 同一時間只能執行某個協程,協程適合對某個任務進行分時處理。    
    控制代碼在特定的時間執行。
  • 協程不是線程,也不是異步執行,跟Update一樣,在主線程中執行。
  • 不用考慮同步和鎖的問題。
  • 協程是一個分部組件,遇到條件(yield return)會掛起,直到條件滿足才會被喚起執行后面的語句。

3. 本地坐標系 世界坐標系

  • 世界坐標系:世界坐標是指物體在場景中的坐標,當某個物體沒有父物體時,它的position即為世界坐標的position,rotation同理;本地坐標是物體相對于它的父物體的坐標而言,這個相對坐標是以父物體本身為坐標軸進行計算的,與世界坐標沒有必然聯系。而對于沒有父物體的物體,可以認為不存在本地坐標這種說法。
  • 本地坐標系:當某個物體有父物體時,它的inspector欄transform中的position實際是localposition,即本地坐標。
  • 使用TransformPoint方法將本地坐標系轉為世界坐標系

4. 碰撞器和觸發器的區別

  • 碰撞器是觸發器的載體,而觸發器只是碰撞器身上的一個屬性。
  • 當Is Trigger=false時,碰撞器根據物理引擎引發碰撞,產生碰撞的效果,可以調用OnCollisionEnter/Stay/Exit函數;
  • 當Is Trigger=true時,碰撞器被物理引擎所忽略,沒有碰撞效果,可以調用OnTriggerEnter/Stay/Exit函數。
  • 如果既要檢測到物體的接觸又不想讓碰撞檢測影響物體移動或要檢測一個物件是否經過空間中的某個區域這時就可以用到觸發器

后話

有很多基礎的面試題你面試過,但是文中沒有提及的歡迎留言補充~

enjoy ~

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

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

相關文章

如何做好軟件項目的溝通管理

如何做好軟件項目的溝通管理 軟件項目的溝通管理是確保項目信息在團隊成員、利益相關者和相關群體之間有效流通的過程。良好的溝通是項目成功的關鍵,在項目開始時,需要制定詳細的溝通計劃,包括溝通的目的、對象、內容、頻率和渠道等信息。 …

【spring】@ResponseBody注解學習

ResponseBody介紹 ResponseBody 是一個Spring框架中的注解,主要用于Web開發,特別是在Spring MVC框架中。它的核心作用是改變Spring MVC處理HTTP請求響應的行為,使得從控制器方法返回的數據直接寫入HTTP響應體(Response Body&…

Python面試寶典:Python中與網絡協議基礎和socket編程相關的知識和面試筆試題(1000加面試筆試題助你輕松捕獲大廠Offer)

Python面試寶典:1000加python面試題助你輕松捕獲大廠Offer【第二部分:Python高級特性:第十四章:網絡編程:第一節:網絡協議基礎和socket編程】 第十四章:并發編程第一節:網絡協議基礎和socket編程網絡協議基礎Socket編程創建SocketTCP服務器TCP客戶端數據傳輸關閉Socket…

Python高級進階--slice切片

slice切片?? 在 Python 中,切片操作是一種常見且方便的方式,用于從字符串、列表或元組中獲取部分元素。這種操作通過指定起始索引、結束索引和步長來實現。下面我們來看一些關于切片的簡單介紹以及一些常見用法。 1. 切片簡介 取一個str、list、tup…

【Unity2D:Animator】為角色添加動畫效果

一、添加Animator組件并創建Animator Controller文件 1. 添加Animator組件: 2. 在Assets-Art文件夾中新建一個名為Animations的文件夾,用來存儲所有動畫資源 3. 在Animations文件夾中新建一個名為Player的文件夾,再創建一個名為Animators的文…

LeetCode //C - 119. Pascal‘s Triangle II

119. Pascal’s Triangle II Given an integer rowIndex, return the rowIndexth (0-indexed) row of the Pascal’s triangle. In Pascal’s triangle, each number is the sum of the two numbers directly above it as shown: Example 1: Input: rowIndex 3 Output: …

vue項目移動端商場

一、項目前端頁面展示 二、項目整體目錄結構 三、項目流程 1. vue快速創建基礎項目 創建項目 vue create hk-shop 1 選擇需要的配置 創建基礎文件夾目錄 src文件夾下文件夾目錄: ① views 文件夾存放界面 ② components 文件夾存放界面中局部組件 ③ config 文件夾存…

【排序算法】——歸并排序(遞歸與非遞歸)含動圖

制作不易,三連支持一下吧!!! 文章目錄 前言一.歸并排序遞歸方法實現二.歸并排序非遞歸方法實現 前言 這篇博客我們將介紹歸并排序的原理和實現過程。 一、歸并排序遞歸方法實現 基本思想: 歸并排序(MERGE-…

JS(ES_6)_2

1.創建對象的6種方式&#xff1a; 1. obnew Object() ob.nameah ob.age18 2. ob{name:ah,gae:18} 3.工廠模式&#xff1a; 設計一個函數&#xff0c;專門生產Person類型的對象 <script>function createPerson(name,age,family) {var o new Object();o.name name;o.…

軟件設計師備考 | 案例專題之數據流圖 概念與例題

案例分析專題大綱&#xff1a; 數據流圖基本概念 基本圖形元素&#xff1a;外部實體、加工、數據存儲、數據流 數據流&#xff1a;由一組固定成分的數據組成&#xff0c;表示數據的流向。在DFD中&#xff0c;數據流的流向必須經過加工。加工&#xff1a;描述了輸入數據流到輸出…

啊哈!算法-第2章-棧、隊列、鏈表

啊哈!算法-第2章-棧、隊列、鏈表 第1節 解密qq號——隊列第2節 解密回文——棧第3節 紙牌游戲——小貓釣魚第4節 鏈表第5節 模擬鏈表 第1節 解密qq號——隊列 新學期開始了&#xff0c;小哈是小哼的新同桌(小哈是個大帥哥哦~)&#xff0c;小哼向小哈詢問 QQ 號&#xff0c; 小…

算法提高之線段樹

算法提高之線段樹 存儲方式 線段樹除了最后一層葉子節點以外是一個滿二叉樹類似堆的形式 因此可以用堆來存儲線段樹同時注意到 數組是可以模擬堆的 因此我們可以用一位數組來存儲線段樹 節點編號為u&#xff0c;對應左子樹編號為2 * u&#xff0c;右子樹編號為2 * u 1裝逼一…

C++ 學習 指針上

&#x1f64b; 繼續C Primer 第五版的學習 注 后面還會有關于指針進一步的學習 本篇為基礎篇 &#x1f33f;可以先看看這兩篇 或許可以進一步加深一下對指針的理解 指針和數組 指針簡介 &#x1f308; 上一次講了 C中的引用&#xff0c;現在總結一下指針和引用的主要區別。 …

uniapp微信小程序解決open-type獲取用戶頭像,返回臨時路徑問題!

解決 open-type 為 chooseAvatar&#xff0c;返回臨時路徑問題 文章目錄 解決 open-type 為 chooseAvatar&#xff0c;返回臨時路徑問題效果圖Demo獲取頭像回調數據結構效果圖解決方式上傳到服務器轉base64 基于微信小程序獲取頭像昵稱規則調整后&#xff0c;當小程序需要讓用戶…

深入了解FreeRTOS:實時操作系統的核心概念和應用

前言&#xff1a; 在當今數字化世界中&#xff0c;嵌入式系統扮演著至關重要的角色&#xff0c;從工業自動化到智能設備&#xff0c;無所不在。而實時操作系統&#xff08;RTOS&#xff09;則是這些系統的核心引擎&#xff0c;它們負責管理任務、資源和時間&#xff0c;確保系統…

RmlUi 初試,hello world

前言 最近在研究GUI的各個方面&#xff0c;最后被導向了web render&#xff0c;真的是一言難盡。 這里就其中一個比較有意思的項目 RmlUi 淺試一下&#xff0c;沒想要還挺麻煩&#xff01;這里留下note以供后人參考。 環境搭建 Windows VS2022 pre-binary library 需要指…

高通Android 12/13 設置和獲取ADB狀態

/*** 設置ADB狀態** param isEnable*/public void setADB(boolean isEnable) {Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.ADB_ENABLED, isEnable ? 1 : 0);}/*** 獲取ADB狀態** return*/public boolean getADB() {return Settings.Global.getIn…

虛擬化技術[3]之網絡虛擬化

網絡虛擬化 網絡虛擬化簡介核心層網絡虛擬化接入層網絡虛擬化虛擬機網絡虛擬化案例: VMware網絡虛擬化技術虛擬網絡接口卡虛擬交換機vSwitch分布式交換機端口組VLAN 網絡虛擬化簡介 傳統的數據中心&#xff1a;服務器之間操作系統和上層軟件異構、接口與數據格式不統一&#x…

鏈表相交-力扣

在做這道題時&#xff0c;首先想到的解法是遍歷第一個鏈表&#xff0c;將其全部添加到哈希表中&#xff0c;然后遍歷第二個鏈表&#xff0c;如果能夠再哈希表中查到元素&#xff0c;則返回這個元素&#xff0c;否則返回NULL。 但在實際寫代碼時&#xff0c;第一次寫默認為鏈表相…

Redis實現MQ

MQ的提出 上游發出請求后阻塞等待下游給到反饋&#xff0c;否則整個流程將一直阻塞。 提出mq之后&#xff1a;即有producer mq consumer 三者 MQ的特點 異步解耦 在有了 mq 后&#xff0c;producer 不需要過分關心 consumer 的身份信息&#xff0c;只需要把消息按照指定的協議…