Unity面試必看系列
時(shí)間:2023-07-06 02:36:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-07-06 02:36:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)
Unity面試必看系列:
一、 C#語(yǔ)言 1. 重載和重寫(xiě)的區(qū)別 1) 所處位置不同 重載在同類(lèi)中 重寫(xiě)在父子類(lèi)中
2) 定義方式不同 重載方法名相同 參數(shù)列表不同 重寫(xiě)方法名和參數(shù)列表都相同
3) 調(diào)用方式不同 重載使用相同對(duì)象以不同參數(shù)調(diào)用 重寫(xiě)用不同對(duì)象以相同參數(shù)調(diào)用
4) 多態(tài)時(shí)機(jī)不同 重載時(shí)編譯時(shí)多態(tài) 重寫(xiě)是運(yùn)行時(shí)多態(tài)
2. 面向?qū)ο蟮娜筇攸c(diǎn) 封裝、繼承、多態(tài) :
1.繼承: 提高代碼重用度,增強(qiáng)軟件可維護(hù)性的重要手段,符合開(kāi)閉原則。
2.封裝: 封裝是將數(shù)據(jù)和行為相結(jié)合,通過(guò)行為約束代碼修改數(shù)據(jù)的程度,增強(qiáng)數(shù)據(jù)的安全性,屬性 是 C#封裝實(shí)現(xiàn)的最好體現(xiàn)。
3.多態(tài)性: 多態(tài)性是指同名的方法在不同環(huán)境下,自適應(yīng)的反應(yīng)出不同得表現(xiàn),是方法動(dòng)態(tài)展示的重要手段。
3. 簡(jiǎn)述值類(lèi)型和引用類(lèi)型有什么區(qū)別 1.值類(lèi)型存儲(chǔ)在內(nèi)存棧中,引用類(lèi)型數(shù)據(jù)存儲(chǔ)在內(nèi)存堆中,而內(nèi)存單元中存放的 是堆中存放的地址。
2.值類(lèi)型存取快,引用類(lèi)型存取慢。
3.值類(lèi)型表示實(shí)際數(shù)據(jù),引用類(lèi)型表示指向存儲(chǔ)在內(nèi)存堆中的數(shù)據(jù)的指針和引用。
4.棧的內(nèi)存是自動(dòng)釋放的,堆內(nèi)存是.NET 中會(huì)由 GC 來(lái)自動(dòng)釋放。
5.值類(lèi)型繼承自 System.ValueType,引用類(lèi)型繼承自 System.Object。
4. 請(qǐng)簡(jiǎn)述 private,public,protected,internal 的區(qū)別 public:對(duì)任何類(lèi)和成員都公開(kāi),無(wú)限制訪問(wèn)
private:僅對(duì)該類(lèi)公開(kāi)
protected:對(duì)該類(lèi)和其派生類(lèi)公開(kāi)
internal:只能在包含該類(lèi)的程序集中訪問(wèn)該類(lèi)
protected internal:protected + internal
5. C#中所有引用類(lèi)型的基類(lèi)是什么 引用類(lèi)型的基類(lèi)是 System.Object 值類(lèi)型的基類(lèi)是 System.ValueType 同時(shí),值類(lèi)型也隱式繼承自 System.Object
6. 請(qǐng)簡(jiǎn)述 ArrayList 和 List<Int>的主要區(qū)別 1.ArrayList 不帶泛型 數(shù)據(jù)類(lèi)型丟失
2.List<T> 帶泛型 數(shù)據(jù)類(lèi)型不丟失
3.ArrayList 需要裝箱拆箱 List<T>不需要
7. 請(qǐng)簡(jiǎn)述 GC(垃圾回收)產(chǎn)生的原因,并描述如何避免? GC 為了避免內(nèi)存溢出而產(chǎn)生的回收機(jī)制
避免:1)減少 new 產(chǎn)生對(duì)象的次數(shù)
2)使用公用的對(duì)象(靜態(tài)成員)
3)將 String 換為 StringBuilder
8. 請(qǐng)描述 Interface 與抽象類(lèi)之間的不同 1.接口不是類(lèi) 不能實(shí)例化 抽象類(lèi)可以間接實(shí)例化
2.接口是完全抽象 抽象類(lèi)為部分抽象
3.接口可以多繼承 抽象類(lèi)是單繼承
9. 下列代碼在運(yùn)行中會(huì)產(chǎn)生幾個(gè)臨時(shí)對(duì)象? 其實(shí)在 C#中第一行是會(huì)出錯(cuò)的(Java 中倒是可行)。應(yīng)該這樣初始化:
string b = new string(new char[]{'a','b','c'});
忽略錯(cuò)誤的話:
1."abc"
2.a.ToUpper()
3."123"
4.a.ToUpper()+"123"
10.下列代碼在運(yùn)行中會(huì)發(fā)生什么問(wèn)題?如何避免? 會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤,因?yàn)?foreach 是只讀的。不能一邊遍歷一邊修改。
11.請(qǐng)簡(jiǎn)述關(guān)鍵字 Sealed 用在類(lèi)聲明和函數(shù)聲明時(shí)的作用 類(lèi)聲明時(shí)可防止其他類(lèi)繼承此類(lèi),在方法中聲明則可防止派生類(lèi)重寫(xiě)此方法。
12.反射的實(shí)現(xiàn)原理? 可以在加載程序運(yùn)行時(shí),動(dòng)態(tài)獲取和加載程序集,并且可以獲取到程序集的信息 反射即在運(yùn)行期動(dòng)態(tài)獲取類(lèi)、對(duì)象、方法、對(duì)象數(shù)據(jù)等的一種重要手段
主要使用的類(lèi)庫(kù):System.Reflection
核心類(lèi):
1.Assembly 描述了程序集
2.Type 描述了類(lèi)這種類(lèi)型
3.ConstructorInfo 描述了構(gòu)造函數(shù)
4.MethodInfo 描述了所有的方法
5.FieldInfo 描述了類(lèi)的字段
6.PropertyInfo 描述類(lèi)的屬性
通過(guò)以上核心類(lèi)可在運(yùn)行時(shí)動(dòng)態(tài)獲取程序集中的類(lèi),并執(zhí)行類(lèi)構(gòu)造產(chǎn)生類(lèi)對(duì)象,動(dòng)態(tài)獲取對(duì)象的字段 或?qū)傩灾?,更可以?dòng)態(tài)執(zhí)行類(lèi)方法和實(shí)例方法等。
13. .Net 與 Mono 的關(guān)系? .Net 是一個(gè)語(yǔ)言平臺(tái),Mono 為.Net 提供集成開(kāi)發(fā)環(huán)境,集成并實(shí)現(xiàn)了.NET 的編譯器、CLR 和基礎(chǔ)類(lèi) 庫(kù),使得.Net 既可以運(yùn)行在 windows 也可以運(yùn)行于 linux,Unix,Mac OS 等。
14.在類(lèi)的構(gòu)造函數(shù)前加上 static 會(huì)報(bào)什么錯(cuò)?為什么? 構(gòu)造函數(shù)格式為 public+類(lèi)名如果加上 static 會(huì)報(bào)錯(cuò)(靜態(tài)構(gòu)造函數(shù)不能有訪問(wèn)修飾符)
原因:靜態(tài)構(gòu)造函數(shù)不允許訪問(wèn)修飾符,也不接受任何參數(shù);無(wú)論創(chuàng)建多少類(lèi)型的對(duì)象,靜態(tài)構(gòu)造函 數(shù)只執(zhí)行一次;運(yùn)行庫(kù)創(chuàng)建類(lèi)實(shí)例或者首次訪問(wèn)靜態(tài)成員之前,運(yùn)行庫(kù)調(diào)用靜態(tài)構(gòu)造函數(shù);靜態(tài)構(gòu)造 函數(shù)執(zhí)行先于任何實(shí)例級(jí)別的構(gòu)造函數(shù);顯然也就無(wú)法使用 this 和 base 來(lái)調(diào)用構(gòu)造函數(shù)。
15.C# String 類(lèi)型比 stringBuilder 類(lèi)型的優(yōu)勢(shì)是什么? 如果是處理字符串的話,用 string 中的方法每次都需要?jiǎng)?chuàng)建一個(gè)新的字符串對(duì)象并且分配新的內(nèi)存地 址,而 stringBuilder 是在原來(lái)的內(nèi)存里對(duì)字符串進(jìn)行修改,所以在字符串處理 方面還是建議用 stringBuilder 這樣比較節(jié)約內(nèi)存。但是 string 類(lèi)的方法和功能仍然還是比 stringBuilder 類(lèi)要強(qiáng)。
string 類(lèi)由于具有不可變性(即對(duì)一個(gè) string 對(duì)象進(jìn)行任何更改時(shí),其實(shí)都是創(chuàng)建另外一個(gè) string 類(lèi)的 對(duì)象),所以當(dāng)需要頻繁的對(duì)一個(gè) string 類(lèi)對(duì)象進(jìn)行更改的時(shí)候,建議使用 StringBuilder 類(lèi), StringBuilder 類(lèi)的原理是首先在內(nèi)存中開(kāi)辟一定大小的內(nèi)存空間,當(dāng)對(duì)此 StringBuilder 類(lèi)對(duì)象進(jìn)行更改 時(shí), 如果內(nèi)存空間大小不夠, 會(huì)對(duì)此內(nèi)存空間進(jìn)行擴(kuò)充,而不是重新創(chuàng)建一個(gè)對(duì)象,這樣如果對(duì)一個(gè) 字符串對(duì)象進(jìn)行頻繁操作的時(shí)候,不會(huì)造成過(guò)多的內(nèi)存浪費(fèi),其實(shí)本質(zhì)上并沒(méi)有很大區(qū)別,都是用來(lái) 存儲(chǔ)和操作字符串的,唯一的區(qū)別就在于性能上。String 主要用于公共 API,通用性好、用途廣泛、讀取性能高、占用內(nèi)存小。 StringBuilder 主要用于拼接 String,修改性能好。 不過(guò)現(xiàn)在的編譯器已經(jīng)把 String 的 + 操作優(yōu)化成 StringBuilder 了, 所以一般用 String 就可以了 String 是不可變的,所以天然線程同步。 StringBuilder 可變,非線程同步。
16.C# 函數(shù) Func(string a, string b)用 Lambda 表達(dá)式怎么寫(xiě)? (a,b) => {};
17.數(shù)列 1,1,2,3,5,8,13...第 n 位數(shù)是多少?用 C#遞歸算法實(shí)現(xiàn) public int CountNumber(int num) {
if (num == 1 || num == 2) {
return 1;
} else { return CountNumber(num -1) + CountNumber(num-2);
}
}
18.冒泡排序(手寫(xiě)代碼) public static void BubblingSort(int[]array) {
for (int i = 0; i < array.Length; i++){
for (int j = array.Length - 1; j > 0; j--){
if (array[j] < array[i]) {
int temp = array[j];
array[j] = array[j-1];
array[j - 1] = temp;
} } } }
19.C#中有哪些常用的容器類(lèi),各有什么特點(diǎn)。 List,HashTable,Dictionary,Stack,Queue
List:索引泛型容器 訪問(wèn)速度快 修改速度慢
HashTable/Dictionary:散列表格式 查詢效率高 空間占用較大
Stack:后進(jìn)先出
Queue: 先進(jìn)先出
20.C#中常規(guī)容器和泛型容器有什么區(qū)別,哪種效率高? 不帶泛型的容器需要裝箱和拆箱操作 速度慢 所以泛型容器效率更高 數(shù)據(jù)類(lèi)型更安全
21.有哪些常見(jiàn)的數(shù)值類(lèi)? 簡(jiǎn)單值類(lèi)型--包括 整數(shù)類(lèi)型、實(shí)數(shù)類(lèi)型、字符類(lèi)型、布爾類(lèi)型
復(fù)合值類(lèi)型--包括 結(jié)構(gòu)類(lèi)型、枚舉類(lèi)型
22.C#中委托和接口有什么區(qū)別?各用在什么場(chǎng)合? 接口(interface)是約束類(lèi)應(yīng)該具備的功能集合,約束了類(lèi)應(yīng)該具備的功能,使類(lèi)從千變?nèi)f化的具體 邏輯中解脫出來(lái),便于類(lèi)的管理和擴(kuò)展,同時(shí)又合理解決了類(lèi)的單繼承問(wèn)題。
C#中的委托是約束方法集合的一個(gè)類(lèi),可以便捷的使用委托對(duì)這個(gè)方法集合進(jìn)行操作。
在以下情況中使用接口:
1.無(wú)法使用繼承的場(chǎng)合
2.完全抽象的場(chǎng)合
3.多人協(xié)作的場(chǎng)合 以上等等
在以下情況中使用委托:多用于事件處理中
23.C#中 unsafe 關(guān)鍵字是用來(lái)做什么的?什么場(chǎng)合下使用? 非托管代碼才需要這個(gè)關(guān)鍵字 一般用在帶指針操作的場(chǎng)合
24.C#中 ref 和 out 關(guān)鍵字有什么區(qū)別? ref 修飾參數(shù),表示進(jìn)行引用傳遞,out 修飾參數(shù)也表示進(jìn)行引用傳遞,但傳遞的引用只為帶回返回值 ref 又進(jìn)又出 out 不進(jìn)只出
25.For,foreach,Enumerator.MoveNext 的使用,與內(nèi)存消耗情況 for 循環(huán)可以通過(guò)索引依次進(jìn)行遍歷,foreach 和 Enumerator.MoveNext 通過(guò)迭代的方式進(jìn)行遍歷。內(nèi)存 消耗上本質(zhì)上并沒(méi)有太大的區(qū)別。但是在 Unity 中的 Update 中,一般不推薦使用 foreach 因?yàn)闀?huì)遺留 內(nèi)存垃圾。
26.函數(shù)中多次使用 string 的+=處理,會(huì)產(chǎn)生大量?jī)?nèi)存垃圾(垃圾碎片),有 什么好的方法可以解決。 通過(guò) StringBuilder 那進(jìn)行 append,這樣可以減少內(nèi)存垃圾
27.當(dāng)需要頻繁創(chuàng)建使用某個(gè)對(duì)象時(shí),有什么好的程序設(shè)計(jì)方案來(lái)節(jié)省內(nèi)存? 設(shè)計(jì)單例模式進(jìn)行創(chuàng)建對(duì)象或者使用對(duì)象池
28.JIT 和 AOT 區(qū)別 Just-In-Time - 實(shí)時(shí)編譯
執(zhí)行慢 安裝快 占空間小一點(diǎn)
Ahead-Of-Time - 預(yù)先編譯
執(zhí)行快 安裝慢 占內(nèi)存占外存大
29.給定一個(gè)存放參數(shù)的數(shù)組,重新排列數(shù)組 void SortArray(Array arr){Array.Sort(arr);}
30.Foreach 循環(huán)迭代時(shí),若把其中的某個(gè)元素刪除,程序報(bào)錯(cuò),怎么找到那 個(gè)元素?以及具體怎么處理這種情況?(注:Try.....Catch 捕捉異常,發(fā)送 信息不可行) foreach 不能進(jìn)行元素的刪除,因?yàn)榈鲿?huì)鎖定迭代的集合,解決方法:記錄找到索引或者 key 值, 迭代結(jié)束后再進(jìn)行刪除。
31.GameObject a=new GameObject() GameObject b=a 實(shí)例化出來(lái)了 A, 將 A 賦給 B,現(xiàn)在將 B 刪除,問(wèn) A 還存在嗎? 存在,b 刪除只是將它在棧中的內(nèi)存刪除,而 A 對(duì)象本身是在堆中,所以 A 還存在
32.你擁有 A 塊錢(qián),一瓶水 B 塊錢(qián),每瓶水可以得到一個(gè)瓶蓋,每 C 個(gè)瓶蓋 可以換一瓶水請(qǐng)寫(xiě)出函數(shù)求解上面題目,上面題目 ABC 為參數(shù) public static int Buy(int a,int b,int c) {
return a/b + ForCap(c,a/b);
}
public static int ForCap(int c,int d) {
if (d<c) {
return 0;
} else {
return d/c + ForCap(c,d/c + d%c);
}}
33.有一排開(kāi)關(guān),第一個(gè)人把所有的開(kāi)關(guān)打開(kāi),第二個(gè)人按 2 的倍數(shù)的開(kāi)關(guān), 第三個(gè)人按 3 的倍數(shù)的開(kāi)關(guān),以此類(lèi)推,現(xiàn)在又 n 個(gè)開(kāi)關(guān),k 個(gè)人,寫(xiě)函 數(shù)求最后等兩者的開(kāi)關(guān),輸入?yún)?shù) n 和 k static void Main(string[] args) {
int n = int.Parse(Console.ReadLine()); int k = int.Parse(Console.ReadLine());
Function(100,100);
}
static void Function(int n, int k) {
int i, j = 0;
bool[] a = new bool[1000]; //初始 false:關(guān)燈,true:開(kāi)燈
for (i = 1; i <= k; i++) //k 個(gè)人
for (j = 1; j <= n; j++) //n 個(gè)燈
if (j % i == 0)
a[j] = !a[j]; //取反,false 變 true,原來(lái)開(kāi)變關(guān),關(guān)變開(kāi)
for (i = 1; i <= n; i++) //最后輸出 a[i]的值就可以了
if (a[i]) //燈亮著
Console.WriteLine(i);
}
34.數(shù)制轉(zhuǎn)換,將任意整數(shù)轉(zhuǎn)換成 8 進(jìn)制形式 static void Main(string[] args) {
int n;
n =int.Parse(Console.ReadLine());
Console.WriteLine("輸入的 10 進(jìn)制為:{0}",n);
Console.Write("轉(zhuǎn)換為 8 進(jìn)制數(shù)為: ");
d2o(n);
}
static void d2o(int n) {
if (n > 7) {
d2o(n / 8);
}
Console.Write(n%8);
}
35.找出 200 以內(nèi)的素?cái)?shù)。 static void Main(string[] args) {
int count = 0;
for (int i = 1; i < 200; i++) { //外層循環(huán):要判斷的數(shù)
for (int j = 2; j <=i; j++){
if (i % j == 0&& i!=j) {
break;
}
if (j == i ) { //結(jié)束的條件:最后一個(gè)數(shù)還沒(méi)有被整除
count++;
Console.WriteLine(i);
} }
}
Console.WriteLine(count);
}
36.打印楊輝三角形 public static void YHSJ(){
int [][]a= new int[7][] ;
a[0] = new int[1]; //a[0][0]=1;
a[1] = new int[2] ;
for (int i = 0; i < 7; i++) {
a[i] = new int[i+1] ;
a[i][0] =1;
a[i][i]=1;
if(i>1) { //求出中間的數(shù)據(jù)
for(int j=1;j<i; j++){
a[i][j]= a[i-1][j-1]+a[i-1][j];
}
}
}
for (int i=0; i<a.Length; i++) {
for (int k = 0; k < a.Length-1-i; k++) {
Console.Write("");
}
for(int j=0;j<a[i].Length; j++ ) {
Console.Write(a[i][j] + "");
}
Console.WriteLine();
}
}
37.中國(guó)有句俗話“三天打魚(yú)兩天曬網(wǎng)”,某人從 2000 年 1 月 1 日起開(kāi)始 “三天打魚(yú)兩天曬網(wǎng)”,問(wèn)這個(gè)人在今后的某天中“打魚(yú)”還是”曬網(wǎng)” public static void Compute(){
Console.WriteLine ((DateTime.Now - DateTime.Parse("2000-01-01")).Days%5<3?"打魚(yú)":"曬網(wǎng)");
}
38.假設(shè)當(dāng)前市場(chǎng)價(jià)一只雞 10 元,一只鴨 12 元 5 角。請(qǐng)寫(xiě)一個(gè)函數(shù) ShowPrice,輸入?yún)?shù)分別為雞和鴨的個(gè)數(shù)(非負(fù)整型),功能為顯示出總 價(jià)錢(qián),精確到分。例如調(diào)用 ShowPrice(5,10)后輸出 175.00。請(qǐng)注意程 序的可讀性和易于維護(hù)性。 static void ShowPrice(int num_chicken, int num_duck) {
float totalPrice = 0.00f;
float price_chicken = 10f;
float price_duck = 12.5f;
totalPrice = num_chicken * price_chicken + num_duck * price_duck;
Console.WriteLine("總價(jià)錢(qián)為:{0:0.00}", totalPrice);
}
39.請(qǐng)寫(xiě)一個(gè)函數(shù),用于返回 n!(階乘)結(jié)果末尾連續(xù) 0 的個(gè)數(shù),如 GetZeroCount(5)返回 1,因?yàn)?5! = 120,末尾連續(xù) 1 個(gè) 0 static void Main(string[] args) {
int fac = Factorial(5);
Console.WriteLine(CountZero(fac));
}
public static int Factorial(int n) {
if (n == 1) {
return 1;
} else {
return n * jiecheng(n - 1);
}
}
//求連續(xù)的 0 的個(gè)數(shù)
public static int CountZero(int num) {
int result = 0; // 最后的結(jié)果
String numStr = num.ToString();
for (int i = numStr.Length - 1; i >= 0; i--) {
if (numStr[i] == '0') {
result ++;
} else {
break;
}
}
return result;
}
二、 Unity 編輯器基礎(chǔ) 40.請(qǐng)描述游戲動(dòng)畫(huà)有幾種,以及其原理。 主要有關(guān)節(jié)動(dòng)畫(huà)、單一網(wǎng)格模型動(dòng)畫(huà)(關(guān)鍵幀動(dòng)畫(huà))、骨骼動(dòng)畫(huà)。關(guān)節(jié)動(dòng)畫(huà)把角色分成若干獨(dú)立部分, 一個(gè)部分對(duì)應(yīng)一個(gè)網(wǎng)格模型,部分的動(dòng)畫(huà)連接成一個(gè)整體的動(dòng)畫(huà),角色比較靈活 Quake2 中使用了這 種動(dòng)畫(huà)。單一網(wǎng)絡(luò)模型動(dòng)畫(huà)由一個(gè)完整的網(wǎng)格模型構(gòu)成, 在動(dòng)畫(huà)序列的關(guān)鍵幀里記錄各個(gè)頂點(diǎn)的原位 置及其改變量,然后插值運(yùn)算實(shí)現(xiàn)動(dòng)畫(huà)效果,角色動(dòng)畫(huà)較真實(shí)。骨骼動(dòng)畫(huà),廣泛應(yīng)用的動(dòng)畫(huà)方式,集 成了以上兩個(gè)方式的優(yōu)點(diǎn),骨骼按角色特點(diǎn)組成一定的層次結(jié)構(gòu),由關(guān)節(jié)相連,可做相對(duì)運(yùn)動(dòng),皮膚 作為單一網(wǎng)格蒙在骨骼之外,決定角色的外觀。皮膚網(wǎng)格每一個(gè)頂點(diǎn)都會(huì)受到骨骼的影響,從而實(shí)現(xiàn) 完美的動(dòng)畫(huà)。(骨骼動(dòng)畫(huà)是由關(guān)節(jié)動(dòng)畫(huà)發(fā)展而來(lái)的,如今基本都使用骨骼動(dòng)畫(huà)來(lái)實(shí)現(xiàn)角色動(dòng)畫(huà))
41.物體發(fā)生碰撞的必要條件 物體 A 必須帶有(collider+rigidbody)或者 CharacterController,另一個(gè)物體也必須至少帶有 collider
42.GUI 與 UGUI 的優(yōu)點(diǎn)和缺點(diǎn) GUI 不方便控制,UGUI 所見(jiàn)即所得,方便控制。GUI 使用在生命周期函數(shù) OnGUI 中使用,腳本來(lái)書(shū)寫(xiě) 控制。UGUI 使用 Canvas 畫(huà)布和事件系統(tǒng)。UGUI 適應(yīng)屏幕上比 GUI 簡(jiǎn)單。
43.一個(gè)場(chǎng)景放置多個(gè) carmera 并同時(shí)處于活動(dòng)狀態(tài),會(huì)發(fā)生什么 實(shí)際看到的畫(huà)面由多個(gè) camera 的畫(huà)面組成,由 depth、Clear Flag、Culling Mask 都會(huì)影響最終合成效果。
44.使用過(guò)哪些第三方插件? 一、界面制作 推薦:NGUI
二、2D 游戲制作 推薦:2D Toolkit //[?tu:lk?t] 工具包,工具箱
三、可視化編程 推薦:PlayMaker
四、插值插件 推薦:iTween,HOTween
五、路徑搜尋 推薦:Simple Path
六、美術(shù)及動(dòng)畫(huà)制作 推薦:RageSpline,Smooth Moves
七、畫(huà)面增強(qiáng) 推薦:Bitmap2Material,Strumpy Shader Editor
八、攝像機(jī)管理 推薦:Security Camera
九、資源包 推薦:Nature Pack
十、造路插件 EasyRoads3D
45.U3D 中用于記錄節(jié)點(diǎn)空間幾何信息的組件名稱,及其父類(lèi)名稱 Transform 父類(lèi)是 Component
46.為何大家都在移動(dòng)設(shè)備上尋求 U3D 原生 GUI 的替代方案 不美觀,OnGUI 很耗費(fèi)時(shí)間,使用不方便 ,DrawCall
47.請(qǐng)簡(jiǎn)述如何在不同分辨率下保持 UI 的一致性 NGUI 很好的解決了這一點(diǎn),屏幕分辨率的自適應(yīng)性,原理就是計(jì)算出屏幕的寬高比跟原來(lái)的預(yù)設(shè)的屏 幕分辨率求出一個(gè)對(duì)比值,然后修改攝像機(jī)的 size。
48.為什么 dynamic font 在 unicode 環(huán)境下優(yōu)于 static font Unicode 是國(guó)際組織制定的可以容納世界上所有文字和符號(hào)的字符編碼方案。使用動(dòng)態(tài)字體時(shí),Unity 將不會(huì)預(yù)先生成一個(gè)與所有字體的字符紋理。當(dāng)需要支持亞洲語(yǔ)言或者較大的字體的時(shí)候,若使用正 常紋理,則字體的紋理將非常大。
49.Render 的作用?描述 MeshRender 和 SkinnedMeshRender 的關(guān)系與不 同 Mesh 就是指模型的網(wǎng)格(同名組件是用于調(diào)整網(wǎng)格屬性的),MeshFilter 一般是用于獲得模型網(wǎng)格的 組件,而 MeshRender 是用于把網(wǎng)格渲染出來(lái)的組件
50. 簡(jiǎn)述 SkinnedMesh 的實(shí)現(xiàn)原理 Skinned Mesh 中文一般稱作骨骼蒙皮動(dòng)畫(huà).這種動(dòng)畫(huà)中包含骨骼( Bone )和蒙皮 (Skinned Mesh) 兩個(gè)部 分, Bone 的層次結(jié)構(gòu)和關(guān)節(jié)動(dòng)畫(huà)類(lèi)似, Mesh 則和關(guān)節(jié)動(dòng)畫(huà)不同:關(guān)節(jié)動(dòng)畫(huà)中是使用多個(gè)分散的 Mesh, 而 Skinned Mesh 中 Mesh 是一個(gè)整體,也就是說(shuō)只有一個(gè) Mesh, 實(shí)際上如果沒(méi)有骨骼讓 Mesh 運(yùn) 動(dòng)變形, Mesh 就和靜態(tài)模型一樣了。Skinned Mesh 技術(shù)的精華在于蒙皮,所謂的皮并不是模型的貼 圖。而是 Mesh 本身,蒙皮是指將 Mesh 中的頂點(diǎn)附著(綁定)在骨骼之上,而且每個(gè)頂點(diǎn)可以被多個(gè) 骨骼所控制,這樣在關(guān)節(jié)處的頂點(diǎn)由于同時(shí)受到父子骨骼的拉扯而改變位置就消除了裂縫??梢岳斫?為具有蒙皮信息的 Mesh 或可當(dāng)做皮膚用的 Mesh ,這個(gè)皮膚就是 Mesh 。而為了有皮膚功能, Mesh 還需要蒙皮信息,即 Skin 數(shù)據(jù),沒(méi)有 Skin 數(shù)據(jù)就是一個(gè)普通的靜態(tài) Mesh 了。 Skin 數(shù)據(jù)決定頂點(diǎn)如何 綁定到骨骼上。頂點(diǎn)的 Skin 數(shù)據(jù)包括頂點(diǎn)受哪些骨骼影響以及這些骨骼影響該頂點(diǎn)時(shí)的權(quán)重 (weight) , 另外對(duì)于每塊骨骼還需要骨骼偏移矩陣 (BoneOffsetMatrix) 用來(lái)將頂點(diǎn)從 Mesh 空間變換到骨骼空間。
51.Prefab 的作用?如何在移動(dòng)環(huán)境的設(shè)備下恰當(dāng)?shù)厥褂盟?在游戲運(yùn)行時(shí)實(shí)例化,prefab 相當(dāng)于一個(gè)模版,對(duì)你已有的素材、腳本、參數(shù)做一個(gè)默認(rèn)配置,以便 于以后修改,同時(shí) prefab 打包的內(nèi)容簡(jiǎn)化了導(dǎo)出的操作,便于團(tuán)隊(duì)的交流。
52.如何銷(xiāo)毀一個(gè) UnityEngine.Object 及其子類(lèi) Destory
53.為什么 Unity3D 中會(huì)發(fā)生在組件上出現(xiàn)數(shù)據(jù)丟失的情況? 組件上綁定的對(duì)象被刪除了
54.MeshCollider 和其他 Collider 的一個(gè)主要不同點(diǎn)? Meshcollider 是基于頂點(diǎn)的。建議還是用 boxcollider,boxcollider 本身是基于算法,沒(méi)有面的概念。
55.當(dāng)一個(gè)細(xì)小的高速物體撞向另一個(gè)較大的物體時(shí),會(huì)出現(xiàn)什么情況?如何 避免? 穿透(碰撞檢測(cè)失敗)(碰撞體變大,F(xiàn)ixedUpdate, 代碼限制)
56.MeshRender 中 material 和 sharedmaterial 的區(qū)別? 修改 sharedMaterial 將改變所有物體使用這個(gè)材質(zhì)的外觀,并且也改變儲(chǔ)存在工程里的材質(zhì)設(shè)置。 不推薦修改由 sharedMaterial 返回的材質(zhì)。如果你想修改渲染器的材質(zhì),使用 material 替代。
57.用 u3d 實(shí)現(xiàn) 2d 游戲,有幾種方式? 1.利用引擎自帶的 GUI 和 2D 系統(tǒng)
2.把攝像機(jī)設(shè)為 Orthographic,用面片作為 2d 元素
3.利用第三方插件:NGUI、2dToolkit
58.u3d 中碰撞器和觸發(fā)器的區(qū)別? collider 碰撞器會(huì)有碰撞的效果,IsTrigger = false, 可以調(diào)用 OnCollisionEnter/Stay/Exit 函數(shù) trigger 觸發(fā)器 沒(méi)有碰撞效果, isTrigger = true,可以調(diào)用 OnTriggerEnter/stay/exit 函數(shù)
59.CharacterController 和 Rigidbody 的區(qū)別 Rigidbody 具有完全真實(shí)物理的特性, 而 CharacterController 可以說(shuō)是受限的 Rigidbody,具有一定的物 理效果但不是完全真實(shí)的。
60.什么叫做鏈條關(guān)節(jié) Hinge Joint ,他可以模擬兩個(gè)物體間用一根鏈條連接在一起的情況,能保持兩個(gè)物體在一個(gè)固定距離 內(nèi)部相互移動(dòng)而不產(chǎn)生作用力,但是達(dá)到固定距離后就會(huì)產(chǎn)生拉力。 (簡(jiǎn)單說(shuō)就是彈簧)
61.unity3d 提供了幾種光源,分別是什么 平行光:Directional Light
聚光燈:Spot Light
點(diǎn)光源:Point Light
區(qū)域光源:Area Light(只用于烘培)
62.u3d 下如何安全的在不同工程遷移 asset 數(shù)據(jù) 方法 1,可以把 assets 目錄和 Library 目錄一起遷移,
方法 2,導(dǎo)出包
方法 3,用 unity 帶的 assets server 功能
63. Unity3d 中的碰撞器和觸發(fā)器的區(qū)別? 觸發(fā)器只是碰撞器身上的一個(gè)屬性,碰撞器是觸發(fā)器的載體。
碰撞器有碰撞的效果,IsTrigger=false,可以調(diào)用 OnCollisionEnter/Stay/Exit 函數(shù);
觸發(fā)器沒(méi)有碰撞效果,IsTrigger=true,可以調(diào)用 OnTriggerEnter/Stay/Exit 函數(shù)。
a.如果不想讓碰撞檢測(cè)影響物體移動(dòng)但是又想檢測(cè)到碰撞這時(shí)用到觸發(fā)器(Trigger)
b.觸發(fā)器用來(lái)檢測(cè)一個(gè)物件是否經(jīng)過(guò)空間中的某個(gè)區(qū)域
64.動(dòng)畫(huà)層(Animation Layers)的作用是什么? 動(dòng)畫(huà)層作為一個(gè)具有層級(jí)動(dòng)畫(huà)編輯概念的工具, 可以用來(lái)制作和處理任何類(lèi)型的動(dòng)畫(huà)
65.Material 和 Physic Material 區(qū)別? PhysicMaterial 物理材質(zhì):物理材質(zhì)描述,如何處理物體碰撞(摩擦,彈性)。Material 材質(zhì)(材質(zhì)類(lèi)) 為了獲得一個(gè)對(duì)象使用的材質(zhì),可以使用 Renderer.materia 屬性
66.什么是導(dǎo)航網(wǎng)格(NavMesh)? 一種用于實(shí)現(xiàn)自動(dòng)尋路的網(wǎng)格
67.請(qǐng)簡(jiǎn)述 NGUI 中 Panel 和 Anchor 的作用 Anchor 包含 UIAnchor 腳本。 UIAnchor 的功能是把對(duì)象錨定在屏幕的邊緣 (左上, 左中,左下,上, 中,下,右上,右中,右下),或縮放物體使其匹配屏幕的尺寸 Panel 對(duì)象有 UIPanel 腳本,UIPanel 是一個(gè)容器,它將包含所有 UI 小部件,并負(fù)責(zé)將所包含的部件組 合優(yōu)化,以減少繪制命令的調(diào)用。
68.Unity 攝像機(jī)有幾種工作方式,分別是什么? perspective 透視攝像機(jī)和 orthographic 正交攝像機(jī)
69.LayerMask.NameToLayer()這個(gè)方法有什么作用? LayerMask 的使用是按位操作的,LayerMask.NameToLayer(“Players”) 返回該 Layer 的編號(hào)。
70.NGUI 與 UGUI 的優(yōu)點(diǎn)和缺點(diǎn) 1) NGUI 還保留著圖集,需要進(jìn)行圖集的維護(hù)。而 UGUI 沒(méi)有圖集的概念,可以充分利用資源,避免重 復(fù)資源。
2) UGUI 出現(xiàn)了錨點(diǎn)的概念,更方便屏幕自適應(yīng)。
3) NGUI 支持圖文混排,UGUI 暫未發(fā)現(xiàn)支持此功能。
4) UGUI 沒(méi)有 UIWrap 來(lái)循環(huán) scrollview 內(nèi)容。
5) UGUI 暫時(shí)沒(méi)有集成 Tween 組件。
71.是否熟悉 UGUI 熟悉,之前在一些項(xiàng)目用 UGUI 做過(guò)界面,和 NGUI 很相似。
72.會(huì)寫(xiě)插件么? 了解過(guò),但在公司這塊用的比較少,沒(méi)怎么寫(xiě)過(guò),不過(guò)我能很快學(xué)會(huì)。
73.UGUI 和 NGUI 的區(qū)別?為什么不使用 NGUI? 1、uGUI 的 Canvas 有世界坐標(biāo)和屏幕坐標(biāo),NGUI 有 2D 和 3D 區(qū)別。
2、uGUI 的 Image 可以使用 material。
3、UGUI 通過(guò) Mask 來(lái)裁剪,而 NGUI 通過(guò) Panel 的 Clip
4、NGUI 的渲染前后順序是通過(guò) Widget 的 Depth,而 UGUI 渲染順序根據(jù) Hierarchy 的順序,越下面渲 染在頂層。
1) 、UGUI 不需要綁定 Colliders,UI 可以自動(dòng)攔截事件。
2) 、UGUI 的 Anchor 是相對(duì)父對(duì)象,沒(méi)有提供高級(jí)選項(xiàng),個(gè)人感覺(jué) uGUI 的 Anchor 操作起來(lái)比 NGUI 更方便
7、UGUI 沒(méi)有 Atlas 一說(shuō),使用 Sprite Packer。
8、UGUI 的 Navgation 在 Scene 中能可視化。
9、UGUI 的事件需要實(shí)現(xiàn)事件系統(tǒng)的接口,但寫(xiě)起來(lái)也算簡(jiǎn)單。
10、NGUI 功能更豐富一些 之所以不用 NGUI 是因?yàn)?UGUI 是 Unity 官方推出的,慢慢會(huì)成為制作 UI 的主要工具,配套的插件也越 來(lái)越多,但是具體使用 NGUI 還是 UGUI 還要看公司這邊,因?yàn)檫@兩個(gè)我都用過(guò)一段時(shí)間。
74.UI 用的是 NGUI 還是 UGUI? 兩個(gè)都用過(guò)。之前用的 NGUI 后來(lái)用了 UGUI。
75.Unity3d 中 static batching 和 dynamic batching 各有什么用? Dynamic Batching 不需要任何操作,只要共享材質(zhì)(即使是不同的 Mesh 模型也可以),就會(huì)自動(dòng)被合并。 可以自由移動(dòng)旋轉(zhuǎn)。但有以下使用要求:
(1) 模型文件共計(jì)點(diǎn)數(shù)不超過(guò) 900。(重復(fù)使用同一個(gè) Mesh 不計(jì))
(2) 單個(gè)物體可以不超過(guò) 300 點(diǎn),Shader 可以有法線 UV。 但如果 Shader 使用了 UV0 UV1 兩套 UV,或者 Tangent 切線的話,單個(gè)物體只能不超過(guò) 180 點(diǎn)
(3)游戲?qū)ο笫褂孟嗤P秃筒馁|(zhì)時(shí),只有相同縮放(即 xyz 等比縮放,浮點(diǎn)尾數(shù)可以有細(xì)微差)的會(huì)被合
并。如 (1,1,1)與(1,1,1) (2,2,2)與(2,2,2) (0.5,0.5,0.5)與 (0.5,0.5,0.5) (2,2,2)與(2,2,2.0001)
(4)場(chǎng)景烘焙:烘焙后同材質(zhì)將不會(huì)被烘焙。lightmap 有隱藏的材質(zhì)參數(shù):offset/scale, 所以使用
lightmap 的物體不會(huì)被合并
(5)Shader 不能使用多 Pass:多 Pass 的 Shader 會(huì)破壞 Dynamic Batching Static Batching
原理:運(yùn)行游戲后將一組游戲?qū)ο蟮亩鄠€(gè)模型會(huì)被動(dòng)態(tài)合并為 1 個(gè)。這組游戲?qū)ο笏惺褂猛徊馁|(zhì) 的在一個(gè) DrawCall 來(lái)完成。這些游戲?qū)ο筮\(yùn)行后無(wú)法移動(dòng)縮放旋轉(zhuǎn)。但是 Drawcall 一定是最大化合并 的,并且不受動(dòng)態(tài)合并的諸多限制(見(jiàn)下文詳述)。
注意:即使物體都使用了同樣的模型,在 batch 后每一個(gè)物體都會(huì)創(chuàng)建一份模型對(duì)應(yīng)的 geometry,在新 的 Combined Mesh 里。所以過(guò)多的 batch 會(huì)增加內(nèi)存占用。例如場(chǎng)景里的樹(shù)群就不適合 Static Batch, 而適合動(dòng)態(tài)合并。實(shí)現(xiàn)方法:
(1)MeshRenderer 勾選 Batching Static: 勾了即可
(2)代碼中使用 UnityEngine.StaticBatchingUtility 實(shí)現(xiàn)(可以在任何平臺(tái)調(diào)用):
1)將所有要合并的靜態(tài)物體(不須勾 Batching Static)放入統(tǒng)一一個(gè) root
2)StaticBatchingUtility.Combine(root); 之后就合并好了!
區(qū)別:勾選 Batching Static:完全自動(dòng)合并,在 MeshFilter 里顯示的是 Combined Mesh(root:scene)。合并 后不能移動(dòng)
StaticBatchingUtility:合并到一個(gè)游戲?qū)ο笙隆:喜⒑罂梢砸苿?dòng)父節(jié)點(diǎn)游戲?qū)ο?#34;
76.Unity3d 中 Awake 和 Start 誰(shuí)先執(zhí)行,update 和 fixedUpdate 有什么區(qū) 別? Awake 先執(zhí)行。Update 是在每次渲染新的一幀的時(shí)候才會(huì)調(diào)用,F(xiàn)ixedUpdate,是在固定的時(shí)間間隔執(zhí) 行,不受游戲幀率(fps)的影響 ,F(xiàn)ixedUpdate 的時(shí)間間隔可以在項(xiàng)目設(shè)置中更改,Edit->Project Setting->time 找到 Fixed timestep。就可以修改了
77.Unity 引擎中以下對(duì) Mesh Renderer 組件描述正確的是哪一項(xiàng)? C A.Mesh Renderer 組件決定了場(chǎng)景中游戲?qū)ο蟮奈恢茫D(zhuǎn)和縮放
B.為場(chǎng)景中的某一游戲?qū)ο笤鎏砦锢淼奶匦?,需要為該游戲?qū)ο筇砑?Mesh Renderer 組件
C.Mesh Renderer 組件從 Mesh Filter 組件中獲得網(wǎng)格信息,病根據(jù)物體的 Transform 組件所定義的位 置進(jìn)行渲染
D.Mesh Renderer 是從網(wǎng)格資源中獲取網(wǎng)格信息的組件
78.哪種實(shí)時(shí)光源是 Unity 中沒(méi)有的?D A:點(diǎn)光源
B:方向光
C:聚光燈
D:日光燈
79.如何在 Unity 中創(chuàng)建地形系統(tǒng)?A A:Terrain->Create Terrain
B:Component->Create Terrain
C:Asset->Create Terrain
D:Windows->Create Terrain
80.以下哪種操作步驟可以在場(chǎng)景中添加“Wind Zone”?B A:Terrain -> Wind Zone
B:GameObject -> Create Other -> Wind Zone
C:Component -> Physics -> Wind Zone
D:Assets -> Create -> Wind Zone
81.在 Unity 編輯器中創(chuàng)建一個(gè) Directional Light,以下步驟正確的是? B A:Edit -> Rendering Setting -> Directional Light
B:GameObject -> Create Other -> Directional Light
C:Component -> Rendering -> Directional Light
D:Assets -> Directional Light
82.下列哪一項(xiàng)不屬于 Camera 中的“Clear Flags”?D A:Skybox
B:Solid Color
C:Depth Only
D:Background
83.以下哪種腳本語(yǔ)言是 Unity 編輯器所不支持的? D A:JavaScript
B:C#
C:Boo
D:Perl
84.對(duì)于 Prefab,以下說(shuō)法錯(cuò)誤的是? D A:Prefab 資源可以在項(xiàng)目中多次重復(fù)使用
B:由 Prefab 實(shí)例出的 GameObject,其在 Hierarchy 視圖中表現(xiàn)為藍(lán)色
C:Prefab 上的組件信息一經(jīng)改變,其實(shí)例出的 GameObject 也會(huì)自動(dòng)改變
D:實(shí)例出的 GameObject 上的組件信息一經(jīng)改變,其對(duì)應(yīng)的 Prefab 也會(huì)自動(dòng)改變
85.下面哪種做法可以打開(kāi) Unity 的 Asset Store? A A:Windows -> Asset Store
B:Edit -> Asset Store
C:File -> Asset Store
D:Assets -> Asset Store
86.在哪個(gè)面板中可以修改物體的空間屬性,如位置、朝向、大小等?B A:Project
B:Inspector
C:Hierarchy
D:Toolbar
87.如何為一個(gè) Asset 資源設(shè)定一個(gè) Label,從而能夠方便準(zhǔn)確的搜索到? D A:在 Project 窗口中選中一個(gè) Asset,右鍵->Create->Label
B:在 Project 窗口中選中一個(gè) Asset,右鍵->Add Label
C:在 Project 窗口中選中一個(gè) Asset,在 Inspector 窗口中點(diǎn)擊添加 Label 的圖標(biāo)
D:在 Project 窗口中選中一個(gè) Asset,在 Inspector 窗口中點(diǎn)擊按鈕“Add Label”
88.Mecanim 系統(tǒng)中,Body Mask 的作用是?D A:指定身體的某一部分是否參與骨骼動(dòng)畫(huà)
B:指定身體的某一部分是否參與物理模擬
C:指定身體的某一部分是否可以輸出骨骼信息
D:指定身體的某一部分是否參與渲染
89.以下哪種操作步驟可以打開(kāi) Unity 編輯器的 Lightmapping 視圖? C A:File --> Lightmapping
B:Assets --> Lightmapping
C:Windows --> Lightmapping
D:Component --> Lightmapping
90.下列關(guān)于光照貼圖,說(shuō)法錯(cuò)誤的是? C A:使用光照貼圖比使用實(shí)時(shí)光源渲染要快
B:可以降低游戲內(nèi)存消耗
C:可以增加場(chǎng)景真實(shí)感
D:多個(gè)物體可以使用同一張光照貼圖
91.如何為物體添加光照貼圖所使用的 UV? B A:不用添加,任何時(shí)候都會(huì)自動(dòng)生成
B:更改物體導(dǎo)入設(shè)置,勾選“Generate Lightmap UVs”C:更改物體導(dǎo)入設(shè)置,勾選“Swap UVs”
D:更改物體導(dǎo)入設(shè)置,在 UVs 選項(xiàng)中選擇“Use Lightmaps”
92.在哪個(gè)模塊下可以修改 Render Path? A A:Camera
B:Light
C:Render Settings
D:Project Settings->Quality
93.以下哪項(xiàng)技術(shù)不是目前 Unity 所支持的 Occlusion Culling 技術(shù)? D A:PVS only
B:PVS and dynamic objects
C:Automatic Portal Generation
D:Dynamic Only
94.關(guān)于 Vector3 的 API,以下說(shuō)法正確的是? C A:Vector3.normalize 可以獲取一個(gè)三維向量的法線向量;
B:Vector3.magnitude 可以獲取一個(gè)三維向量的長(zhǎng)度;
C:Vector3.forward 與 Vector3(0,0,1)是一樣的意思;
D:Vector3.Dot(向量 A,向量 B)是用來(lái)計(jì)算向量 A 與向量 B 的叉積
95.下列那些選項(xiàng)不是網(wǎng)格層屬性的固有選項(xiàng)? A A:Default
B:Walkable
C:Not Walkable
D:Jump
96.什么是導(dǎo)航網(wǎng)格(NavMesh)? D A:一種用于描述相機(jī)軌跡的網(wǎng)格
B:一種被優(yōu)化過(guò)的物體網(wǎng)格
C:一種用于物理碰撞的網(wǎng)格
D:一種用于實(shí)現(xiàn)自動(dòng)尋路的網(wǎng)格
97.以下哪一個(gè)選項(xiàng)不屬于 Unity 引擎所支持的視頻格式文件 D A.后綴名為 mov 的文件
B.后綴名為 mpg 的文件
C.后綴名為 avi 的文件
D. 后綴名為 swf 的文件
98.Unity 引擎使用的是左手坐標(biāo)系還是右手坐標(biāo)系? A A.左手坐標(biāo)系
B.右手坐標(biāo)系
C.可以通過(guò) Project Setting 切換左右手坐標(biāo)系
D.可以通過(guò) Reference 切換左右手坐標(biāo)系
99.以下哪組攝像機(jī)中 Normalized View Port Rect 的數(shù)值設(shè)置可以使得攝像 機(jī)顯示的畫(huà)面位于 1280*720 分辨率的屏幕畫(huà)面的右上角 D A. x = 640, Y = -360 , W = 360,H = 360
B. x =640, Y = -360 , W = 360,H = 360
C. x =0.5, Y = 0 , W = 0.5,H = 0.5
D0. x =0.5, Y = 0.5 , W = 0.5,H = 0.5
100. 以下哪個(gè)組件是任何 GameObject 必備的組件 B A.Mesh Renderer
B.Trtansform
C.Game Object
D.Main camera
101. 在 Unity 編輯器中,停止對(duì) Game 視圖進(jìn)行預(yù)覽播放的快捷鍵操作是 以下哪一項(xiàng) A A.CTRL/CMD + P
B.CTRL/CMD + Shift +P
C.CTRL/CMD + Alt +P
D.CTRL/CMD + S
102. 在 Unity 引擎中,Depth 屬性值最大的攝像機(jī)會(huì)比 Depth 屬性值小的 攝像機(jī)更晚繪制么? A A.是
B.否
103. 下列選項(xiàng)中有關(guān) Animator 的說(shuō)法錯(cuò)誤的是 D A.Animasstor 是 Unity 引擎內(nèi)置組件
B.任何一個(gè)具有動(dòng)畫(huà)狀態(tài)機(jī)功能的 GameObject 都需要一個(gè) Animator 組件
C.它主要用于角色行為的設(shè)置,包括 StateMachines,混合 Blend trees 以及通過(guò)腳本控制的事件
D.Animator 同 Animation 組件的用法是相同的
104. 下列哪個(gè)視圖主要用于顯示和編輯所選游戲?qū)ο蠡蛸Y源的相關(guān)屬性 C A.Scene
B.Project
C.Inspector
D.Hierarchy
105. 簡(jiǎn)述 Prefab 的使用?Editor 下動(dòng)態(tài)創(chuàng)建 Prefab 的方式 "u3d 里動(dòng)態(tài) 創(chuàng)建對(duì)象,需要使用 prefab 而創(chuàng)建的時(shí)候 MonoBehaviour.Instantiate (GameObject orignal) 需要一個(gè)作為原型的對(duì)象。三種方式獲得prefab 對(duì)象。 方式一:使用腳本的 public 字段直接在 Project 視圖里找到做好的 prefab,將其拖拽到指定腳本的指定 public GameObject 字段。
方式二:Resource 類(lèi)
1、在 Assets 目錄下的任意位置創(chuàng)建一個(gè)名為 resources 的文件夾,將做好的 prefab 放到這個(gè)文件夾下, path 形式如下: Assets/..../resources/prefabName.prefab
2、在代碼里使用 Resource.Load 或 LoadAll 函數(shù),獲得原型對(duì)象。指定 prefab 時(shí)不需要指定擴(kuò)展名 (.prefab),形式如下:GameObject prototype = Resource.Load(“prefabName”) as GameObject; 可有任 意數(shù)量的 resources 文件夾,懷疑是 Resource 類(lèi)初始化的時(shí)候會(huì)搜集所有 resources 文件夾里的文件名。
方式三:加載到場(chǎng)景
一般我們制作 Perfab 的時(shí)候,都是在 Hierarchy 視圖里創(chuàng)建 GameObject,然后再搭建 Prefab。事后根 據(jù)需要?jiǎng)h除這個(gè)原始的 GameObject。因此我們可以保留這個(gè) GameObject,然后在場(chǎng)景加載后 Find 這 個(gè)對(duì)象(代碼方式),或者使用腳本 public 字段(編輯器方式)
106. NGUI 的自適應(yīng)性是?如果此時(shí)屏幕比例變化,屏幕出現(xiàn)黑邊怎么辦? (注:改變 NGUI 和 UGUI 的 Fixed size with Screen 不可行) NGUI 根目錄的 UIRoot 組件自帶了根據(jù)高度自適應(yīng)分辨率的功能。
Scaling Style 屬性可選擇三種不同的縮放策略。
PixelPerfect 完美像素:直接顯示設(shè)定好的像素。當(dāng)屏幕高度低于 minimum Height 時(shí)按比例縮小,當(dāng)屏 幕高度大于 maximum Height 時(shí)按比例擴(kuò)大。
FixedSize 按比例縮放:在設(shè)定好 的基礎(chǔ)上,直接按比例縮放。
FixedSizeOnMobiles 合體版,android 和 ios 為 FixedSize 方式,其它按照 PixelPerfect 方式。
三、 Unity 腳本基礎(chǔ) 107. Unity3D 中的協(xié)程(coroutine)和 C#線程之間的區(qū)別是什么? 多線程程序同時(shí)運(yùn)行多個(gè)線程 ,而在任一指定時(shí)刻只有一個(gè)協(xié)程在運(yùn)行,并且這個(gè)正在運(yùn)行的協(xié)同程 序只在必要時(shí)才被掛起。除主線程之外的線程無(wú)法訪問(wèn) Unity3D 的對(duì)象、組件、方法。 Unity3d 沒(méi)有多線程的概念,不過(guò) unity 也給我們提供了 StartCoroutine(協(xié)同程序)和 LoadLevelAsync(異步加載關(guān)卡)后臺(tái)加載場(chǎng)景的方法。 StartCoroutine 為什么叫協(xié)同程序呢,所謂協(xié)同,就是當(dāng)你在 StartCoroutine 的函數(shù)體里處理一段代碼時(shí),利用 yield 語(yǔ)句等待執(zhí)行結(jié)果,這期間不影響主程序的繼 續(xù)執(zhí)行,可以協(xié)同工作。而 LoadLevelAsync 則允許你在后臺(tái)加載新資源和場(chǎng)景,所以再利用協(xié)同,你 就可以前臺(tái)用 loading 條或動(dòng)畫(huà)提示玩家游戲未卡死,同時(shí)后臺(tái)協(xié)同處理加載的事宜
108. 簡(jiǎn)述 Unity3D 支持的作為腳本的語(yǔ)言的名稱 Unity 的腳本語(yǔ)言基于 Mono 的.Net 平臺(tái)上運(yùn)行,可以使用.NET 庫(kù),這也為 XML、數(shù)據(jù)庫(kù)、正則表達(dá)式 等問(wèn)題提供了很好的解決方案。 Unity 里的腳本都會(huì)經(jīng)過(guò)編譯,他們的運(yùn)行速度也很快。這三種語(yǔ)言實(shí)際上的功能和運(yùn)行速度是一樣的, 區(qū)別主要體現(xiàn)在語(yǔ)言特性上。 JavaScript:和網(wǎng)頁(yè)中常用的 JavaScript 不一樣,它編譯后的運(yùn)行速度很快,語(yǔ)法方面也會(huì)有不少區(qū)別。 C# Boo:可以看做是 Python 語(yǔ)言的變種,又糅合了 Ruby 和 C#的特性,它是靜態(tài)類(lèi)型語(yǔ)言
109. Unity3D 是否支持寫(xiě)成多線程程序?如果支持的話需要注意什么? 僅能從主線程中訪問(wèn) Unity3D 的組件,對(duì)象和 Unity3D 系統(tǒng)調(diào)用
110. 支持:如果同時(shí)你要處理很多事情或者與 Unity 的對(duì)象互動(dòng)小可以用 thread,否則使用 coroutine。 注意:C#中有 lock 這個(gè)關(guān)鍵字,以確保只有一個(gè)線程可以在特定時(shí)間內(nèi)訪問(wèn)特定的對(duì)象
111. OnEnable、Awake、Start 運(yùn)行時(shí)的發(fā)生順序?哪些可能在同一個(gè)對(duì)象周 期中反復(fù)的發(fā)生? Awake -》OnEnable-》Start OnEnable 在同一周期中可以反復(fù)地發(fā)生
112. 、請(qǐng)簡(jiǎn)述 OnBecameVisible 及 OnBecameInvisible 的發(fā)生時(shí)機(jī),以及這 一對(duì)回調(diào)函數(shù)的意義? 當(dāng)物體是否可見(jiàn)切換之時(shí)??梢杂糜谥恍枰谖矬w可見(jiàn)時(shí)才進(jìn)行的計(jì)算。
113. Unity3D 如何獲知場(chǎng)景中需要加載的數(shù)據(jù)? Resource.Load
AssetBundle.Load
114. 物體發(fā)生碰撞時(shí),有幾個(gè)階段,分別對(duì)應(yīng)的函數(shù) 三個(gè)階段,OnCollisionEnter/ /Exit 函數(shù)
115. u3d 中,幾種施加力的方式,描述出來(lái) rigidbody.AddForce/AddForceAtPosition,都是 rigidbody 的成員函數(shù)
116. 物體自旋轉(zhuǎn)使用的函數(shù)叫什么 transform.Rotate
117. 物體繞某點(diǎn)旋轉(zhuǎn)使用函數(shù)叫什么 transform.RotateAround
118. u3d 提供了一個(gè)用于保存讀取數(shù)據(jù)的類(lèi),(playerPrefs),請(qǐng)列出保存讀取 整形數(shù)據(jù)的函數(shù) PlayerPrefs.SetInt 與 PlayerPrefs.GetInt
119. unity3d 從喚醒到銷(xiāo)毀有一段生命周期,請(qǐng)列出系統(tǒng)自己調(diào)用的幾個(gè)重要 方法。 Awake –>OnEnable –> Start –> Update –> FixedUpdate –> LateUpdate –>OnGUI –> Reset –>
OnDisable –> OnDestroy
120. 物理更新一般在哪個(gè)系統(tǒng)函數(shù)里? FixedUpdate,每固定幀繪制時(shí)執(zhí)行一次,和 update 不同的是 FixedUpdate 是渲染幀執(zhí)行,如果你的渲 染效率低下的時(shí)候 FixedUpdate 調(diào)用次數(shù)就會(huì)跟著下降。FixedUpdate 比較適用于物理引擎的計(jì)算,因 為是跟每幀渲染有關(guān)。Update 就比較適合做控制。
121. 移動(dòng)相機(jī)動(dòng)作在哪個(gè)函數(shù)里,為什么在這個(gè)函數(shù)里。 LateUpdate,,是在所有 update 結(jié)束后才調(diào),比較適合用于命令腳本的執(zhí)行。官網(wǎng)上例子是攝像機(jī)的跟 隨,都是在所有 update 操作完才跟進(jìn)攝像機(jī),不然就有可能出現(xiàn)攝像機(jī)已經(jīng)推進(jìn)了,但是視角里還未 有角色的空幀出現(xiàn)。
122. 為什么 u3d 會(huì)出現(xiàn)組件上數(shù)據(jù)丟失的情況 一般是組件上綁定的物體對(duì)象被刪除了
123. 什么是協(xié)同程序? 在主線程運(yùn)行時(shí)同時(shí)開(kāi)啟另一段邏輯處理,來(lái)協(xié)助當(dāng)前程序的執(zhí)行。換句話說(shuō),開(kāi)啟協(xié)程就是開(kāi)啟一 個(gè)線程??梢杂脕?lái)控制運(yùn)動(dòng)、序列以及對(duì)象的行為。
124. 反向旋轉(zhuǎn)動(dòng)畫(huà)的方法是什么? 反轉(zhuǎn)動(dòng)畫(huà),講動(dòng)畫(huà)的速度調(diào)到-1,碰撞時(shí),被碰撞物體與碰撞物體有 collider 組件,碰撞物體有剛體組 件,或角色碰撞得包含角色組件 OR 改變 animation.speed
125. 用代碼實(shí)現(xiàn)第三角色控制器 public class Player : MonoBehaviour {
public Transform _cameraTrans;
private Vector3 _cameraOffset;
void Awake() {
_cameraOffset = transform.position - _cameraTrans.position;
}
void Update() {
_cameraTrans.position = transform.position - _cameraOffset;
}
}
126. 實(shí)現(xiàn)吊機(jī)吊物體的功能 吊機(jī)吊物體需要節(jié)點(diǎn)掛接和坐標(biāo)系轉(zhuǎn)換
127. 獲取、增加、刪除組件的命令分別是什么 獲?。篏etComponent
增加:AddComponent
刪除:Destroy
128. Animation.CrossFade 命令作用是:C A. 動(dòng)畫(huà)放大 B.動(dòng)畫(huà)轉(zhuǎn)換 C.動(dòng)畫(huà)的淡入為其他動(dòng)畫(huà)
129. Application.loadLevel 命令為:A A. 加載關(guān)卡 B.異步加載關(guān)卡 C.加載動(dòng)作
130. 調(diào)試記錄到控制臺(tái)的命令是什么? Debug.Log();
131. 編輯器類(lèi)存放路徑是什么? 工程目錄下的 Assets/Editor 文件夾下。
132. 使用原生 GUI 創(chuàng)建一個(gè)可以拖動(dòng)的窗口命令是什么? GUI.DragWindow();
133. localPosition 與 Position 的使用區(qū)別? localPosition:自身位置,相對(duì)于父級(jí)的變換的位置。 Position:在世界坐標(biāo) transform 的位置
134. 含義 Mathf.Round, Mathf.Clamp, Mathf.Lerp Mathf.Round 四舍五入
Mathf.Clamp 限制
Mathf.Lerp 插值
135. 寫(xiě)一個(gè)計(jì)時(shí)器工具,從整點(diǎn)開(kāi)始計(jì)時(shí),格式為:00:00:00 private float timer = 0f;
private int h = 0;
private int m = 0;
private int s = 0;
private string timeStr = string.Empty;
void Update () {
timer += Time.deltaTime;
if (timer >= 1f) {s++; timer = 0;}
if (s >= 60) {m++;s = 0;}
if (m >= 60) {h++;m = 0;}
if (h >= 99) {h = 0;}
}
void OnGUI(){
timeStr = string.Format ("{0:D2}:{1:D2}:{2:D2}", h, m, s);
GUI.Label (new Rect (10, 10, 100, 200), timeStr);
}
136. 寫(xiě)出 Animation 的五個(gè)方法 AddClip 添加剪輯、Blend 混合、Play 播放、Stop 停止、Sample 采樣
137. 用鼠標(biāo)實(shí)現(xiàn)在場(chǎng)景中拖動(dòng)物體,用鼠標(biāo)滾輪實(shí)現(xiàn)縮放(用一個(gè) Cube 即可)。 在場(chǎng)景中添加一個(gè) Plan,Camera,Directional Light,Cube。添加兩個(gè)腳本 scrollerScirpt(掛在 Camera), CubeDragScript(掛在 Cube 上)。
1.鼠標(biāo)滾輪實(shí)現(xiàn)縮放:將攝像機(jī)的鏡頭拉近或者拉遠(yuǎn),調(diào)整攝像機(jī)的視角就可以實(shí)現(xiàn),主要實(shí)現(xiàn)代碼
如下:
void Update () {
//鼠標(biāo)滾輪的效果
if (Input.GetAxis("Mouse ScrollWheel") < 0) {
if (Camera.main.fieldOfView <= 100)
Camera.main.fieldOfView += 2;
if (Camera.main.orthographicSize <= 20)
Camera.main.orthographicSize += 0.5F;
}
//Zoom in
if (Input.GetAxis("Mouse ScrollWheel") > 0) {
if (Camera.main.fieldOfView > 2)
Camera.main.fieldOfView -= 2;
if (Camera.main.orthographicSize >= 1)
Camera.main.orthographicSize -= 0.5F;
}
}
2.鼠標(biāo)實(shí)現(xiàn)在場(chǎng)景中拖動(dòng)物體:
解決思路就是將世界坐標(biāo)轉(zhuǎn)換成屏幕坐標(biāo),然后計(jì)算物體與鼠標(biāo)之間移動(dòng)量,循環(huán)鼠標(biāo)被按下操 作,得到鼠標(biāo)的當(dāng)前位置,加上計(jì)算好的移動(dòng)量,將新的坐標(biāo)賦值給物理就行了。主要是開(kāi)啟一個(gè)協(xié) 同程序(Corountine)來(lái)處理。
主要代碼如下:
// Use this for initialization
void Start () {
StartCoroutine(OnMouseDown());
}
IEnumerator OnMouseDown() {
//將物體由世界坐標(biāo)系轉(zhuǎn)換為屏幕坐標(biāo)系
Vector3 screenSpace = Camera.main.WorldToScreenPoint(transform.position);
//完成兩個(gè)步驟 1.由于鼠標(biāo)的坐標(biāo)系是 2 維,需要轉(zhuǎn)換成 3 維的世界坐標(biāo)系
//2.只有 3 維坐標(biāo)情況下才能來(lái)計(jì)算鼠標(biāo)位置與物理的距離,offset 即是距離
//將鼠標(biāo)屏幕坐標(biāo)轉(zhuǎn)為三維坐標(biāo),再算出物體位置與鼠標(biāo)之間的距離
Vector3 offset = transform.position
Camera.main.ScreenToWorldPoint(new
Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));
while (Input.GetMouseButton(0)) {
//得到現(xiàn)在鼠標(biāo)的 2 維坐標(biāo)系位置
Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
//將當(dāng)前鼠標(biāo)的 2 維位置轉(zhuǎn)換成 3 維位置,再加上鼠標(biāo)的移動(dòng)量
Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset; //curPosition 就是物體應(yīng)該的移動(dòng)向量賦給 transform 的 position 屬性
transform.position = curPosition;
yield return new WaitForFixedUpdate(); //這個(gè)很重要,循環(huán)執(zhí)行
}
}
138. NGUI Button 怎樣接受用戶點(diǎn)擊并調(diào)用函數(shù),具體方法名稱是什么 1、主要是在 UICamera 腳本中用射線判斷點(diǎn)擊的物體并通過(guò) SendMessage 調(diào)用 OnClick() OnPress()等函 數(shù),可以說(shuō) NGUI 的按鈕是通過(guò)發(fā)消息這個(gè)方式調(diào)用的。具體方法名稱是 OnClick()
2、void Awake () {
//獲取需要監(jiān)聽(tīng)的按鈕對(duì)象
GameObject button = GameObject.Find("UI Root/Button3");
//設(shè)置這個(gè)按鈕的監(jiān)聽(tīng),指向本類(lèi)的 ButtonClick 方法中。
UIEventListener.Get(button).onClick = OnButton3Click;
}
private void OnButton3Click(GameObject button) {
Debug.Log("我是按鈕 3 被點(diǎn)擊了");
}
139. <憤怒的小鳥(niǎo)>給予初速度以后,怎么讓小鳥(niǎo)受到重力和空氣阻力的影響而繪 制拋物線軌跡,說(shuō)出具體的計(jì)算方法. Vector3 v 代表初速度 v'代表現(xiàn)在的速度, 假設(shè)小鳥(niǎo)是沿的 z 軸也就是 transform.forward 方向運(yùn)動(dòng) 的質(zhì)量為 1,那么 v'=v-new Vector3(0,g*t,f*t),transform.Translate(v')做的就是拋物線運(yùn)動(dòng)(g 為重力加 速度不要用現(xiàn)實(shí)中的需要自己調(diào)試,f 為阻力也要自己調(diào)試設(shè)置,t 為時(shí)間)
140. 當(dāng)游戲中需要頻繁創(chuàng)建一個(gè)物體時(shí),我們需要怎樣做能夠節(jié)省內(nèi)存? 1、使用預(yù)制物體對(duì)象 Prefab
2、使用對(duì)象池技術(shù),不使用時(shí)關(guān)閉,使用時(shí)打開(kāi)
141. 碰撞檢測(cè)需要物體具備什么屬性? 能檢測(cè)碰撞發(fā)生的方式有兩種,一種是利用碰撞器,另一種則是利用觸發(fā)器 【Physics.OverlapSphere 相交球檢測(cè)碰撞,碰撞檢測(cè)需要包圍盒】
142. Vector3.forward 與 Vector3(0,0,1)是一樣的意思對(duì)嗎? 對(duì)
143. 下哪個(gè)函數(shù)在游戲進(jìn)入新場(chǎng)景后會(huì)被馬上調(diào)用? MonoBehaviour.OnLevelWasLoaded
144. itween 插件的作用是什么,itween 作用于世界坐標(biāo)還是局部坐標(biāo),請(qǐng)列 舉出 3 個(gè)其常用方法? iTween 是一個(gè)動(dòng)畫(huà)庫(kù),作者創(chuàng)建它的目的就是最小的投入實(shí)現(xiàn)最大的產(chǎn)出。讓你做開(kāi)發(fā)更輕松,用它 可以輕松實(shí)現(xiàn)各種動(dòng)畫(huà),晃動(dòng),旋轉(zhuǎn),移動(dòng),褪色,上色,控制音頻等等“方法:
a、MoveTo 物體移動(dòng);
b、ColorTo:隨著時(shí)間改變對(duì)象的顏色組;
c、LookTo:隨時(shí)間旋轉(zhuǎn)物體讓其臉部朝向所提供的 Vector3 或 Transform 位置;
145. U3D 中用于記錄節(jié)點(diǎn)空間幾何信息的組件名稱,及其父類(lèi)名稱 Transform 父類(lèi)是 Component
146. NGUI:把子控件放在父控件里面,如何上下邊距都是 10。 給子控件設(shè)置上下兩個(gè)錨點(diǎn)為 10
147. 如何使子控件居中,如果使用 UGUI 怎么實(shí)現(xiàn) 設(shè)置子控件錨點(diǎn)為中心
148. 去掉敏感字的程序(手寫(xiě)程序) String s = "你是壞蛋";
s.Replace("壞蛋", "**");
149. unity3D 從喚醒到銷(xiāo)毀有一段生命周期,列出系統(tǒng)自己調(diào)用的重要方法。 Awake ()
OnEnable ()
Start()
FixedUpdate()
OnTriggerXXX(Collider other)OnCollisionXXX (Collision collisionInfo)
Update()
LateUpdate ()
OnGUI()
OnDisable ()
OnDestroy ()
150. Unity3d 中 resources 目錄一般用來(lái)放些什么,打包的時(shí)候會(huì)有什么影響? resource 一般用來(lái)放置一些需要?jiǎng)討B(tài)加載的資源,打包程序的時(shí)候會(huì)將 Resource 目錄下的全部文件都 加密壓縮打進(jìn)包內(nèi),這樣再想使用 assetbundle 方式打小包的話就不行了
151. 空間內(nèi)一物體繞球面固定點(diǎn)(0、1、2)按照固定速度 speed 環(huán)繞運(yùn)動(dòng)。 public float Speed = 1;
void Update () {
transform.RotateAround (new Vector3(0,1,2),Vector3.up,Speed);
}
152. 以下關(guān)于 WWW.LoadFromCacheOrDownload 描述正確的是: C A.可被用于將 Text Assets 自動(dòng)緩存到本地磁盤(pán)
B.可被用于將 Resource 自動(dòng)緩存到本地磁盤(pán)
C.可被用于將 Assets Bundles 自動(dòng)緩存到本地磁盤(pán)
D.可被用于將任意的 Unity 資源文件自動(dòng)緩存到本地磁盤(pán)
153. 以下哪個(gè)函數(shù)在游戲進(jìn)入新場(chǎng)景后會(huì)被馬上調(diào)用? C A:MonoBehaviour.OnSceneWasLoaded
B:MonoBehaviour.OnSceneEnter
C:MonoBehaviour.OnLevelWasLoaded
D:MonoBehaviour.OnLevelEnter
154. 關(guān)于 MonoBehavior.LateUpdate 函數(shù)描述錯(cuò)誤的是: B A.當(dāng) MonoBehavior 類(lèi)型應(yīng)用后,每幀調(diào)用一次
B.常被用于處理 RigidBody 的更新
C.在所有 Update 函數(shù)執(zhí)行后才能被調(diào)用
D.常被用于實(shí)現(xiàn)跟隨相機(jī)效果,且目標(biāo)物體的位置已經(jīng)在 Update 函數(shù)中被更新
155. 某個(gè) GameObject 有一個(gè)名為 MyScript 的腳本,該腳本中有一個(gè)名為 DoSomething 的函數(shù),則如何在該 GameObject 的另一個(gè)腳本中國(guó)調(diào)用該 函數(shù)? A A.GetComponent<MyScript>().DoSomething()
B.GetComponent<Script>("MyScript").DoSomething()
C.GetComponent< MyScript >().Call("DoSomething")
D.GetComponent<Script>("MyScript"). Call("DoSomething")
156. 啟用 MipMaps 對(duì)內(nèi)存的影響是? A A.增加約 33%的內(nèi)存
B.減少約 33%的內(nèi)存
C.增加約 25%的內(nèi)存
D.減少約 25%的內(nèi)存
157. 以下關(guān)于 MonoBehaviour.OnGUI()的描述的是: D A.如果 MonoBehaviour 沒(méi)有被啟用,則 OnGUI 函數(shù)不會(huì)被調(diào)用
B.用于繪制和處理 GUI events
C.每幀可能會(huì)被繪制多次,每次對(duì)應(yīng)于一個(gè) GUI event
D.每幀被調(diào)用一次
158. 采用 Input.mousePosition 來(lái)獲取鼠標(biāo)在屏幕上的位置,以下表述正確的 是: B A.左上角為原點(diǎn)(0, 0),右下角為(Screen.Width, Screen.Height)
B.左下角為原點(diǎn)(0, 0),右上角為(Screen.Height, Screen.Width)
C.左下角為原點(diǎn)(0, 0),右上角為(Screen.Width, Screen.Height)
D.左上角為原點(diǎn)(0, 0),右下角為(Screen.Height, Screen.Height)
159. 正確排列出下面 Unity 腳本自帶的函數(shù)執(zhí)行順序 Start,Awake,Update, OnUpdate,OnEnable,F(xiàn)ixedUpdate,OnGUI,LateUpdate、OnDisable、 OnDestory Awake-->OnEnable-->Start-->Update-->FixedUpdate-->LateUpdate-->OnGUI-->OnDisable -->OnDestory
160. Unity 中銷(xiāo)毀 GameObject 的方式,簡(jiǎn)述 Destroy 和 DestroyImmediate 的區(qū)別 Destroy 銷(xiāo)毀場(chǎng)景中的物體,但是內(nèi)存中它還是存在的,只有當(dāng)內(nèi)存不夠時(shí),機(jī)制才會(huì)將它銷(xiāo)毀并釋放 內(nèi)存。而 DestroyImmediate 會(huì)立即將對(duì)象銷(xiāo)毀,并且將內(nèi)存釋放。
161. Unity 中如何派發(fā)事件(消息) 在腳本里的 Update 函數(shù)里調(diào)用 EventDispatcher.Instance().OnTick();就可以了
162. ScriptObject 的作用和使用方式 ScriptObject 類(lèi)型經(jīng)常使用于存儲(chǔ)一些 Unity 本身不可以打包的一些 object,比如字符串,一些類(lèi)對(duì)象, 用這個(gè)類(lèi)型的子類(lèi)型可以用 BuildPipeline 打包成 assetbundle 包共后續(xù)使用,非常方便。
163. 如何檢測(cè)物體是否被其他對(duì)象遮擋 使用射線進(jìn)行檢測(cè)
164. 寫(xiě)一個(gè)角色控制器,鼠標(biāo)控制屏幕晃動(dòng),鼠標(biāo)控制開(kāi)槍。 public class Player : MonoBehaviour {
public GameObject _prefabBullet;
private float _angleSpeed = 120f;
void Update() {
float eularY = Input.GetAxis("Mouse X") * _angleSpeed * Time.deltaTime;
transform.Rotate(new Vector3(0, eularY, 0));
if (Input.GetMouseButtonDown(0)) {
Instantiate(_prefabBullet, transform.position, transform.rotation);
}
}
}
165. 敵人 AI,有各種狀態(tài),實(shí)現(xiàn)各種狀態(tài)之間的切換。 通過(guò)狀態(tài)機(jī)來(lái)實(shí)現(xiàn)各種狀態(tài)之間的切換
166. 1.寫(xiě)一個(gè)角色控制器,鼠標(biāo)控制屏幕晃動(dòng),鼠標(biāo)控制開(kāi)槍。 2.敵人 AI,有各種狀態(tài),實(shí)現(xiàn)各種狀態(tài)之間的切換。 3.敵人會(huì)和主角對(duì)抗,敵人被打到之后,會(huì)閃一次紅色,然后紅色比例提升 10%,10 次攻擊之后,成紅色。 4.敵人會(huì)自動(dòng)攻擊主角,主角也會(huì)有顏色變化。 5.敵人會(huì)在范圍內(nèi)巡邏。 6.UI,左邊顯示 8 個(gè) AI 的被攻擊次數(shù),右邊顯示 AI 的攻擊次數(shù)排序。 public class Player : MonoBehaviour {
public Camera _camera;
public GameObject _prefabBullet;
private float _angleSpeed = 120f;
//生命值
private int _life = 10;
//玩家的狀態(tài)
private bool _state = false;
//是否被打到
public void IsState() {
if (_state && _life > 0) {
_life -= 1;
_state = false;
} else {
_state = true;
}
}
public void RoleRotate() {
float eularY = Input.GetAxis("Mouse X") * _angleSpeed * Time.deltaTime;
}
//風(fēng)發(fā)射子彈
public void RoleShoot() {
if (Input.GetMouseButtonDown(0)) {
Instantiate(_prefabBullet, transform.position, transform.rotation);
}
}
}
public class Enemy : MonoBehaviour {
//敵人被打到狀態(tài)
private bool _state = false;
//玩家與敵人距離
private float _distance; //角色
public GameObject _role;
//生命值
private int _life = 10;
//敵人被攻擊次數(shù)
private int _timeAccack = 0;
//敵人狀態(tài)
public void EnemyState() {
if (_distance >= 10f) {
if (_life >= 1 && _state == true) {
_life -= 1;
_timeAccack++;
}
_state = false;
}
else if (_distance >= 0 && _state == false) {
_state = true;
}
}
//敵人與玩家距離
public void Distance() {
_distance = Vector3.Distance(transform.position, _role.transform.position);
}
void OnGUI() {
GUI.TextArea(new Rect(20, 50, 80, 30), _timeAccack.ToString());
GUI.TextArea(new Rect(20, 90, 80, 30), _timeAccack.ToString());
GUI.TextArea(new Rect(20, 130, 80, 30), _timeAccack.ToString());
}
}
167. 3D 空間有三個(gè) cube 當(dāng)做點(diǎn),有一條魚(yú)的模型,要求在三點(diǎn)之間游動(dòng),要 求轉(zhuǎn)向平滑一點(diǎn),控制魚(yú)的運(yùn)動(dòng)朝向(用四元數(shù)和歐拉角) 使用 transform.localRotation = Quaternion.Slerp(Quaternion a,Quaternion b,float c)實(shí)現(xiàn)物體平滑轉(zhuǎn)向
四、 Unity 性能優(yōu)化 168. lod 是什么,優(yōu)缺點(diǎn)是什么 LOD 技術(shù)即 Levels of Detail 的簡(jiǎn)稱,意為多細(xì)節(jié)層次。LOD 技術(shù)指根據(jù)物體模型的節(jié)點(diǎn)在顯示環(huán)境中所 處的位置和重要度,決定物體渲染的資源分配,降低非重要物體的面數(shù)和細(xì)節(jié)度,從而獲得高效率的渲染運(yùn)算。
優(yōu)點(diǎn):可根據(jù)距離動(dòng)態(tài)地選擇渲染不同細(xì)節(jié)的模型
缺點(diǎn):加重美工的負(fù)擔(dān),要準(zhǔn)備不同細(xì)節(jié)的同一模型,同樣的會(huì)稍微增加游戲的容量。
169. MipMap 是什么?作用? 在三維計(jì)算機(jī)圖形的貼圖渲染中有一個(gè)常用的技術(shù)被稱為 Mipmapping。為了加快渲染速度和減少圖像 鋸齒,貼圖被處理成由一系列被預(yù)先計(jì)算和優(yōu)化過(guò)的圖片組成的文件,這樣的貼圖被稱為 MIP map 或者 mipmap。
170. 當(dāng)游戲中需要頻繁創(chuàng)建一個(gè)物體對(duì)象時(shí),我們需要怎么做來(lái)節(jié)省內(nèi)存。 做一個(gè) pool,游戲開(kāi)始時(shí)預(yù)先實(shí)例化足夠的數(shù)量,然后用的時(shí)候取不用的時(shí)候收回
171. 如何優(yōu)化內(nèi)存? 有很多種方式,例如
1.壓縮自帶類(lèi)庫(kù);
2.將暫時(shí)不用的以后還需要使用的物體隱藏起來(lái)而不是直接 Destroy 掉;
3.釋放 AssetBundle 占用的資源;
4.降低模型的片面數(shù),降低模型的骨骼數(shù)量,降低貼圖的大?。?
5.使用光照貼圖,使用多層次細(xì)節(jié)(LOD),使用著色器(Shader),使用預(yù)設(shè)(Prefab)。
172. 動(dòng)態(tài)加載資源的方式?和區(qū)別 1.通過(guò) Resources 模塊,調(diào)用它的 load 函數(shù):可以直接 load 并返回某個(gè)類(lèi)型的 Object,前提是要把這 個(gè)資源放在 Resource 命名的文件夾下,Unity 不關(guān)有沒(méi)有場(chǎng)景引用,都會(huì)將其全部打入到安裝包中。 Resources.Load();
2.通過(guò) bundle 的形式: 即將資源打成 asset bundle 放在服務(wù)器或本地磁盤(pán), 然后使用 WWW 模塊 get 下來(lái), 然后從這個(gè) bundle 中 load 某個(gè) object。
3.通過(guò) AssetDatabase.loadasset :這種方式只在 editor 范圍內(nèi)有效,游戲運(yùn)行時(shí)沒(méi)有這個(gè)函數(shù), 它通常 是在開(kāi)發(fā)中調(diào)試用的 【AssetDatabase 資源數(shù)據(jù)庫(kù)】
區(qū)別:Resources 的方式需要把所有資源全部打入安裝包,這對(duì)游戲的分包發(fā)布(微端)和版本升級(jí)(patch)是不利的,所以 unity 推薦的方式是不用它, 都用 bundle 的方式替代, 把資源達(dá)成幾個(gè)小 的 bundle, 用哪個(gè)就 load 哪個(gè),這樣還能分包發(fā)布和 patch,但是在開(kāi)發(fā)過(guò)程中,不可能沒(méi)更新一個(gè) 資源就打一次 bundle, 所以 editor 環(huán)境下可以使用 AssetDatabase 來(lái)模擬,這通常需要我們封裝一個(gè) dynamic resource 的 loader 模塊,在不同的環(huán)境下做不同實(shí)現(xiàn)。
動(dòng)態(tài)資源的存放
有時(shí)我需要存放一些自己的文件在磁盤(pán)上,例如我想把幾個(gè) bundle 放在初始的安裝里, unity 有一個(gè) streaming asset 的概念,用于提供存儲(chǔ)接口的訪問(wèn)。我們需要在編輯器建立一個(gè) StreamingAssets 名字 的文件夾,把需要我們放在客戶磁盤(pán)上的動(dòng)態(tài)文件放在這個(gè)文件夾下面,這樣安裝后,這些文件會(huì)放在用戶磁盤(pán)的指定位置,這個(gè)位置可以通過(guò) Application.streamingAssetsPath 來(lái)得到。
173. 請(qǐng)簡(jiǎn)述一下對(duì)象池原理,什么情況下使用? 對(duì)象池背后的理念其實(shí)是非常簡(jiǎn)單的。我們將對(duì)象存儲(chǔ)在一個(gè)池子中,當(dāng)需要時(shí)在再次使用,而不是 每次都實(shí)例化一個(gè)新的對(duì)象。池的最重要的特性,也就是對(duì)象池設(shè)計(jì)模式的本質(zhì)是允許我們獲取一個(gè)“新的”對(duì)象而不管它真的是一個(gè)新的對(duì)象還是循環(huán)使用的對(duì)象。 對(duì)象池通常用于在那些需要經(jīng)常創(chuàng)建又銷(xiāo)毀的對(duì)象比如我們場(chǎng)景中的小怪,經(jīng)常需要?jiǎng)?chuàng)建和銷(xiāo)毀,我 們就可以在小怪銷(xiāo)毀的時(shí)候,不真正的銷(xiāo)毀而是,而是把它放入對(duì)象池中等到下一次我們需要?jiǎng)?chuàng)建小怪的時(shí)候,再?gòu)膶?duì)象池中取出來(lái)。
174. 使用 mipmap 有什么好處?什么情況下使用? Mipmap 紋理技術(shù)是目前解決紋理分辨率與視點(diǎn)距離關(guān)系的最有效途徑,它會(huì)先將圖片壓縮成很多逐漸 縮小的圖片,例如一張 64*64 的圖片,會(huì)產(chǎn)生 64*64,32*32,16*16,8*8,4*4,2*2,1*1 的 7 張圖片,當(dāng)屏幕上需 要繪制像素點(diǎn)為 20*20 時(shí),程序只是利用 32*32 和 16*16 這兩張圖片來(lái)計(jì)算出即將顯示為 20*20 大小 的一個(gè)圖片,這比單獨(dú)利用 32*32 的那張?jiān)计?jì)算出來(lái)的圖片效果要好得多,速度也更快。
175. Unity 內(nèi)存優(yōu)化? GC 垃圾回收
176. 你認(rèn)為 unity 在開(kāi)發(fā)過(guò)程中哪些地方比較容易造成內(nèi)存泄漏和內(nèi)存泄漏 問(wèn)題?如何避免? 腳本做載入不刪除處理時(shí),往往腳本中還有一些不用的變量,容易導(dǎo)致內(nèi)容泄漏
177. 使用 NGUI 開(kāi)發(fā)滾動(dòng)視圖,當(dāng)滾動(dòng)列表達(dá)到幾百條的時(shí)候,如何才能保 證界面的滾動(dòng)流暢運(yùn)行 1. 每個(gè)滾動(dòng)條目都是同一個(gè)預(yù)設(shè)體的實(shí)例
2.做緩存,只要實(shí)例化視野范圍內(nèi)滾動(dòng)條目,往上超出視野部分,自動(dòng)填補(bǔ)到視野的下面
178. 如何解決過(guò)多創(chuàng)建和刪除對(duì)象帶來(lái)的卡頓問(wèn)題 對(duì)象池,把不用對(duì)象緩存到一個(gè)對(duì)象列表中
179. Unity 資源加載的有幾種方式,簡(jiǎn)述 asset bundie 1. 直接在腳本中 public 一個(gè)對(duì)象,然后在監(jiān)視器面板進(jìn)行賦值
2. 直接在程序中進(jìn)行 find 查找
3. Resource.load
4. 把資源打成 Assetbudle,然后用的時(shí)候 load 進(jìn)來(lái) assetbundle 就是對(duì)資源的打包處理,同時(shí)這種資源格式便于從互聯(lián)網(wǎng)上下載
180. 背包系統(tǒng)中只有 20 個(gè)格子,現(xiàn)在有總共有 100 個(gè)物體,除了顯示在 視野中的 20 個(gè)外,對(duì)其他的處理方法?(注:將其他隱藏起來(lái)不可行,對(duì)象池得有具體的說(shuō)明) 1. 每個(gè)滾動(dòng)條目都是同一個(gè)預(yù)設(shè)體的實(shí)例
2. 做緩存,只要實(shí)例化視野范圍內(nèi)滾動(dòng)條目,往上超出視野部分,自動(dòng)填補(bǔ)到視野的下面
五、 服務(wù)器數(shù)據(jù)庫(kù)等雜項(xiàng) 181. Unity 連接數(shù)據(jù)庫(kù) 需要得到 Mono.Data.Sqlite.dll 文件與 System.Data.dll 文件
182. 如何與服務(wù)器交互 做游戲,基本上都避免不了與服務(wù)器端交互,與服務(wù)器端交互的方式也有幾種,總結(jié)起來(lái)就是長(zhǎng)連接模式(Socket)與短鏈接模式(Http)。
183. 如何處理網(wǎng)絡(luò)異常下的可玩性 1)為游戲增加單機(jī)模式:比如故事模塊,網(wǎng)絡(luò)異常時(shí)可以閱讀游戲的故事;豐富的技能或卡牌,網(wǎng)絡(luò)異常時(shí)可以了解技能和卡牌;提供單機(jī)玩法,玩家可以與 AI 進(jìn)行游戲等。
2)為游戲提供教程模塊,網(wǎng)絡(luò)異常時(shí)可以學(xué)習(xí)游戲技巧。
184. 怎樣反外掛? 對(duì)外掛的看法 游戲外掛的原理:外掛分為多種,比如模擬鍵盤(pán)的,鼠標(biāo)的;修改數(shù)據(jù)包的;修改本地內(nèi)存的。
1)對(duì)于模擬用戶的鼠標(biāo)鍵盤(pán)輸入的外掛,我們可以用網(wǎng)頁(yè)上常用的驗(yàn)證碼的方式來(lái)對(duì)付。模擬鍵盤(pán)鼠
標(biāo)的外掛對(duì)游戲的影響比加速、修改封包、修改內(nèi)存、脫機(jī)等要小得多,因此被一些人稱為綠色外掛。2)讓服務(wù)器不把在正常情況下玩家看不到的東西的數(shù)據(jù)傳送給客戶端。
3)把玩家操作記錄發(fā)到服務(wù)器進(jìn)行模擬,如果和客戶端的計(jì)算結(jié)果偏差較大可以認(rèn)為作弊。
185. 你對(duì)跨平臺(tái)的了解。 跨平臺(tái)就是在一個(gè)熟悉的平臺(tái)上面開(kāi)發(fā)的軟件或者程序,直接可以在其他平臺(tái)上正常的運(yùn)行顯示而不 需要對(duì)其原始文件或者原始代碼進(jìn)行修改。
186. 談?wù)勀銈児镜木W(wǎng)絡(luò)編程 在我們公司基本是由服務(wù)端人員開(kāi)發(fā)的,我這邊只調(diào)用他們提供的客戶端 SDK 和服務(wù)器端通信。服務(wù) 器端是公司用 C++自行研發(fā)的。
187. 會(huì)做數(shù)據(jù)庫(kù)嗎?有嵌套的數(shù)據(jù)庫(kù)能做么? 會(huì)。用過(guò)關(guān)系型數(shù)據(jù)庫(kù) mysql。能做,只是這方面之前在公司沒(méi)怎么負(fù)責(zé)這塊,有些生疏,稍微熟悉一下就能做。(社區(qū)提供持續(xù)更新版本)
188. 了解代碼管理么?在開(kāi)發(fā)中使用什么代碼管理工具?使用的接口多一點(diǎn)還是繼承多一點(diǎn)? 了解。使用 SVN 進(jìn)行代碼管理。接口多一點(diǎn)。
189. 公司內(nèi)部信息傳遞用的什么安全協(xié)議? 1、公司自定義的安全協(xié)議 或者 基于 SSL/TLS 協(xié)議 或者 SSH 協(xié)議
2、我們至少調(diào)用基于相關(guān)協(xié)議的 SDK
3、SSL/TLS 協(xié)議
SSL/TLS 協(xié)議(RFC2246 RFC4346)處于 TCP/IP 協(xié)議與各種應(yīng)用層協(xié)議之間,為數(shù)據(jù)通訊提供安全支持。從協(xié)議內(nèi)部的功能層面上來(lái)看,SSL/TLS 協(xié)議可分為兩層:
1. SSL/TLS 記錄協(xié)議(SSL/TLS Record Protocol),它建立在可靠的傳輸層協(xié)議(如 TCP)之上,為上層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能。2. SSL/TLS 握手協(xié)議(SSL/TLS Handshake Protocol),它建立SSL/TLS 記錄協(xié)議之上,用于在實(shí)際的數(shù)據(jù)傳輸開(kāi)始前,通訊雙方進(jìn)行身份認(rèn)證、協(xié)商加密算法、交換加密密鑰等初始化協(xié)商功能。SSH 是英文 Secure Shell 的簡(jiǎn)寫(xiě)形式。通過(guò)使用 SSH,你可以把所有傳輸?shù)臄?shù)據(jù)進(jìn)行加密,這樣”中間人”這種攻擊方式就不可能實(shí)現(xiàn)了,而且也能夠防止 DNS 欺騙和 IP 欺騙。使用 SSH,還有一個(gè)額外的好處就是傳輸?shù)臄?shù)據(jù)是經(jīng)過(guò)壓縮的,所以可以加快傳輸?shù)乃俣?。SSH 有很多功能,它既可以代替 Telnet,又可以為 FTP、Pop、甚至為 PPP 提供一個(gè)安全的”通道”。
190. 原公司服務(wù)器怎么實(shí)現(xiàn)多人在線? 使用 socket 基于 TCP 協(xié)議開(kāi)發(fā)的多人在線。公司有自行開(kāi)發(fā)的服務(wù)端程序
191. 項(xiàng)目問(wèn)題,和美工想法沖突了怎么辦? 找項(xiàng)目主管協(xié)調(diào)處理
192. 對(duì) unity 的理解 可以做 VR、手游、工藝仿真、端游、頁(yè)游跨平臺(tái)的游戲引擎
193. 面試題:VR 相關(guān)問(wèn)題用了哪些設(shè)備?接入了哪些 SDK?根據(jù)項(xiàng)目問(wèn)如 何實(shí)現(xiàn)手勢(shì)控制? htc vive 和 oculus, htc vive 用到的是 steam vr 免費(fèi)插件,Oculus 早期有 SDK,現(xiàn)在 Unity 原生支持
194. 開(kāi)過(guò)什么平臺(tái)?多線程的理解 PC、Android。
多線程是指從軟件或者硬件上實(shí)現(xiàn)多個(gè)線程并發(fā)執(zhí)行的技術(shù)。具有多線程能力的計(jì)算機(jī)因有硬件支持而能夠在同一時(shí)間執(zhí)行多于一個(gè)線程,進(jìn)而提升整體處理性能。使用線程可以把占據(jù)時(shí)間長(zhǎng)的程序中的任務(wù)放到后臺(tái)去處理用戶界面可以更加吸引人,這樣比如用戶點(diǎn)擊了一個(gè)按鈕去觸發(fā)某些事件的處理,可以彈出一個(gè)進(jìn)度條來(lái)顯示處理的進(jìn)度,程序的運(yùn)行速度可能加快,在一些等待的任務(wù)實(shí)現(xiàn)上如用戶輸入、文件讀寫(xiě)和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如內(nèi)存占用等等。
195. 怎樣實(shí)現(xiàn)植物的彎曲 1、max 做骨骼動(dòng)畫(huà)2、修改 Tree 組件的 Growth Angle 的值
196. 用過(guò)什么游戲框架? SimpleFramework,基于 ulua 的框架,支持 ugui 和 ngui 的熱更新
197. 模型導(dǎo)入 Unity 后怎么與數(shù)據(jù)庫(kù)產(chǎn)生聯(lián)系?類(lèi)似打通程序和數(shù)據(jù)庫(kù)通 道 例如 mysql 數(shù)據(jù)庫(kù),需要導(dǎo)入兩個(gè)文件,就可以通過(guò) sql 語(yǔ)句往數(shù)據(jù)庫(kù)寫(xiě)數(shù)據(jù),數(shù)據(jù)可以是模型信息
198. 用過(guò)什么傳輸協(xié)議,用什么語(yǔ)言 http,tcp(socket) 都是 C# 語(yǔ)言編寫(xiě)
199. 都在什么平臺(tái)上開(kāi)發(fā)過(guò)游戲或軟件用的什么框架 Android
200. 會(huì)寫(xiě)框架么 設(shè)計(jì)模式了解一些,但是沒(méi)寫(xiě)過(guò)框架
201. 請(qǐng)簡(jiǎn)述在客戶端開(kāi)發(fā)方面 你最擅長(zhǎng)的模塊系統(tǒng),以及你覺(jué)得哪些模塊 會(huì)出現(xiàn)的問(wèn)題 擅長(zhǎng) UI 模塊的制作,我認(rèn)為熱更新模塊會(huì)出現(xiàn)問(wèn)題,比如資源依賴不合理,導(dǎo)致資源包過(guò)大
202. 如何實(shí)現(xiàn)背包系統(tǒng)、寵物系統(tǒng)、裝備系統(tǒng)的實(shí)時(shí)更新? NGUI 做界面,使用 ulua 做熱更新。之前公司使用的是 SimpleFramework 這樣的框架。
203. 熱更新的解決方案(資源以及代碼) ulua 框架、simpleFramework 框架 、bundle manager 插件
六、 數(shù)據(jù)結(jié)構(gòu)算法相關(guān) 204. 對(duì)數(shù)據(jù)結(jié)構(gòu)了解嗎?說(shuō)說(shuō)你常用的數(shù)據(jù)結(jié)構(gòu)。 了解,數(shù)據(jù)結(jié)構(gòu)是每個(gè)程序員都要會(huì)一點(diǎn)的。鏈表、列表、散列表最常用,隊(duì)列和棧也經(jīng)常使用。二叉樹(shù)偶爾使用。
205. 什么是狀態(tài)機(jī),什么是行為樹(shù) 有限狀態(tài)機(jī)系統(tǒng):是指在不同階段會(huì)呈現(xiàn)出不同的運(yùn)行狀態(tài)的系統(tǒng),這些狀態(tài)是有限的、不重疊的。這樣的系統(tǒng)在某一時(shí)刻一定會(huì)處于其所有狀態(tài)中的一個(gè)狀態(tài),此時(shí)它接收一部分允許的輸入,產(chǎn)生一部分可能的響應(yīng),并且遷移到一部分可能的狀態(tài)。
1. 基本節(jié)點(diǎn)是狀態(tài):他包含了一系列運(yùn)行在該狀態(tài)的行為以及離開(kāi)這個(gè)狀態(tài)的條件。
2. 狀態(tài)可以任意跳轉(zhuǎn),實(shí)現(xiàn)簡(jiǎn)單,但是對(duì)于大的狀態(tài)機(jī)很難維護(hù).狀態(tài)邏輯的重用性低.
3. 每一個(gè)狀態(tài)的邏輯會(huì)隨著一些新?tīng)顟B(tài)的增加而越來(lái)越復(fù)雜。維持狀態(tài)的數(shù)量和狀態(tài)邏輯復(fù)雜性是一個(gè)很大的難點(diǎn)。需要合理的分割以及重用狀態(tài)。
4. 狀態(tài)機(jī)狀態(tài)的復(fù)用性很差,一旦一些因素變化導(dǎo)致這個(gè)環(huán)境發(fā)生變化。你只能新增一個(gè)狀態(tài),并且給這個(gè)新?tīng)顟B(tài)添加連接他以及其他狀態(tài)的跳轉(zhuǎn)邏輯。
5. 狀態(tài)機(jī)的跳轉(zhuǎn)條件一旦不滿足,就會(huì)一直卡在某一個(gè)狀態(tài)。
行為樹(shù):一個(gè)流行的 AI 技術(shù),涵蓋了層次狀態(tài)機(jī),事件調(diào)度,事件計(jì)劃,行為等一系列技術(shù)。
1. 高度模塊化狀態(tài),去掉狀態(tài)中的跳轉(zhuǎn)邏輯,使得狀態(tài)變成一個(gè)“行為”。
2. “行為”和”行為”之間的跳轉(zhuǎn)是通過(guò)父節(jié)點(diǎn)的類(lèi)型來(lái)決定的。比如并行處理兩個(gè)行為,在狀態(tài)機(jī)里面無(wú)法同時(shí)處理兩個(gè)狀態(tài)。
3. 通過(guò)增加控制節(jié)點(diǎn)的類(lèi)型,可以達(dá)到復(fù)用行為的目的。
4. 可視化編輯。
206. 對(duì) List 的理解 有序的對(duì)象列表,屬于數(shù)據(jù)結(jié)構(gòu)的一種:順序結(jié)構(gòu)
泛型集合類(lèi),引入 System.Collections.Generic 命名空間,
常用操作有,Count 屬性查看長(zhǎng)度,Add()添加,Remove()去除,AddRange()添加集合,Clear()清空集合。
207. 數(shù)組和 List 的核心區(qū)別 數(shù)組在 C#中最早出現(xiàn)的。在內(nèi)存中是連續(xù)存儲(chǔ)的,所以它的索引速度非???,而且賦值與修改元素也很簡(jiǎn)單。
數(shù)組存在一些不足的地方。在數(shù)組的兩個(gè)數(shù)據(jù)間插入數(shù)據(jù)是很麻煩的,而且在聲明數(shù)組的時(shí)候必須指定數(shù)組的長(zhǎng)度,數(shù)組的長(zhǎng)度過(guò)長(zhǎng),會(huì)造成內(nèi)存浪費(fèi),過(guò)段會(huì)造成數(shù)據(jù)溢出的錯(cuò)誤。如果在聲明數(shù)組時(shí)我們不清楚數(shù)組的長(zhǎng)度,就會(huì)變得很麻煩。
List<T>是集合,集合元素的數(shù)量可以動(dòng)態(tài)變化。增加、插入、刪除元素很方便。
208. 數(shù)據(jù)結(jié)構(gòu)的看法 具有一定關(guān)系的數(shù)據(jù)元素集合,好的數(shù)據(jù)結(jié)構(gòu)有利于簡(jiǎn)化算法的編寫(xiě)
209. 深度優(yōu)化會(huì)么 會(huì)一點(diǎn),比如在代碼消耗上經(jīng)常使用 StopWatch 類(lèi)去優(yōu)化算法,通常用 IDisposable 去顯式的釋放資源。
210. 實(shí)現(xiàn)二分要什么條件 有序結(jié)構(gòu)
211. c++,socket 網(wǎng)絡(luò)編程會(huì)不會(huì) C++上學(xué)的時(shí)候?qū)W過(guò),工作之后一直沒(méi)用過(guò)。
Socket 就是一套實(shí)現(xiàn)雙向通信的 API。使用過(guò) C#的 TCP(面向連接、可靠)和 UDP 連接(面向非連接、不可靠)
212. 二叉樹(shù)的所有遍歷方式的原理及優(yōu)缺點(diǎn) 前序遍歷,先訪問(wèn)根節(jié)點(diǎn)在訪問(wèn)左節(jié)點(diǎn)在訪問(wèn)右節(jié)點(diǎn)。
中序遍歷,先訪問(wèn)左節(jié)點(diǎn)在訪問(wèn)根節(jié)點(diǎn)在訪問(wèn)右節(jié)點(diǎn)。
后序遍歷,先訪問(wèn)左節(jié)點(diǎn)在訪問(wèn)右節(jié)點(diǎn)在訪問(wèn)根節(jié)點(diǎn)。
前中后代表的是訪問(wèn)根節(jié)點(diǎn)的時(shí)序。
這一點(diǎn)上沒(méi)有什么本質(zhì)上的優(yōu)缺點(diǎn),要看實(shí)際需求決定采用何種遍歷方式
采用遞歸方式和非遞歸方式。前者優(yōu)點(diǎn)是直觀,編寫(xiě)起來(lái)簡(jiǎn)單,缺點(diǎn)是但其開(kāi)銷(xiāo)也比較大。非遞歸形式開(kāi)銷(xiāo)小,但編寫(xiě)復(fù)雜。
213. 數(shù)據(jù)結(jié)構(gòu)中數(shù)組和鏈表各有什么特點(diǎn),什么場(chǎng)合下應(yīng)該使用數(shù)組,什么 場(chǎng)合下應(yīng)該使用鏈表 二者都屬于一種數(shù)據(jù)結(jié)構(gòu)
從邏輯結(jié)構(gòu)來(lái)看
1. 數(shù)組必須事先定義固定的長(zhǎng)度(元素個(gè)數(shù)),不能適應(yīng)數(shù)據(jù)動(dòng)態(tài)地增減的情況。當(dāng)數(shù)據(jù)增加時(shí),可能超出原先定義的元素個(gè)數(shù);當(dāng)數(shù)據(jù)減少時(shí),造成內(nèi)存浪費(fèi);數(shù)組可以根據(jù)下標(biāo)直接存取。
2. 鏈表動(dòng)態(tài)地進(jìn)行存儲(chǔ)分配,可以適應(yīng)數(shù)據(jù)動(dòng)態(tài)地增減的情況,且可以方便地插入、刪除數(shù)據(jù)項(xiàng)。(數(shù)組中插入、刪除數(shù)據(jù)項(xiàng)時(shí),需要移動(dòng)其它數(shù)據(jù)項(xiàng),非常繁瑣)鏈表必須根據(jù) next 指針找到下一個(gè)元素從內(nèi)存存儲(chǔ)來(lái)看1. (靜態(tài))數(shù)組從棧中分配空間, 對(duì)于程序員方便快速,但是自由度小
2. 鏈表從堆中分配空間, 自由度大但是申請(qǐng)管理比較麻煩。從上面的比較可以看出,如果需要快速訪問(wèn)數(shù)據(jù),很少或不插入和刪除元素,就應(yīng)該用數(shù)組;相反,如果需要經(jīng)常插入和刪除元素就需要用鏈表數(shù)據(jù)結(jié)構(gòu)了。
七、 設(shè)計(jì)模式相關(guān) 214. 用過(guò)哪些設(shè)計(jì)模式?談?wù)勛约罕容^熟悉的設(shè)計(jì)模式 1、工廠模式 2、代理模式 3、策略模式 4、觀察者模式 6、單例模式
工廠模式:簡(jiǎn)單工廠模式解決的問(wèn)題是如何去實(shí)例化一個(gè)合適的對(duì)象。
簡(jiǎn)單工廠模式的核心思想就是:有一個(gè)專(zhuān)門(mén)的類(lèi)來(lái)負(fù)責(zé)創(chuàng)建實(shí)例的過(guò)程。凡是出現(xiàn)了大量的產(chǎn)品需要?jiǎng)?chuàng)建,并且具有共同的接口時(shí),可以通過(guò)工廠方法模式進(jìn)行創(chuàng)建。比如說(shuō)寫(xiě)技能是一系列類(lèi),那么就可以使用工廠模式創(chuàng)建。
代理模式:一個(gè)是真正的你要訪問(wèn)的對(duì)象(目標(biāo)類(lèi)),一個(gè)是代理對(duì)象,真正對(duì)象與代理對(duì)象實(shí)現(xiàn)同一個(gè)接口,先訪問(wèn)代理類(lèi)再訪問(wèn)真正要訪問(wèn)的對(duì)象。代理模式就是多一個(gè)代理類(lèi)出來(lái),替原對(duì)象進(jìn)行一些操作,比如我們?cè)谧夥孔拥臅r(shí)候回去找中介,為什么呢?因?yàn)槟銓?duì)該地區(qū)房屋的信息掌握的不夠全面,希望找一個(gè)更熟悉的人去幫你做,此處的代理就是這個(gè)意思。再如我們有的時(shí)候打官司,我們需要請(qǐng)律師,因?yàn)槁蓭熢诜煞矫嬗袑?zhuān)長(zhǎng),可以替我們進(jìn)行操作,表達(dá)我們的想法。
代理模式的應(yīng)用場(chǎng)景:
如果已有的方法在使用的時(shí)候需要對(duì)原有的方法進(jìn)行改進(jìn),此時(shí)有兩種辦法:
1、修改原有的方法來(lái)適應(yīng)。這樣違反了“對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉”的原則。
2、就是采用一個(gè)代理類(lèi)調(diào)用原有的方法,且對(duì)產(chǎn)生的結(jié)果進(jìn)行控制。這種方法就是代理模式。
使用代理模式,可以將功能劃分的更加清晰,有助于后期維護(hù)!
其實(shí),簡(jiǎn)單來(lái)講就一句 使用算法的客戶。策略模式的決定權(quán)在用戶,系統(tǒng)本身提供不同算法的實(shí)現(xiàn),新增或者刪除算法,對(duì)各種算法做封裝。因此,策略模式多用在算法決策系統(tǒng)中,外部用戶只需要決定用哪個(gè)算法即可。
觀察者模式很好理解,類(lèi)似于郵件訂閱和 RSS 訂閱,當(dāng)我們?yōu)g覽一些博客或 wiki 時(shí),經(jīng)常會(huì)看到 RSS 標(biāo),就這的意思是,當(dāng)你訂閱了該文章,如果后續(xù)有更新,會(huì)及時(shí)通知你。其實(shí),簡(jiǎn)單來(lái)講就一句話:當(dāng)一個(gè)對(duì)象變化時(shí),其它依賴該對(duì)象的對(duì)象都會(huì)收到通知,并且隨著變化!對(duì)象之間是一種一對(duì)多的關(guān)系。
單例對(duì)象(Singleton)是一種常用的設(shè)計(jì)模式。在 C#應(yīng)用中,單例對(duì)象能保證在一個(gè) CLR 中,該對(duì)象
只有一個(gè)實(shí)例存在。這樣的模式有幾個(gè)好處:
1、某些類(lèi)創(chuàng)建比較頻繁,對(duì)于一些大型的對(duì)象,這是一筆很大的系統(tǒng)開(kāi)銷(xiāo)。
2、省去了 new 操作符,降低了系統(tǒng)內(nèi)存的使用頻率,減輕 GC 壓力。
3、有些類(lèi)如交易所的核心交易引擎,控制著交易流程,如果該類(lèi)可以創(chuàng)建多個(gè)的話,系統(tǒng)完全亂了。
(比如一個(gè)軍隊(duì)出現(xiàn)了多個(gè)司令員同時(shí)指揮,肯定會(huì)亂成一團(tuán)),所以只有使用單例模式,才能保證核
心交易服務(wù)器獨(dú)立控制整個(gè)流程。
215. 請(qǐng)說(shuō)出 4 種面向?qū)ο蟮脑O(shè)計(jì)原則,并分別簡(jiǎn)述它們的含義。 1) 單一職責(zé)原則 (The Single Responsiblity Principle,簡(jiǎn)稱
SRP):一個(gè)類(lèi),最好只做一件事,只有一個(gè)引起它的變化.
2) 開(kāi)放-封閉原則 (The Open-Close Principle,簡(jiǎn)稱
OCP):對(duì)于擴(kuò)展是開(kāi)放的,對(duì)于更改是封閉的
3) Liskov 替換原則(The Liskov Substitution Principle,簡(jiǎn)稱
LSP):子類(lèi)必須能夠替換其基類(lèi)
4) 依賴倒置原則 (The Dependency Inversion Pricinple, 簡(jiǎn)稱
DIP):依賴于抽象
5) 接口隔離原則 (The Interface Segregation Principle,簡(jiǎn)稱
ISP):使用多個(gè)小的專(zhuān)門(mén)的接口,而不要使用一個(gè)大的總接口。
216. 設(shè)計(jì)一個(gè)狀態(tài)機(jī)類(lèi)型,狀態(tài)值為 int 類(lèi)型,要求: 擁有接口,獲取當(dāng)前狀態(tài),切換狀態(tài)
外部可以監(jiān)聽(tīng)狀態(tài)切換事件,參數(shù)為切換前狀態(tài)和切換后狀態(tài)(使用 delete 和 event)//定義一個(gè)狀態(tài)
public abstract class IAction{
public int StateName;
public IAction(int stateName) {
this.StateName = stateName;
}
public int GetState(){
return StateName;
}
public abstract bool CanGetIn();
public abstract void GetIn();
public abstract void GetOut();
public abstract void Update(float dt);
}
//定義一個(gè)狀態(tài)切換事件
public abstract class IEvent {
public int code;
public IEvent(int code) {
this.code = code;
}
public int GetCode(){
return code;
}
//當(dāng)前狀態(tài)事件檢測(cè)
public abstract bool Check();
}
public class AvatarStateMachine{
//初始化狀態(tài)機(jī)public void InitStateMachine(){}
//注冊(cè)一個(gè)狀態(tài)
public void AddAction(int action) {}
//注冊(cè)一個(gè)狀態(tài)切換事件
public void AddEventTransition(int fromAction, int toAction, IEvent byEvent) {}
//更新當(dāng)前狀態(tài),檢測(cè)能否進(jìn)入下一個(gè)狀態(tài)
public void UpdateStateMachine(){}
//強(qiáng)行切換狀態(tài)
public void SwitchTo(int toState) {}
}
217. 如何處理 unity 中界面資源,界面邏輯以及功能模塊三者之間耦合關(guān)系 這就是在 Unity 使用 MVC 時(shí)通常將功能模塊盡量脫離脫離 MonoBehavior,同一個(gè)模塊內(nèi) M 只用來(lái)操
作數(shù)據(jù)并發(fā)送更新消息,V 只用來(lái)接受消息并控制界面顯示跳轉(zhuǎn),使用 C 來(lái)處理界面與數(shù)據(jù)的頻繁操
作。
218. 觀察者模式的深入理解? 觀察者模式:一對(duì)多的關(guān)系,當(dāng)被觀察這發(fā)生改變時(shí)會(huì)通知所有觀察者。讓雙方都依賴于抽象,使得
各自變化不會(huì)影響另一方。
219. MVC 模式 用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面,在改進(jìn)和
個(gè)性化定制界面及用戶交互的同時(shí),不需要重新編寫(xiě)業(yè)務(wù)邏輯。
八、 圖形學(xué)相關(guān) 220. 簡(jiǎn)述四元數(shù)的作用,四元數(shù)對(duì)歐拉角的優(yōu)點(diǎn)? 四元數(shù)用于表示旋轉(zhuǎn)
A.四元數(shù)一般定義如下:q=w+xi+yj+zk 其中 w,x,y,z 是實(shí)數(shù)。同時(shí),有: i*i=-1 j*j=-1 k*k=-1
B.四元數(shù)也可以表示為:q=[w,v] 有多種方式可表示旋轉(zhuǎn),如 axis/angle、歐拉角(Euler angles)、矩陣
(matrix)、四元組等。 相對(duì)于其它方法,四元組有其本身的優(yōu)點(diǎn):
a.四元數(shù)不會(huì)有歐拉角存在的 gimbal lock 問(wèn)題[萬(wàn)向節(jié)死鎖]
b.四元數(shù)由 4 個(gè)數(shù)組成,旋轉(zhuǎn)矩陣需要 9 個(gè)數(shù)
c.兩個(gè)四元數(shù)之間更容易插值
d. 四 元 數(shù) 、 矩 陣 在 多 次 運(yùn) 算 后 會(huì) 積 攢 誤 差 , 需 要 分 別 對(duì) 其 做 規(guī) 范 化 (normalize) 和 正 交 化
(orthogonalize),對(duì)四元數(shù)規(guī)范化更容易e.與旋轉(zhuǎn)矩陣類(lèi)似,兩個(gè)四元組相乘可表示兩次旋轉(zhuǎn)
221. 向量的點(diǎn)乘、叉乘以及歸一化的意義? 1)點(diǎn)乘描述了兩個(gè)向量的相似程度,結(jié)果越大兩向量越相似,還可表示投影
2)叉乘得到的向量垂直于原來(lái)的兩個(gè)向量
3)標(biāo)準(zhǔn)化向量:用在只關(guān)系方向,不關(guān)心大小的時(shí)候
222. 矩陣相乘的意義及注意點(diǎn) 用于表示線性變換:旋轉(zhuǎn)、縮放、投影、平移、仿射
注意矩陣的蠕變:誤差的積累
223. alpha blend 工作原理 實(shí)際顯示顏色 = 前景顏色*Alpha/255 + 背景顏色*(255-Alpha)/255
224. 寫(xiě)光照計(jì)算中的 diffuse 的計(jì)算公式 實(shí)際光照強(qiáng)度 I= 環(huán)境光(Iambient) + 漫反射光(Idiffuse) + 鏡面高光(Ispecular);
環(huán)境光:Iambient= Aintensity* Acolor; (Aintensity 表示環(huán)境光強(qiáng)度,Acolor 表示環(huán)境光顏色)
漫反射光:Idiffuse = Dintensity*Dcolor*N.L;(Dintensity 表示漫反射強(qiáng)度,Dcolor 表示漫反射光顏色,N
為該點(diǎn)的法向量,L 為光源向量)
鏡面反射光:Ispecular = Sintensity*Scolor*(R.V)^n;(Sintensity 表示鏡面光照強(qiáng)度,Scolor 表示鏡面光顏色,
R 為光的反射向量,V 為觀察者向量,n 稱為鏡面光指數(shù))
225. 兩種陰影判斷的方法工作原理 陰影由兩部分組成:本影與半影
本影:景物表面上那些沒(méi)有被光源直接照射的區(qū)域(全黑的輪廓分明的區(qū)域)
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的區(qū)域(半明半暗區(qū)
域)
求陰影區(qū)域的方法:做兩次消隱過(guò)程
一次對(duì)每個(gè)光源進(jìn)行消隱,求出對(duì)于光源而言不可見(jiàn)的區(qū)域 L;
一次對(duì)視點(diǎn)的位置進(jìn)行消隱,求出對(duì)于視點(diǎn)而言可見(jiàn)的面 S;
shadow area = L ∩
S
陰影分為兩種:自身陰影和投射陰影
自身陰影:因物體自身的遮擋而使光線照射不到它上面的某些可見(jiàn)面
工作原理:利用背面剔除的方法求出,即假設(shè)視點(diǎn)在點(diǎn)光源的位置。
投射陰影:因不透明物體遮擋光線使得場(chǎng)景中位于該物體后面的物體或區(qū)域受不到光照照射而形成的
陰影工作原理:從光源處向物體的所有可見(jiàn)面投射光線,將這些面投影到場(chǎng)景中得到投影面,再將這些投
影面與場(chǎng)景中的其他平面求交得出陰影多邊形,保存這些陰影多邊形信息,然后再按視點(diǎn)位置對(duì)場(chǎng)景
進(jìn)行相應(yīng)處理得到所要求的視圖(利用空間換時(shí)間,每次只需依據(jù)視點(diǎn)位置進(jìn)行一次陰影計(jì)算即可,
省去了一次消隱過(guò)程)若是動(dòng)態(tài)光源此方法就無(wú)效了。
226. Vertex Shader 是什么?怎么計(jì)算? 頂點(diǎn)著色器是一段執(zhí)行在 GPU 上的程序,用來(lái)取代 fixed pipeline 中的 transformation 和 lighting,
Vertex Shader 主要操作頂點(diǎn)。
Vertex Shader 對(duì)輸入頂點(diǎn)完成了從 local space 到 homogeneous space(齊次空間)的變換過(guò)程,
homogeneous space 即 projection space 的下一個(gè) space。在這其間共有 worldtransformation, view
transformation 和 projection transformation 及 lighting 幾個(gè)過(guò)程。
227. 什么是渲染管道? 是指在顯示器上為了顯示出圖像而經(jīng)過(guò)的一系列必要操作。 渲染管道中的很多步驟,都要將幾何物體
從一個(gè)坐標(biāo)系中變換到另一個(gè)坐標(biāo)系中去。主要步驟有:
本地坐標(biāo)->視圖坐標(biāo)->背面裁剪->光照->裁剪->投影->視圖變換->光柵化。
228. 怎么判斷兩個(gè)平面是否相交?不能用碰撞體,說(shuō)出計(jì)算方法 對(duì)于兩個(gè)平面 Ax+By+Cz+D=0 與 ax+by+cz+d=0,只要(A,B,C)與(a,b,c)不成比例,這兩個(gè)平面就是相交的。
229. 法線貼圖 、CG 動(dòng)畫(huà) A.法線貼圖:是在原物體的凹凸表面的每個(gè)點(diǎn)上均作法線,通過(guò) RGB 顏色通道來(lái)標(biāo)記法線的方向, 你
可以把它理解成與原凹凸表面平行的另一個(gè)不同的表面,但實(shí)際上它又只是一個(gè)光滑的平面。
B.CG 動(dòng)畫(huà):原為 Computer Graphics 的英文縮寫(xiě)。隨著以計(jì)算機(jī)為主要工具進(jìn)行視覺(jué)設(shè)計(jì)和生產(chǎn)的一系
列相關(guān)產(chǎn)業(yè)的形成,國(guó)際上習(xí)慣將利用計(jì)算機(jī)技術(shù)進(jìn)行視覺(jué)設(shè)計(jì)和生產(chǎn)的領(lǐng)域通稱為 CG。它既包括技
術(shù)也包括藝術(shù),幾乎囊括了當(dāng)今電腦時(shí)代中所有的視覺(jué)藝術(shù)創(chuàng)作活動(dòng),如平面印刷品的設(shè)計(jì)、網(wǎng)頁(yè)設(shè)
計(jì)、三維動(dòng)畫(huà)、影視特效、多媒體技術(shù)、以計(jì)算機(jī)輔助設(shè)計(jì)為主的建筑設(shè)計(jì)及工業(yè)造型設(shè)計(jì)等。
230. 什么是局部坐標(biāo),什么是世界坐標(biāo)? 世界坐標(biāo)是不會(huì)變的,一直以世界坐標(biāo)軸的 XYZ 為標(biāo)準(zhǔn)。 局部坐標(biāo)其實(shí)就是自身的坐標(biāo),會(huì)隨著物體
的旋轉(zhuǎn)而變化的。
231. 請(qǐng)描述 MeshRender 中 material 和 shader 的區(qū)別? Shader(著色器)實(shí)際上就是一小段程序,它負(fù)責(zé)將輸入的 Mesh(網(wǎng)格)以指定的方式和輸入的貼圖或者顏色等組合作用,然后輸出。繪圖單元可以依據(jù)這個(gè)輸出來(lái)將圖像繪制到屏幕上。輸入的貼圖或
者顏色等,加上對(duì)應(yīng)的 Shader,以及對(duì) Shader 的特定的參數(shù)設(shè)置,將這些內(nèi)容(Shader 及輸入?yún)?shù))
打包存儲(chǔ)在一起,得到的就是一個(gè) Material(材質(zhì))Shader 大體上可以分為兩類(lèi):表面著色器(Surface
Shader) 、片段著色器(Fragment Shader)
232. 什么是矢量圖 矢量圖:計(jì)算機(jī)中顯示的圖形一般可以分為兩大類(lèi)——矢量圖和位圖。矢量圖使用直線和曲線來(lái)描述
圖形,這些圖形的元素是一些點(diǎn)、線、矩形、多邊形、圓和弧線等等,它們都是通過(guò)數(shù)學(xué)公式計(jì)算獲
得的。例如一幅花的矢量圖形實(shí)際上是由線段形成外框輪廓, 由外框的顏色以及外框所封閉的顏色決
定花顯示出的顏色。由于矢量圖形可通過(guò)公式計(jì)算獲得,所以矢量圖形文件體積一般較小。矢量圖形
最大的優(yōu)點(diǎn)是無(wú)論放大、縮小或旋轉(zhuǎn)等不會(huì)失真;最大的缺點(diǎn)是難以表現(xiàn)色彩層次豐富的逼真圖像效
果。
233. 四元組是什么? 所謂四元數(shù),就是把 4 個(gè)實(shí)數(shù)組合起來(lái)的東西。4 個(gè)元素中,一個(gè)是實(shí)部,其余 3 個(gè)是虛部。
234. 你對(duì)你的數(shù)學(xué)知識(shí)感覺(jué)如何?比如空間向量,圖形學(xué) 個(gè)人感覺(jué)還是不錯(cuò)的,空間向量和圖形學(xué)之前有自學(xué)過(guò)。只是在實(shí)際工作中直接使用的機(jī)會(huì)比較少,
底層的一些操作有些生疏了。
235. 會(huì)寫(xiě) shader 么 了解一些,但是寫(xiě)的不多
236. 3D 基礎(chǔ)相關(guān) 2 1 0 1 0 1
1 0 1 × 0 0 0
2 1 1 1 1 1
上述兩個(gè)矩陣相乘的結(jié)果
2 0 2
2 1 2
3 1 3
237. 什么是投影矩陣 投影矩陣是一個(gè)典型的縮放和透視矩陣。投影變換將視錐變換成一個(gè)直平行六面體的形狀。因?yàn)橐曞F的近處比遠(yuǎn)處小,這樣就會(huì)對(duì)靠近攝像機(jī)的對(duì)象起到放大的作用,也就將透視應(yīng)用到了場(chǎng)景當(dāng)中
238. 什么是 UV UV 坐標(biāo)是指所有的圖象文件都是二維的一個(gè)平面。水平方向是 U,垂直方向是 V,通過(guò)這個(gè)平面的,
二維的 UV 坐標(biāo)系。我們可以定位圖象上的任意一個(gè)象素。
239. Cullback,cullfront,culloff 區(qū)別 剔除背面、剔除前面、不剔除
240. 什么是頂點(diǎn)程序和片段程序 頂點(diǎn)著色器是一組指令代碼,這組指令代碼在頂點(diǎn)被渲染時(shí)執(zhí)行。
片段著色器也是在 GPU 上運(yùn)行的小程序。它們負(fù)責(zé)輸出每個(gè)呈現(xiàn)的三角形像素的最終像素顏色?;?
而言,它的工作原理如下:片段著色器以輸入的形式收到頂點(diǎn)著色器通過(guò)管道傳遞的所有這些片段。
241. 如何實(shí)現(xiàn)以下人物在樹(shù)叢中部分透明效果? Shader "Custom/PlayerDiffuse" {
Properties {
_NotVisibleColor ("NotVisibleColor (RGB) ", Color) = (0.3,0.3,0.3,1)
_MainTex ("Base (RGB) ", 2D) = "white"{}
}
SubShader {
Tags { "Queue"= "Geometry+500""RenderType"="Opaque"}
LOD 200
Pass {
ZTest Greater
Lighting Off
ZWrite Off
//Color [_NotVisibleColor]
Blend SrcAlpha OneMinusSrcAlpha
SetTexture [_MainTex] { ConstantColor [_NotVisibleColor] combine constant * texture }
}
Pass {
ZTest LEqual
Material {
Diffuse (1,1,1,1)
Ambient (1,1,1,1)
}
Lighting Off SetTexture [_MainTex] { combine texture }
}
}
FallBack "Diffuse"
}
242. 簡(jiǎn)述 lightmap 的使用 (此為帖子全文,請(qǐng)自己簡(jiǎn)述)
Unity 完全集成了光照貼圖,可以通過(guò)編輯器創(chuàng)建完整的光照貼圖,你完全不用擔(dān)心,所有材質(zhì)會(huì)自動(dòng)
獲得光照貼圖。光照貼圖的意思是,所有燈光的特性將被直接映射到 Beast lightmapper 并烘培到紋理,
以此獲得更好的性能。UnityPro 版擴(kuò)展了全局光照功能,可以烘焙出真實(shí)而漂亮的光照,當(dāng)然這就不
能同時(shí)使用實(shí)時(shí)光照。此外,Unity 專(zhuān)業(yè)版帶給你天光和發(fā)光材質(zhì),為你增加更有趣的場(chǎng)景照明。
在此頁(yè)中,你會(huì)發(fā)現(xiàn)更深入的描述,可以找到在 Lightmapping 窗口的所有屬性。從菜單中 Window –
Lightmapping 打開(kāi) Lightmapping 窗口。
物體
物體的烘培設(shè)置:燈光、網(wǎng)格渲染和地形 - 取決于當(dāng)前的選擇。
網(wǎng)格渲染器和地形:
·Static 靜態(tài)
可渲染網(wǎng)格和地形必須標(biāo)記為靜態(tài)才能被烘培。
·Scale In Lightmap 光照?qǐng)D比率
(只作用于可渲染網(wǎng)格)特別大的數(shù)值將分配給可渲染網(wǎng)格更大的分辨率。最終分辨率比例(光照?qǐng)D
縮放)*(物體世界坐標(biāo)空間所占面積)*全局分辨率烘培設(shè)置)如果設(shè)置為 0 物體將不被烘培。(但是
它依舊對(duì)其他的物體有影響)
·Lightmap Size 光照?qǐng)D大小
(只作用于地形)光照貼圖尺寸是地形實(shí)例獨(dú)有的屬性,地形將不和其他物體共用圖集。地形光照貼
圖將存貯在一個(gè)單獨(dú)的文件中。
·Atlas 圖集
圖集信息-如果 Lock Atlas(鎖定圖集)選項(xiàng)沒(méi)有開(kāi)啟那么這些參數(shù)將自動(dòng)更新。如果 Lock Atlas(鎖定
圖集)選項(xiàng)開(kāi)啟,這些參數(shù)將不會(huì)自動(dòng)編輯。但是你可以手動(dòng)設(shè)置他們。
·Lightmap Index 光照?qǐng)D索引
光照貼圖序列中的索引。
·Tiling 平鋪
(只作用于可渲染網(wǎng)格)物體光照貼圖 UVs 平鋪。
·Offset 偏移
(只作用于可渲染網(wǎng)格)物體 UVs 的偏移。
Lights 燈光:
·Lightmapping 光照貼圖
光照?qǐng)D模式:僅實(shí)時(shí)模式,自動(dòng)模式和僅烘培 模式。查看下面 Dual Lightmaps 的描述。
·Color 顏色
燈光顏色。一些屬性只作用于實(shí)時(shí)光照。
·Intensity 光強(qiáng)度
燈光照明強(qiáng)度。一些屬性只作用于實(shí)時(shí)光照。
·Bounce Intensity 反彈強(qiáng)度
特定光源間接光照強(qiáng)度的倍增值。·Baked Shadows 烘焙陰影
控制當(dāng)前燈光是否產(chǎn)生陰影。(當(dāng)選擇自動(dòng)選項(xiàng)時(shí)同時(shí)影響實(shí)施陰影的產(chǎn)生)
·Shadow Radius 陰影半徑
(只作用于點(diǎn)光源和聚光燈)增加這個(gè)值將得到一個(gè)較柔和的陰影。增加這個(gè)值的大小影響陰影覆蓋
面積范圍的計(jì)算(不會(huì)影響到燈光照射范圍)。
·Shadow Angle 陰影角度
(只影響平行光)增加這個(gè)值將會(huì)得到一個(gè)比較柔和的陰影-增加燈光陰影覆蓋角度范圍的計(jì)算。(不
會(huì)影響到燈光照射范圍)
·Shadow Samples 陰影采樣
如果你將陰影半徑或者角度設(shè)置為大于 0 的值,增加陰影采樣值能得到一個(gè)比較好的結(jié)果。高采樣值
將消除半影中中的噪點(diǎn)。
Bake 烘焙
全局烘焙設(shè)置。
·Mode 模式
控制離線烘培和實(shí)時(shí)光照模式。在 Dual Lightmaps 模式下近端和遠(yuǎn)端光照?qǐng)D都將被烘培;只有延遲光
照渲染方式式才能更好的支持雙重光照?qǐng)D。Single Lightmaps 模式僅烘培遠(yuǎn)端光照?qǐng)D。在延遲渲染方式
下也可以強(qiáng)制使用單光照?qǐng)D模式。
·Use in forward rendering 使用正向渲染
(Dual lightmaps only) 在正向渲染中啟用 dual lightmaps。要注意的是這需要你創(chuàng)建自己的 shader 來(lái)達(dá)到
目的。
·Quality 質(zhì)量
高質(zhì)量(比較好的效果)和低質(zhì)量(計(jì)算速度快)的預(yù)設(shè)值。它們將影響最終聚集光線數(shù)量和對(duì)比度
的數(shù)值以及其他有關(guān)最終聚集和抗鋸齒的設(shè)置。
·Bounces 反彈
控制全局光照模擬中光線反彈的次數(shù)。如果想得到一個(gè)比較柔和的相對(duì)真實(shí)的光照至少需要將此數(shù)值
設(shè)置為 1.如果設(shè)置為 0 那么只會(huì)計(jì)算直接光照。
·Sky Light Color 天光顏色
天光是模擬從天球向所有方向發(fā)射光線照射場(chǎng)景-在烘培室外場(chǎng)景的時(shí)候開(kāi)啟天光將得到一個(gè)非常好的
效果。
·Sky Light Intensity 天光強(qiáng)度
天光的強(qiáng)度 - 0 代表禁用天光。
·Bounce Boost 反彈增強(qiáng)
增強(qiáng)間接光, 可用來(lái)增加場(chǎng)景中渲染太快沒(méi)有烘焙出燈光的反彈量。
·Bounce Intensity 反彈強(qiáng)度
間接光照的強(qiáng)度倍增器。
·Final Gather Rays 最終聚集光線
控制從最終聚集點(diǎn)發(fā)射的光線數(shù)量-較高的數(shù)值能得到更好的效果 。
·Contrast Threshold
對(duì)比度閾值
顏色對(duì)比度根據(jù)采樣運(yùn)算規(guī)則控制哪些最終聚集點(diǎn)被創(chuàng)建。較高的數(shù)值可以使 Beast 處理物體表面燈
光照明時(shí)有很大的改善,從而得到一張平滑的光照貼圖但是會(huì)犧牲一些照明細(xì)節(jié)。較低的數(shù)值需要最
終聚集光線數(shù)量要高于對(duì)比度閾值這樣被過(guò)濾掉的最終聚集點(diǎn)才能被創(chuàng)建出來(lái)。
·Interpolation 插值
控制最終聚集點(diǎn)顏色的插值。設(shè)置 0 為線性插值,設(shè)置 1 為基于梯度的高級(jí)插值。多數(shù)情況下推薦使
用后者。
·Interpolation Points 插值點(diǎn)設(shè)置最終聚集點(diǎn)顏色的插值的參考點(diǎn)。高數(shù)值可以獲得比較平滑的結(jié)果,但是會(huì)犧牲一些光照細(xì)節(jié)。
·Ambient Occlusion
環(huán)境光遮擋
烘培光照?qǐng)D時(shí)產(chǎn)生一定數(shù)量的環(huán)境阻光。環(huán)境阻光計(jì)算物體每一點(diǎn)被一定距離內(nèi)的其他物體或者一定
距離內(nèi)自身物體的遮擋程度(用來(lái)模擬物體表面環(huán)境光及陰影覆蓋的比例,達(dá)到全局光照的效果),所
以和所有的燈光設(shè)置沒(méi)有太大關(guān)系。
·Max Distance 最大距離
Beyond this distance a ray is considered to be unoccluded. 0 stands for infinitely long rays.
超出這個(gè)距離的光線將不被遮擋。0 表示無(wú)限長(zhǎng)的光線。
·Contrast 對(duì)比度
控制完全阻光和不阻光之間的過(guò)度。
·Lock Atlas 鎖定圖集
當(dāng)鎖定圖集被打開(kāi)。自動(dòng)圖集功能將不執(zhí)行,物體光照?qǐng)D索引,平鋪和偏移將不能編輯。
·Resolution 分辨率
每世界單位中光照?qǐng)D分辨率的大小。因此當(dāng)設(shè)置分辨率為 50 的一個(gè) 10 單位乘以 10 單位的平面將產(chǎn)
生一張 500*500 像素的光照貼圖。
Maps 貼圖所有光照貼圖的可編輯數(shù)組。
·Compressed 壓縮
控制是否壓縮所有當(dāng)前場(chǎng)景中的光照貼圖。
·Array Size 數(shù)組大小
光照貼圖數(shù)組的大小(
0~254)。
·Lightmaps Array 光照貼圖數(shù)組
當(dāng)前場(chǎng)景被烘培的所有光照?qǐng)D的可編輯序列。沒(méi)有被指定的通道將被處理為黑色光照?qǐng)D。索引相當(dāng)于
網(wǎng)格渲染和地形中所使用的光照?qǐng)D編號(hào)。除非鎖定圖集被開(kāi)啟否則序列將自動(dòng)初始化并分配給你烘培
的貼圖。
Lightmap Display 光照貼圖顯示
在編輯器中控制光照?qǐng)D如何顯示的工具。光照?qǐng)D顯示是在場(chǎng)景視口中的一個(gè)子窗口??梢?jiàn)只要光照?qǐng)D
窗口可見(jiàn)。
·Use Lightmaps 使用光照貼圖
是否渲染光照?qǐng)D。
·Shadow Distance 陰影距離
根據(jù)過(guò)度到只使用遠(yuǎn)端光照?qǐng)D時(shí)哪些設(shè)置為自動(dòng)模式的燈光被關(guān)閉的距離。這里的設(shè)置覆蓋其他面板
中相關(guān)設(shè)置。但是不能覆蓋質(zhì)量設(shè)置中的陰影距離設(shè)置。
·Show Resolution 顯示分辨率
切換在場(chǎng)景中是否顯示光照?qǐng)D分辨率。開(kāi)啟這項(xiàng)設(shè)置你可以在你的場(chǎng)景中直接預(yù)覽靜態(tài)物體光照?qǐng)D的
分辨率大小。
Details 細(xì)節(jié)
Dual Lightmaps 雙重光照貼圖
雙光照貼圖是 Unity 中的光照貼圖可以同高光貼圖,法線貼圖和適當(dāng)混合的實(shí)時(shí)陰影一起渲染的工具。
同時(shí)它也可以讓你的光照貼圖看起來(lái)效果更好,即使設(shè)置的光照分辨率較低。
雙光照貼圖默認(rèn)情況下只能用于延遲光照渲染路徑。但通過(guò)編寫(xiě)自定義著色器就可能讓雙光照貼圖用
于前向渲染路徑中(使用 dualforward 表面著色指令)。
雙光照貼圖即意為使用兩套光照貼圖:
·遠(yuǎn) :包含全部照明
·近 :包含標(biāo)記為自動(dòng)模式的燈光所產(chǎn)生的的間接照明,和標(biāo)記為僅烘焙模式的燈光,發(fā)光材質(zhì)和天
光的所有照明。設(shè)置為僅實(shí)時(shí)的燈光永遠(yuǎn)不會(huì)被烘培。近端光照?qǐng)D作用于質(zhì)量設(shè)置中的相對(duì)攝像機(jī)最小陰影距離范圍
內(nèi)。
在這個(gè)距離范圍內(nèi),自動(dòng)模式的燈光將實(shí)時(shí)渲染高光,凹凸和陰影,(它們的陰影與實(shí)時(shí)模式的等光的
陰影融為一體),間接光則來(lái)自近端光照貼圖。 若超出陰影距離自動(dòng)模式燈光就不再進(jìn)行實(shí)時(shí)渲染,
而全部照明都由光照貼圖產(chǎn)生(僅實(shí)時(shí)模式燈光仍然產(chǎn)生照明,但不產(chǎn)生陰影)。
下面的場(chǎng)景包含一個(gè)默認(rèn)設(shè)置為為自動(dòng)模式的平行光,一些烘培完光照貼圖的靜態(tài)物體(建筑物,障
礙物,其他靜態(tài)物體)和一些動(dòng)態(tài)的移動(dòng)或可移動(dòng)物體(持槍的假人,桶)。 該場(chǎng)景在雙重光照貼圖
模式中烘焙和渲染:陰影距離以外的建筑物完全由光照貼圖產(chǎn)生照明,而兩個(gè)假人由實(shí)時(shí)燈光產(chǎn)生動(dòng)
態(tài)光照,但是不投射陰影; 陰影距離范圍內(nèi)的建筑物和地面被即時(shí)光照亮并投下實(shí)時(shí)陰影,但柔和的間
接光是來(lái)自于近端光照貼圖產(chǎn)生。
243. Shader 的代碼實(shí)現(xiàn)?大概寫(xiě)一下 Shader "Custom/NewSurfaceShader"{
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB) ", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
void surf (Input IN, inout SurfaceOutputStandard o) {
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG }
FallBack "Diffuse"
}
244. 游戲中要怎么實(shí)現(xiàn)矩陣相乘? //矩陣相乘
public static float[][] Mul(float[][] a, float[][] b) {
//確保矩陣 a 的列數(shù)和 b 的行數(shù)相等
if(a[0].length != b.length) {
return null;
}
//用來(lái)存放結(jié)果的矩陣,axb 的結(jié)果為 a 的行數(shù)和 b 的列數(shù)
float[][] result = new float[a.length][b[0].length];
//對(duì) a 的每行進(jìn)行遍歷
for(int i=0; i<a.length; i++) {
//對(duì) b 的每列進(jìn)行遍歷
for(int j=0;j<b[0].length; j++) {
//c 為每一個(gè)點(diǎn)的值
float c = 0;
//第 i 行 j 列的值為 a 的第 i 行上的 n 個(gè)數(shù)和 b 的第 j 列上的 n 個(gè)數(shù)對(duì)應(yīng)相乘之和,其中 n 為 a
的列數(shù),也是 b 的行數(shù),a 的列數(shù)和 b 的行數(shù)相等
for(int k=0; k<a[0].length; k++) {
c += (a[i][k]*b[k][j]);
}
result[i][j] = c;
}
}
return result;
}
九、 邏輯題 245. 也許是因?yàn)槲姨屏?,我上的?dāng)是要比別人多一些。D A. 非常同意 B.比較同意 C.比較不同意 D.非常不同意
246. 現(xiàn)在生活中老實(shí)人總是吃虧。D A. 非常正確 B.比較正確 C.比較不正確 D.非常不正確
247. 社會(huì)上很多不法分子逍遙法外 D A.非常正確 B.比較正確 C.比較不正確 D.非常不正確
248. 如果我家很小,如帶客人來(lái)家我會(huì)有傷自尊 D A.非常同意 B.比較同意 C.比較不同意 D.非常不同意
249. 我多數(shù)娛樂(lè)活動(dòng)都是和學(xué)生一起進(jìn)行的 A A.非常同意 B.比較同意 C.比較不同意 D.非常不同意
250. 如果有件小事(如頭痛或家務(wù)事),使我感到煩惱時(shí),我會(huì)向別人傾訴 C A.非常同意 B.比較同意 C.比較不同意 D.非常不同意
251. 根據(jù)如下圖形中的規(guī)律,問(wèn)號(hào)代表下列哪個(gè)方塊? A 252. 觀察數(shù)字:54321,43215,32154,(),15432,第四個(gè)數(shù)字是多少? 21543
253. 在下列分?jǐn)?shù)中,選出不同類(lèi)的一項(xiàng): C 可以約分 A.3/5 B.3/7 C.3/9
254. 小趙的店里來(lái)了一位顧客,挑了 20 元的貨,顧客拿出 50 元,小趙沒(méi) 有零錢(qián)找不開(kāi),就到隔壁小韓的店里把這 50 元換成零錢(qián),回來(lái)給顧客找 了 30 元零錢(qián),過(guò)了一會(huì)兒,小韓來(lái)找小趙,說(shuō)剛才的是假錢(qián),小趙馬上 給小韓換成了一張真錢(qián),問(wèn):在這一過(guò)程中小趙賠了多少錢(qián)? D A.50 元 B.60 元 C.70 元 D.80 元
255. 觀察 3、3、8、8 這一組數(shù)字,不改變數(shù)字順序,加入運(yùn)算符號(hào)和括號(hào), 將這些數(shù)字組成一個(gè)算式,使結(jié)果等于 27 答案:(3+3/8)*8=27
256. 圖形共有 2000 個(gè),按照下面的規(guī)律排列: △□□□△□□□△□□ □……第 1995 個(gè)圖形是什么? 1995 % 4 = 3 所以是方塊
257. 用三根火柴要擺成一個(gè)最小的數(shù)(不許把火柴折斷或者彎曲),這個(gè)數(shù) 是什么? -11
258. 根據(jù)邏輯關(guān)系在方框內(nèi)填出空缺處圖形。
259. 說(shuō)一個(gè)島上有 100 個(gè)人,其中 5 個(gè)紅眼睛,95 個(gè)藍(lán)眼睛。這個(gè)島上有 三個(gè)奇怪的宗教規(guī)則。 他們不能照鏡子,不能看自己眼睛的顏色。
他們不能互相交流眼睛顏色的問(wèn)題,也不能告訴別人對(duì)方的眼睛是什么顏色。
一旦有人知道了自己眼睛的顏色,他就必須在當(dāng)天夜里自殺。
注:雖然題設(shè)了 5 個(gè)紅眼睛,但島民是不知道具體數(shù)字的。
島民一直過(guò)著寧?kù)o的生活,相安無(wú)事。某天,有個(gè)旅行者到了這個(gè)島上,由于不知道這里的規(guī)矩,所
以一起狂歡的時(shí)候,不留神就說(shuō)了一句:你們這里有紅眼睛的人。
最后的問(wèn)題是:
1)假設(shè)這個(gè)島上的人夠聰明,每個(gè)人都可以做出縝密的邏輯推理。請(qǐng)問(wèn)這個(gè)島上將會(huì)發(fā)生什么?
2)為什么旅行者看似無(wú)意義的一句話改變了島上的格局?
" 因?yàn)樽詮哪莻€(gè)人說(shuō)了島上有紅眼人后他們開(kāi)始思考自己眼睛的顏色,假如有一個(gè)紅眼人,那么他看
到 99 個(gè)藍(lán)眼人,他第一天會(huì)自殺,如果有兩個(gè)紅眼人,他看到 98 藍(lán) 1 紅,如果他發(fā)現(xiàn)那個(gè)紅眼人第
一天沒(méi)自殺那么他將意識(shí)到他也是紅眼人,故第二天兩個(gè)紅眼人都將自殺,同理可推知,第五天五個(gè)
紅眼人將自殺,五個(gè)紅眼人自殺之后,通過(guò)推理,剩下的都是藍(lán)眼人了,所以第六天,剩下的藍(lán)眼人都自殺了
260. 有 4 位好友,其中一個(gè)人干了一件好事,不留名,記者來(lái)查此事,問(wèn) 4 位,他們的回答如下: A:不是我
B.是 C
C.是 D
D.他胡說(shuō)
已知 3 個(gè)人說(shuō)真話,一個(gè)人說(shuō)假話,現(xiàn)在根據(jù)以上信息找出做了好事的人(并編程實(shí)現(xiàn))
1.假設(shè) A 講假話,其馀三人講真話,則 B 和 C 出現(xiàn)矛盾,所以假設(shè)不成立,A 講真話.
2.假設(shè) B 講假話,其馀三人講真話,則 C 和 D 的
說(shuō)法出現(xiàn)矛盾,所以假設(shè)不成立,B 講真話.
3.假設(shè) C 講假話,其馀三人講真話,則 A、B、D 的證供都成立,所以假設(shè)成立,C 講假話.
4.假設(shè) D 講假話,其馀三人講真話,則 B 和 C 出現(xiàn)矛盾,所以假設(shè)不成立,D 講真話.
推出,C 是做好事的人.
提示:
第一步:被測(cè)者從 1—4
第二步:將被測(cè)者代入表達(dá)式
第三步:判斷 3 個(gè)表達(dá)式為真嗎?是的則打印結(jié)果程序結(jié)束。不是,判斷是否全測(cè)完,不是轉(zhuǎn)第一步,
是打印未找到,程序結(jié)束。完成下面的程序。
# include <stdio.h>
main(){
int k = 0,sum = 0,g = 0;
char man = ' ';
for(k = 1; k <= 4 && g==10;k++) {
man=64+k;
sum=(man != 'A') + (man == 'C') + (men == 'D') + (men != 'D');
if(sum==3) {
clrscr();
printf("/nman=%c/n", 64 + k);
g = 1;
}
}
if(g != 1)
printf("can't found! ");
getch();
}(社區(qū)提供持續(xù)更新版本)