本博客在Edward-Phoenix博客下改編,對部分答案進行詳細說明,本人純屬爲了加深印象自己敲了一遍。在此感謝前輩的整理。原博客地址:
https://blog.csdn.net/qq_25601345/article/details/77102775
本人正處於求職準備階段,如有興趣可以加入QQqun:713591618。此羣支持學習討論,更有大廠內推。再次恭候各路英雄好漢的加入。期待與你共同進步。
-----2020.3.13
文章目錄
- C# StringBuilder類型比string類型的優勢是什麼?
- C# 函數Func(string a, string b)用Lambda表達式怎麼寫?
- 數列1,1,2,3,5,8,13...第n位數是多少?用C#遞歸算法實現
- 請簡述值類型與引用類型的區別
- 請簡述ArrayList和List<>的主要區別
- 請簡述GC(垃圾回收)產生的原因,並描述如何避免?
- 請描述Interface與抽象類之間的不同
- 下列代碼在運行中會產生幾個臨時對象?
- 下列代碼在運行中會發生什麼問題?如何避免?
- 請簡述關鍵字Sealed用在類聲明和函數聲明時的作用
- 請簡述private,public,protected,internal的區別
- 反射的實現原理?
- .Net與Mono的關係?
- 請說出4種面向對象的設計原則,並分別簡述它們的含義。
- Hashtable是無序的嗎?
- *unity問題*
- NGUI Button怎樣接受用戶點擊並調用函數,具體方法名稱是什麼?
- 請簡述NGUI中Panel和Anchor的作用
- 爲何大家都在移動設備上尋求U3D原生GUI的替代方案
- 使用Unity3d實現2d遊戲,有幾種方式?
- 怎麼判斷兩個平面是否相交?不能用碰撞體,說出計算方法
- MeshCollider和其他Collider的一個主要不同點?
- Unity3d中的碰撞器和觸發器的區別?
- 物體發生碰撞的必要條件
- CharacterController和Rigidbody的區別?
- 當一個細小的高速物體撞向另一個較大的物體時,會出現什麼情況?如何避免?
- 在unity3d中物體發生碰撞的整個過程中,有幾個階段,分別列出對應的階段函數
- 請描述遊戲動畫有哪幾種,以及其原理?
- 寫出Animation的五個方法
- 動畫層(AnimationState Layers)的作用是什麼?
- Itween插件的作用是什麼,Itween作用於世界座標還是局部座標,請列舉出3個其常用方法?
- 法線貼圖 、CG動畫 ?
- Unity3D是否支持寫成多線程程序?如果支持的話需要注意什麼?
- Unity3D的協程和C#線程之間的區別是什麼?
- 什麼是協同程序?
- 四元數是什麼?主要作用什麼?對歐拉角的優點是什麼?
- 在場景中放置多個Camera並同時處於活動狀態會發生什麼?
- Unity攝像機有幾種工作方式,分別是什麼?
- Prefab的作用?如何在移動環境的設備下恰當地使用它?
- unity 當需要頻繁創建一個物體對象時,怎樣減少內存
- 光照計算中的diffuse的計算公式
- MeshRender中material和shader的區別?
- 光照貼圖 的優勢是什麼?
- Vertex Shader是什麼,怎麼計算?
- .unity3d提供了幾種光源,分別是什麼
- 物理更新一般在哪個系統函數裏?
- OnEnable、Awake、Start運行時的發生順序?哪些可能在同一個對象週期中反覆的發生?
- Unity3d腳本從喚醒到銷燬有着一套比較完整的生命週期,請列出系統自帶的幾個重要的方法。
- 物理更新一般放在哪個系統函數裏?
- 移動攝像機的動作放在哪個系統函數中,爲什麼放在這個函數中?
- 請簡述OnBecameVisible及OnBecameInvisible的發生時機,以及這一對回調函數的意義?
- 動態加載資源的方式?區別是什麼?
- 以下哪個函數在遊戲進入新場景後會被馬上調用?
- 如何銷燬一個UnityEngine.Object及其子類對象
- 獲取、增加、刪除組件的命令分別是什麼?
- Application.loadLevel命令是什麼?
- 調試記錄到控制檯的命令是什麼?
- LayerMask.NameToLayer()這個方法有什麼作用?
- localPosition與Position的使用區別?
- 物體自身旋轉使用的函數?
- 物體圍繞某點旋轉使用的函數?
- 6.U3D中用於記錄節點空間幾何信息的組件名稱,及其父類名稱
- 寫一個計時器工具,從整點開始計時,格式爲:00:00:00
- 實現吊機吊物體的功能
- Material和Physic Material區別?
- CharacterController和Rigidbody的區別?
- Unity3d的物理引擎中,有幾種施加力的方式,分別描述出來
- 什麼叫做鏈條關節?
- 什麼是導航網格( NavMesh)?
- 簡述Unity3D支持的作爲腳本的語言的名稱
- 向量的點乘、叉乘以及歸一化的意義?
- 矩陣相乘的意義及注意點?
- 爲什麼dynamic font在unicode環境下優於static font?
- Render的作用?描述MeshRender和SkinnedMeshRender的關係與不同
- 簡述SkinnedMesh的實現原理
- 爲什麼Unity3D中會發生在組件上出現數據丟失的情況?
- 如何安全的在不同工程間安全地遷移asset數據?三種方法
- Lod是什麼,優缺點是什麼?
- 兩種陰影判斷的方法、工作原理。
- 如何優化內存?
- 什麼是渲染管道?
- 什麼是矢量圖 ?
- 什麼是矩陣?矩陣運算?
- 角度和弧度的轉換
- 矢量標量
C# StringBuilder類型比string類型的優勢是什麼?
答:string不可變,再進行賦值或者拼接時會新建一個對象,分配新的內存空間。而StringBuilder不會。
兩者區別:
- 它是引用類型,在堆上分配內存
- 運算時會產生一個新的實例
- String 對象一旦生成不可改變(Immutable)
- 定義相等運算符(== 和 !=)是爲了比較 String 對象的值(而不是引用)
StringBuilder MyStringBuilder = new StringBuilder("Hello World!", 25); //設置StringBuilder的最大容量
MyStringBuilder.Capacity = 25; //同上,Capacity可讀可寫
分別用String和StringBuilder拼接10000次進行時間即計時:差距還是挺大的。
stringBuilder的使用方法:
StringBuilder.Append 將信息追加到當前 StringBuilder 的結尾。
StringBuilder.AppendFormat 用帶格式文本替換字符串中傳遞的格式說明符。
StringBuilder.Insert 將字符串或對象插入到當前 StringBuilder 對象的指定索引處。
StringBuilder.Remove 從當前 StringBuilder 對象中移除指定數量的字符。
StringBuilder.Replace 替換指定索引處的指定字符。
出處:https://www.cnblogs.com/Tirisfal/p/4516818.html
C# 函數Func(string a, string b)用Lambda表達式怎麼寫?
(a,b)=>{}
數列1,1,2,3,5,8,13…第n位數是多少?用C#遞歸算法實現
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp9
{
class Program
{
static void Main(string[] args)
{
;
int n = int.Parse(Console.ReadLine());
Console.WriteLine(cp(n).ToString());
}
public static int cp(int n)
{
if (n <= 0)
{
return -1;
}
else if (n == 1 || n == 2)
{
return 1;
}
else
{
return cp(n - 1) + cp(n - 2);
}
}
}
}
請簡述值類型與引用類型的區別
值類型:byte,short,int,long,float,double,decimal,char,bool
直接存儲數據,不管有沒有賦值直接爲其分配內存。通常是在線程棧上分配的(靜態分配),但是在某些情形下可以存儲在堆中。引用類型的對象總是在進程堆中分配(動態分配)
引用類型:string class
存儲數據的引用,聲名時在棧中創建該類型的地址引用空間並沒有爲其分配內存。在new後爲其在數據堆上分配內存。
相同點:
- 引用類型和值類型中的struct都可以實現接口
- 都繼承於System.Object
不同點
1)範圍方面
- C#的值類型包括:結構體(數值類型、bool型、用戶定義的結構體),枚舉,可空類型。
- C#的引用類型包括:數組,用戶定義的類、接口、委託,object,字符串。
2)內存分配方面
- 數組的元素不管是引用類型還是值類型,都存儲在託管堆上。
- 引用類型在棧中存儲一個引用,其實際的存儲位置位於託管堆。簡稱引用類型部署在託管推上。而值類型總是分配在它聲明的地方:作爲字段時,跟隨其所屬的變量(實
例)存儲;作爲局部變量時,存儲在棧上。(棧的內存是自動釋放的,堆內存是.NET中會由GC來自動釋放)
3)適用場合
- 值類型在內存管理方面具有更好的效率,並且不支持多態,適合用做存儲數據的載體;引用類型支持多態,適合用於定義應用程序的行爲。
- 引用類型可以派生出新的類型,而值類型不能,因爲所有的值類型都是密封(seal)的;
- 引用類型可以包含null值,值類型不能(可空類型功能允許將 null 賦給值類型,如 int? a = null; );
- 引用類型變量的賦值只複製對對象的引用,而不復制對象本身。而將一個值類型變量賦給另一個值類型變量時,將複製包含的值。
出處:https://www.cnblogs.com/d0975/p/10638037.html
請簡述ArrayList和List<>的主要區別
ArrayList是非泛型列表,存儲數據時把所有的數據都當成object類型存儲,存在裝箱問題,取出來使用的時候存在拆箱問題,裝箱拆箱會使性能變差,而且存在數據安全問題,但是優點在於可以讓值類型和引用類型互相轉換。
List是泛型列表,在使用的時候纔去定義數據類型,泛型避免了拆箱裝箱的問題,存入讀取速度較快,類型也更安全。
請簡述GC(垃圾回收)產生的原因,並描述如何避免?
GC回收堆上的內存
避免:
- 減少new產生對象的次數
- 使用公用的對象(靜態成員)
- 如果字符串拼接多的將String換爲StringBuilder
請描述Interface與抽象類之間的不同
語法不同處:
- 1.抽象類中可以有字段,接口沒有。
- 2.抽象類中可以有實現成員,接口只能包含抽象成員。
- 3.抽象類中所有成員修飾符都可以使用,接口中所有的成員都是對外的,所以不需要修飾符修飾。
用法不同處:
- 抽象類是概念的抽象,接口關注於行爲。
- 抽象類的子類與父類的關係是泛化關係,耦合度較高,而實現類和接口之間是實現的關係,耦合度比泛化低。
- 一個類只能繼承一個類,但是可以實現多個接口。
下列代碼在運行中會產生幾個臨時對象?
string a = new string("abc");
a = (a.ToUpper() + "123").Substring(0, 2);
答:第一行是會出錯的。應該這樣初始化:
string b = new string(new char[]{‘a’,‘b’,‘c’});
3個臨時對象
下列代碼在運行中會發生什麼問題?如何避免?
List ls = new List(new int[] { 1, 2, 3, 4, 5 });
foreach (int item in ls)
{
Console.WriteLine(item * item);
ls.Remove(item);
}
運行時產生錯誤,在foreach中不能更改數據。可以用for代替
請簡述關鍵字Sealed用在類聲明和函數聲明時的作用
Sealed修飾類後表明封閉,即不支持繼承。在函數前加Sealed表明不能在子類中進行函數重載。
請簡述private,public,protected,internal的區別
- public:對任何類和成員都公開,無限制訪問
- private:僅對該類公開
- protected:對該類和其派生類公開
- internal:只能在包含該類的程序集中訪問該類
反射的實現原理?
反射:通過動態獲取程序集,並獲取其中的類型元數據,然後訪問該類型的過程。
反射的用途
- (1)使用Assembly定義和加載程序集,加載在程序集中的所有模塊以及從此程序集中查找類型並創建該類型的實例。
- (2)使用Module瞭解包含模塊的程序集以及模塊中的類等,還可以獲取在模塊上定義的所有全局方法或其他特定的非全局方法。
- (3)使用ConstructorInfo瞭解構造函數的名稱、參數、訪問修飾符(如pulic
或private)和實現詳細信息(如abstract或virtual)等。 - (4)使用MethodInfo瞭解方法的名稱、返回類型、參數、訪問修飾符(如pulic
或private)和實現詳細信息(如abstract或virtual)等。 - (5)使用FiedInfo瞭解字段的名稱、訪問修飾符(如public或private)和實現詳細信息(如static)等,並獲取或設置字段值。
- (6)使用EventInfo瞭解事件的名稱、事件處理程序數據類型、自定義屬性、聲明類型和反射類型等,添加或移除事件處理程序。
- (7)使用PropertyInfo瞭解屬性的名稱、數據類型、聲明類型、反射類型和只讀或可寫狀態等,獲取或設置屬性值。
- (8)使用ParameterInfo瞭解參數的名稱、數據類型、是輸入參數還是輸出參數,以及參數在方法簽名中的位置等。
反射用到的主要類
System.Type 類--通過這個類可以訪問任何給定數據類型的信息。
System.Reflection.Assembly 類--它可以用於訪問給定程序集的信息,或者把這個程序集加載到程序中。
System.Type類用法
System.Type類對於反射起着核心的作用。但它是一個抽象的基類,Type有與每種數據類型對應的派生類,我們使用這個派生類的對象的方法、字段、屬性來查找有關該類型的所有信息。獲取給定類型的Type引用有3種常用方式:
- 1、使用 C# typeof 運算符
Type t = typeof(string);
- 2、 使用對象GetType()方法
string s = "grayworm";
Type t = s.GetType();
- 3、還可以調用Type類的靜態方法GetType()
Type t = Type.GetType("System.String");
Type類的屬性
- Name數據類型名
- FullName 數據類型的完全限定名(包括命名空間名)
- Namespace 定義數據類型的命名空間名
- IsAbstract 指示該類型是否是抽象類型
- IsArray 指示該類型是否是數組
- IsClass 指示該類型是否是類
- IsEnum 指示該類型是否是枚舉
- IsInterface 指示該類型是否是接口
- IsPublic 指示該類型是否是公有的
- IsSealed 指示該類型是否是密封類
- IsValueType 指示該類型是否是值類型
Type類的方法
- GetConstructor(),GetConstructors():返回ConstructorInfo類型,用於取得該類的構造函數的信息
- GetEvent(), GetEvents():返回EventInfo類型,用於取得該類的事件的信息
- GetField(), GetFields():返回FieldInfo類型,用於取得該類的字段(成員變量)的信息
- GetInterface(), GetInterfaces():返回InterfaceInfo類型,用於取得該類實現的接口的信息
- GetMember(), GetMembers():返回MemberInfo類型,用於取得該類的所有成員的信息
- GetMethod(), GetMethods():返回MethodInfo類型,用於取得該類的方法的信息
- GetProperty(), GetProperties():返回PropertyInfo類型,用於取得該類的屬性的信息
System.Reflection.Assembly類的用法
Assembly類可以獲得程序集的信息,也可以動態的加載程序集,以及在程序集中查找類型信息,並創建該類型的實例。使用Assembly類可以降低程序集之間的耦合性,有利於軟件結構的合理化。
- 1、通過程序集名稱返回Assembly對象
Assembly assembly = Assembly.Load("ReflectionDemo2");
- 2、通過DLL文件名稱返回Assembly對象
Assembly assembly = Assembly.LoadFrom("ReflectionDemo2.dll");
- 3、通過Assembly獲取程序集中類
Type t = assembly.GetType("ReflectionDemo2.ReflectionClass"); //參數必須是類的全名
- 4、通過Assembly獲取程序集中所有的類
Type[] tArray = assembly.GetTypes();
- List item
- 5、通過程序集的名稱反射
Assembly assembly = Assembly.Load("ReflectionDemo2");
Type t = assembly.GetType("ReflectionDemo2.ReflectionClass"); //參數必須是類的全名
object o = Activator.CreateInstance(t,"男");
MethodInfo mi = t.GetMethod("Show");
mi.Invoke(o,null);
出處:https://blog.csdn.net/Gnd15732625435/article/details/78587483?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
.Net與Mono的關係?
mono是.net的一個開源跨平臺工具。.net只能在windows下運行,mono可以實現跨平臺,可以運行於linux,Unix,Mac OS等。
請說出4種面向對象的設計原則,並分別簡述它們的含義。
- 單一職責原則:一個類,最好只做一件事,只有一個引起它的變化.
- 開放-封閉原則:對於擴展是開放的,對於更改是封閉的
- 里氏替換原則:子類必須能夠替換其基類
- 依賴倒置原則:依賴於抽象
- 接口隔離原則 :使用多個小的專門的接口,而不要使用一個大的總接口。
Hashtable是無序的嗎?
答:電腦沒有絕對的無序,hashtable是通過哈希碼讓開發者感覺無序。
unity問題
NGUI Button怎樣接受用戶點擊並調用函數,具體方法名稱是什麼?
1.直接監聽事件:在按鈕上綁定一個帶有OnClick腳本,但這種方法不太好用,也不靈活。
2.ButtonScript:在按鈕上添加BoxCollider,在添加ButtonScript腳本,把要調用的方法放到場景中一個物體上,一般放在攝像機上,因爲攝像機一直存在,然後把這個方法添加到ButtonScript腳本里寫好的委託裏面,所以可以添加多個方法,一旦點擊就觸發事件。
請簡述NGUI中Panel和Anchor的作用
Panel是一個容器,它將包含所有UI小部件,並負責將所包含的部件組合優化,以減少繪製命令的調用。
Anchor是NGUI中屏幕分辨率的自適應性,來適應不同的分辨率的屏幕顯示。
爲何大家都在移動設備上尋求U3D原生GUI的替代方案
- 1.不美觀
- 2.OnGUI很耗費時間
- 3.使用不方便
- drawcall很高
使用原生GUI創建一個可以拖動的窗口命令是什麼?
答:GUI.DragWindow()
使用Unity3d實現2d遊戲,有幾種方式?
- 1.使用本身的GUI
- 2.把攝像機的Projection(投影)值調爲Orthographic(正交投影),不考慮z軸
- 3.使用2d插件,如:2DToolKit
怎麼判斷兩個平面是否相交?不能用碰撞體,說出計算方法
答:在兩個平面上分別取一個向量,然後看是否相交
MeshCollider和其他Collider的一個主要不同點?
答:MeshCollider是網格碰撞器,對於複雜網狀模型上的碰撞檢測,比其他的碰撞檢測精確的多,但是相對其他的碰撞檢測計算也增多了,所以一般使用網格碰撞也不會在面數比較高的模型上添加,而會做出兩個模型,一個超簡模能表示物體的形狀用於做碰撞檢測,一個用於顯示。
Unity3d中的碰撞器和觸發器的區別?
1.碰撞器物體不能互相進入到對方內部,觸發器可以
2.觸發器角色控制器可以使用,碰撞器中不能使用
3.觸發器沒有物理屬性了,碰撞器可以有力存在
4.碰撞器調用OnCollisionEnter/Stay/Exit函數,觸發器調用OnTriggerEnter/Stay/Exit函數
物體發生碰撞的必要條件
答:兩個物體都必須帶有碰撞器(Collider),其中一個物體還必須帶有Rigidbody剛體。
CharacterController和Rigidbody的區別?
CharacterController自帶膠囊碰撞器,裏面包含有剛體的屬性;
Rigidbody就是剛體,使物體帶有剛體的特徵。
當一個細小的高速物體撞向另一個較大的物體時,會出現什麼情況?如何避免?
答:穿透(碰撞檢測失敗)
避免的方法:把剛體的實時碰撞檢測打開Collision Detection修改爲Continuous Dynamic
在unity3d中物體發生碰撞的整個過程中,有幾個階段,分別列出對應的階段函數
主要是三個階段:1.Collider.OnCollisionEnter 進入碰撞,
OnCollisionEnter is called when this collider/rigidbody has begun touching
another rigidbody/collider.
當collider/rigidbody開始觸動另一個rigidbody/collider時OnCollisionEnter被調用。
2.Collider.OnCollisionStay 逗留碰撞,
OnCollisionStay is called once per frame for every collider/rigidbody that is
touching rigidbody/collider.
每個collider/rigidbody觸動rigidbody/collider,將在每幀調用OnCollisionStay。通俗的說,
一個碰撞器或剛體觸動另一個剛體或碰撞器,在每幀都會調用OnCollisionStay,直到它們之間離開不接觸。
3.Collider.OnCollisionExit 退出碰撞,
OnCollisionExit is called when this collider/rigidbody has stopped touching
another rigidbody/collider.
當 collider/rigidbody停止觸動另一個 rigidbody/collider時,OnCollisionExit被調用。
請描述遊戲動畫有哪幾種,以及其原理?
答:主要有關節動畫、單一網格模型動畫(關鍵幀動畫)、骨骼動畫。
1.關節動畫:把角色分成若干獨立部分,一個部分對應一個網格模型,部分的動畫連接成一個整體的動畫,角色比較靈活,Quake2中使用這種動畫。
2.單一網格模型動畫由一個完整的網格模型構成,在動畫序列的關鍵幀裏記錄各個頂點的原位置及其改變量,然後插值運算實現動畫效果,角色動畫較真實。
3.骨骼動畫,廣泛應用的動畫方式,集成了以上兩個方式的優點,骨骼按角色特點組成一定的層次結構,有關節相連,可做相對運動,皮膚作爲單一網格蒙在骨骼之外,決定角色的外觀,皮膚網格每一個頂點都會受到骨骼的影響,從而實現完美的動畫。
寫出Animation的五個方法
答:AddClip 添加剪輯、Blend 混合、Play 播放、Stop 停止、Sample 採樣 、CrossFade淡入淡出切換動畫、IsPlaying是否正在播放某個動畫
動畫層(AnimationState Layers)的作用是什麼?
答:動畫層作爲一個具有層級動畫編輯概念的工具,可以用來製作和處理任何類型的動畫
Itween插件的作用是什麼,Itween作用於世界座標還是局部座標,請列舉出3個其常用方法?
答:ITween是補間動畫的一個插件,主要作用就是給出開始、結束的值、時間,此插件實現各種動畫,晃動,旋轉,移動,褪色,上色,音量控制等等。
方法:1.MoveTo 物體移動
2.ColorTo:隨着時間改變對象的顏色組
3.LookTo:隨時間旋轉物體讓其臉部朝向所提供的Vector3或Transform位置
法線貼圖 、CG動畫 ?
答:法線貼圖:是一種特殊的紋理,可以應用在3D表面,讓低模呈現出更明顯的凹凸效果。一般應用在CG動畫、美術效果要求較高的單機遊戲
CG動畫:遊戲中的CG動畫其實是用3D模擬引擎製作的遊戲短片,一般畫面效果比較真實。
Unity3D是否支持寫成多線程程序?如果支持的話需要注意什麼?
答:Unity支持多線程,如果同時要處理很多事情或者與Unity的對象互動小可以用thread,否則使用coroutine。
注意:1.雖然支持多線程,但是僅能從主線程中訪問Unity3D的組件,對象和Unity3D系統調用,所以如果使用的話需要把組件中的數值傳到開啓的新線程中。
2.C#中有lock這個關鍵字,以確保只有一個線程可以在特定時間內訪問特定的對象
Unity3D的協程和C#線程之間的區別是什麼?
答:多線程程序同時運行多個線程,除主線程之外的線程無法訪問Unity3D的對象、組件、方法,而在任一指定時刻只有一個協程在運行。
什麼是協同程序?
答:在主線程運行時同時開啓另一段邏輯處理,來協助當前程序的執行。換句話說,開啓協程就是開啓一個線程。可以用來控制運動、序列以及對象的行爲。
四元數是什麼?主要作用什麼?對歐拉角的優點是什麼?
答:所謂四元數,就是把4個實數組合起來的東西。4個元素中,一個是實部,其餘3個是虛部
作用:四元數用於表示旋轉
優點:
1)能進行增量旋轉
2)避免萬向鎖
3)給定方位的表達方式有兩種,互爲負(歐拉角有無數種表達方式)
四元數不會有歐拉角存在的 gimbal lock 問題[萬向節死鎖]
四元數由4個數組成,旋轉矩陣需要9個數
兩個四元數之間更容易插值
四元數、矩陣在多次運算後會積攢誤差,需要分別對其做規範化(normalize)和正交化 (orthogonalize),對四元數規範化更容易
與旋轉矩陣類似,兩個四元組相乘可表示兩次旋轉
在場景中放置多個Camera並同時處於活動狀態會發生什麼?
答:遊戲界面可以看到很多攝像機的混合
Unity攝像機有幾種工作方式,分別是什麼?
答:正交和透視
正交無法看到一個物體距離自己有多遠,或者遠近的變化,物體也不會隨着距離而收縮,所以一般做2D遊戲或者是UI時會使用正交攝像機。
透視一般看物體會隨着距離有大小的變化,一般3D遊戲裏經常使用這種攝像機
Prefab的作用?如何在移動環境的設備下恰當地使用它?
Prefab是預製物,一般當遊戲中需要頻繁創建一個物體時,使用預製物可以節省內存,方便創建,方便對遊戲物體進行操作,方便對屬性進行修改。
unity 當需要頻繁創建一個物體對象時,怎樣減少內存
答:動態加載再實例化,如果自己不主動清理內存的話,再次加載不會增加內存的,會自動去取之前已經加載好的assets,如果這一個assets你都嫌多的話,那你只能減資源了,比如,模型面數,紋理尺寸等
光照計算中的diffuse的計算公式
- 實際光照強度l=環境光(lambient)+漫反射光(Idiffuse)+鏡面高光(lspecular)
- 環境光:lambient=環境光強度(Aintensity)*環境光顏色(Acolor)
- 漫反射光:ldiffuse=鏡面光照強度(Dintensity)鏡面光顏色(Scolor)(光的反射向量(R).觀察者向量(V))^鏡面光指數(n)
MeshRender中material和shader的區別?
答:MeshRender是模型渲染的組件,有此組件物體才能顯示出來
Material是材質球,實際就是shader的實例,並進行賦值,貼圖、紋理、顏色等。
Shader是着色器,實際上是一段程序,還可以用來實現一些僅靠貼圖不容易實現的效果,如玻璃。
Shader大致分爲:
1.表面着色器
2.頂點和片元着色器
3.固定功能着色器
alpha blend工作原理
答:Alpha Blend是 實現透明效果,Color = 原顏色alpha/255+目標色(255-alpha)/255
光照貼圖 的優勢是什麼?
- 使用光照貼圖比使用實時光源渲染要快
- 可以降低遊戲內存消耗
- 多個物體可以使用同一張光照貼圖
Vertex Shader是什麼,怎麼計算?
頂點着色器:頂點着色器是一段執行在GPU上的程序,用來取代fixed pipeline中的
transformation和lighting,Vertex Shader主要操作頂點。
Vertex Shader對輸入頂點完成了從local space到homogeneous space(齊次空間)的變換過程,homogeneous space即projection space的下一個space。在這其間共有world transformation, view transformation和projection transformation及lighting幾個過程。
.unity3d提供了幾種光源,分別是什麼
4種,
Directionl light:方向光
Point Light:點光
Spot Light:聚光
Area Light:區域光,區域光在“實時光照”模式下是無效的,僅在“烘焙光照”模式下有用。
物理更新一般在哪個系統函數裏?
FixedUpdate:每固定幀繪製時執行一次,和update不同的是FixedUpdate是渲染幀執行,如果你的渲染效率低下的時候FixedUpdate調用次數就會跟着下降。FixedUpdate比較適用於物理引擎的計算,因爲是跟每幀渲染有關。Update就比較適合做控制。
OnEnable、Awake、Start運行時的發生順序?哪些可能在同一個對象週期中反覆的發生?
答:Awake –>OnEnable->Start
OnEnable在同一週期中可以反覆地發生
Unity3d腳本從喚醒到銷燬有着一套比較完整的生命週期,請列出系統自帶的幾個重要的方法。
Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>Reset——>OnDisable——>OnDestroy
物理更新一般放在哪個系統函數裏?
FixedUpdate因爲不受到計算機幀頻的影響,所以比較適合於做物理方面的更新。
移動攝像機的動作放在哪個系統函數中,爲什麼放在這個函數中?
LateUpdate,在每幀執行完畢調用,它是在所有Update結束後才調,比較適合用於命令腳本的執行。官網上例子是攝像機的跟隨,都是在所有Update操作完纔跟進攝像機,不然就有可能出現攝像機已經推進了,但是視角里還未有角色的空幀出現。
請簡述OnBecameVisible及OnBecameInvisible的發生時機,以及這一對回調函數的意義?
答:當物體是否可見切換之時。可以用於只需要在物體可見時才進行的計算。
當renderer(渲染器)在任何相機上都不可見時調用:OnBecameInvisible 當renderer(渲染器)在任何相機上可見時調用:OnBecameVisible
動態加載資源的方式?區別是什麼?
1.Resources.Load();
2.AssetBundle
區別:
Resources是動態內部調用,Resources在編輯環境下是project窗口的一個文件夾,調用裏面的資源,可以用Resources類,比如Resources.Load,打包後這個文件夾是不存在的,會統一生成assets資源,AssetBundle 是外部調用,要用AssetBundle 首先要先把資源打包爲.assetbundle文件,再動態的去加載這個文件,本地或者網絡服務器都可以。
簡單說,Resources資源的加載是動態加載內部的,AssetBundle 是動態加載外部的,可用於熱更新。
以下哪個函數在遊戲進入新場景後會被馬上調用?
MonoBehaviour.OnLevelWasLoaded
如何銷燬一個UnityEngine.Object及其子類對象
Destory函數。
獲取、增加、刪除組件的命令分別是什麼?
獲取:GetComponent
增加:AddComponent
沒有刪除組件只有讓組件不生效:enable
Application.loadLevel命令是什麼?
切換場景
調試記錄到控制檯的命令是什麼?
答: Debug.Log();
LayerMask.NameToLayer()這個方法有什麼作用?
答:層索引
localPosition與Position的使用區別?
localPosition:自身位置,相對於父級的變換的位置,局部座標其實就是自身的座標,會隨着物體的旋轉而變化的。
Position:在世界座標transform的位置,世界座標是不會變的,一直以世界座標軸的XYZ爲標準。
物體自身旋轉使用的函數?
Transform.Rotate()
物體圍繞某點旋轉使用的函數?
Transform.RotateAround()
6.U3D中用於記錄節點空間幾何信息的組件名稱,及其父類名稱
Transform 父類是 Component
寫一個計時器工具,從整點開始計時,格式爲:00:00:00
代碼實現:
private float _time;
void Start()
{
_time = 0f;
}
// Update is called once per frame
void Update()
{
_time += Time.deltaTime;
Debug.Log(string.Format("{0:D2}:{1:D2}:{2:D2}", (int)(_time / 3600), (int)(_time / 60), (int)(_time % 60)));
}
實現吊機吊物體的功能
思路:
- 檢測物體碰撞
- 將物體設爲吊機的子物體
代碼:此代碼只實現物體跟隨效果
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class jishiqi : MonoBehaviour
{
GameObject diaoji;
GameObject cube;
void Start()
{
diaoji = GameObject.Find("Cube");
cube = GameObject.Find("Cube (1)");
}
// Update is called once per frame
void Update()
{
diaoji.transform.position += new Vector3(0, 0.1f, 0);
}
private void OnCollisionEnter(Collision collision)
{
Debug.Log("發生碰撞");
if(collision.gameObject.name == "Cube (1)")
cube.transform.parent = diaoji.transform;//將其設置爲吊機的子物體
}
}
效果圖:
Material和Physic Material區別?
答:PhysicMaterial 物理材質:主要是控制物體的摩擦,彈力等物理屬性。
Material材質:主要是控制一個物體的顏色,質感等顯示。
CharacterController和Rigidbody的區別?
CharacterController自帶膠囊碰撞器,裏面包含有剛體的屬性;
Rigidbody就是剛體,使物體帶有剛體的特徵。
Unity3d的物理引擎中,有幾種施加力的方式,分別描述出來
rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函數中。
什麼叫做鏈條關節?
Hinge Joint,可以模擬兩個物體間用一根鏈條連接在一起的情況,能保持兩個物體在一個固定距離內部相互移動而不產生作用力,但是達到固定距離後就會產生拉力。
什麼是導航網格( NavMesh)?
Unity內一種用於實現自動尋路的網格
簡述Unity3D支持的作爲腳本的語言的名稱
答:Unity的腳本語言基於Mono的.Net平臺上運行,可以使用.NET庫,這也爲XML、數據庫、正則表達式等問題提供了很好的解決方案。
Unity裏的腳本都會經過編譯,他們的運行速度也很快。這三種語言實際上的功能和運行速度是一樣的,區別主要體現在語言特性上。
JavaScript
C#
Boo
向量的點乘、叉乘以及歸一化的意義?
1)點乘計算兩個向量之間的夾角,還可表示某一方向的投影
2)叉乘得到的是法向量
3)標準化向量:用在只關係方向,不關心大小的時候
矩陣相乘的意義及注意點?
用於表示線性變換:旋轉、縮放、投影、平移、仿射
注意:矩陣的蠕變:誤差的積累
爲什麼dynamic font在unicode環境下優於static font?
答:Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案。
使用動態字體時,Unity將不會預先生成一個與所有字體的字符紋理。當需要支持亞洲語言或者較大的字體的時候,若使用正常紋理,則字體的紋理將非常大。
Render的作用?描述MeshRender和SkinnedMeshRender的關係與不同
答:render是渲染器,渲染器可以使物體顯示在屏幕上。
MeshRender是網格渲染,SkinnedMeshRender是蒙皮網格渲染器
簡述SkinnedMesh的實現原理
答:骨骼蒙皮動畫,模型本身是靜態的,是因爲通過蒙皮,使模型每個點都有Skin數據,Skin數據包括頂點受到哪些骨骼影響以及這些骨骼影響頂點的權重值,還有動畫數據,有了Skin數據的模型就可以根據動畫數據進行顯示動畫了。
爲什麼Unity3D中會發生在組件上出現數據丟失的情況?
組件上綁定的對象被刪除了
如何安全的在不同工程間安全地遷移asset數據?三種方法
- 1)將Assets目錄和Library目錄一起遷移
- 2)導出包
- 3)用unity自帶的assets Server功能
Lod是什麼,優缺點是什麼?
答:LOD是Level of detail簡稱,意爲多層次細節,是最常用的遊戲優化技術,LOD技術指根據物體模型的幾點在顯示環境中所處的位置和重要性,決定物體渲染的資源分配,降低非重要物體的面數和細節度,從而獲得高效率的渲染運算。
優點:可根據距離動態的選擇渲染不同細節的模型
缺點:增加美工工作量,增大了遊戲的容量。
兩種陰影判斷的方法、工作原理。
自身陰影:因物體自身的遮擋而使光線照射不到它上面的某些可見面
工作原理:利用背面剔除的方法求出,即假設視點在點光源的位置。
投射陰影:因不透明物體遮擋光線使得場景中位於該物體後面的物體或區域收不到光照照射而形成的陰影。
工作原理:從光源處向物體的所有可見面投射光線,將這些面投影到場景中得到投影面,再將這些投影面與場景中的其他平面求交得出陰影多邊形,保存這些陰影多邊形信息,然後在按視點位置對場景進行相應處理得到所要求的師徒(利用空間換時間,每次只需依據視點位置進行一次陰影計算即可,省去了一次消隱過程)若是動態光源此方法就無效了。
MipMap是什麼,作用?
MipMapping:在三維計算機圖形的貼圖渲染中有常用的技術,爲加快渲染進度和減少圖像鋸齒,貼圖被處理成由一系列被預先計算和優化過的圖片組成的文件,這樣的貼圖被稱爲MipMap。
如何優化內存?
1.壓縮自帶類庫
2.將暫時不用的以後還需要使用的物體隱藏起來而不是直接Destroy掉
3.釋放AssetBundle佔用的資源
4.降低模型的片面數,降低模型的骨骼數量,降低貼圖的大小
5.使用光照貼圖
6.使用多層次細節(LOD)
7.使用着色器(Shader)
8.使用預設(Prefab)等
什麼是渲染管道?
是指在顯示器上爲了顯示出圖像而經過的一系列必要操作。
渲染管道中的很多步驟,都要將幾何物體從一個座標系中變換到另一個座標系中去。
主要有三步:應用程序階段,幾何階段 光柵階段
本地座標->視圖座標->背面裁剪->光照->裁剪->投影->視圖變換->光柵化。
什麼是矢量圖 ?
計算機中顯示的圖形一般可以分爲兩大類——矢量圖和位圖。矢量圖使用直線和曲線來描述圖形,這些圖形的元素是一些點、線、矩形、多邊形、圓和弧線等等,它們都是通過數學公式計算獲得的。例如一幅花的矢量圖形實際上是由線段形成外框輪廓,由外框的顏色以及外框所封閉的顏色決定花顯示出的顏色。由於矢量圖形可通過公式計算獲得,所以矢量圖形文件體積一般較小。矢量圖形最大的優點是無論放大、縮小或旋轉等不會失真;最大的缺點是難以表現色彩層次豐富的逼真圖像效果。
什麼是矩陣?矩陣運算?
矩陣:橫軸排列的二維數據表格
矩陣運算:
加減 限制條件:行和列必須相同,對應相加相減得到結果
乘法 限制條件:要求左矩陣的行和右矩陣的列必須同,行數和左矩陣相等,列數和右矩陣相等,結果的第i行第j列,是左矩陣的第i行和右矩陣的第j列逐個相乘並把結果相加,得到結果是結果 的 第i行第j列
角度和弧度的轉換
角度和弧度
度和弧度之間的換算 1弧度 = 180度 /pi(約57.3)
1度=pi/180弧度(約0.017)
矢量標量
答:矢量有方向如力速度 標量只有大小沒有方向如溫度
矢量取模就是隻要大小不要方向
^單位向量 有方向 大小爲1的向量
矢量的加法:是矢量的幾何和,服從平行四邊形規則
矢量滿足交換律,滿足結合律
在直角座標系中,矢量等於騎在座標軸上投影的矢量之和(二維矢量可以看做三維矢量的特例也就是說 三維成立,二維也成立)
矢量減法:
大小相等 方向相反 稱爲逆矢量
任意多個矢量首尾相連接組成閉合多邊形,其結果必爲0
矢量的乘法:點積(內積、標量積)、叉積(外積)結果是矢量