?????個(gè)人主頁(yè):@元宇宙-秩沅
hallo 歡迎 點(diǎn)贊?? 收藏? 留言?? 加關(guān)注?!
本文由 秩沅 原創(chuàng)
收錄于專(zhuān)欄 unity 實(shí)戰(zhàn)系列
?相關(guān)文章?
?【軟件設(shè)計(jì)師高頻考點(diǎn)暴擊】
-本站最全-unity常用API大全(萬(wàn)字詳解),不信你不收藏
-關(guān)于游戲劇情模式中用到的基礎(chǔ)簡(jiǎn)單API
-控制游戲人物移動(dòng)的細(xì)節(jié)到底有多少?
-坦克炮管旋轉(zhuǎn)發(fā)射炮彈(向量基礎(chǔ),射線碰撞,物體實(shí)例化)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-659449.html
-基于unity物體定點(diǎn)移動(dòng)與模擬剎車(chē)的細(xì)節(jié) GIF 圖文詳解
幀的概念
fps (Frames Per Second) : 即每秒鐘幀數(shù)
- 60幀:
1秒更新60次畫(huà)面
1s = 1000ms - 60幀:1幀為 1000ms/60=16.66ms
- 30幀:1幀為 1000ms/30=33.33ms
人眼舒適放松可視幀數(shù)是每秒24幀
- 游戲卡頓的原因:
處理1幀游戲邏輯中的計(jì)算量過(guò)大,或CPU機(jī)能不行,不能在—幀的時(shí)間內(nèi)處理完所有游戲邏輯
日志打印
Debug.Log(“This is a log message.”);
Debug.LogWarning(“This is a warning message!”);
Debug.LogError(“This is an error message!”);
反射機(jī)制
場(chǎng)景的本質(zhì)-配置文件-(場(chǎng)景類(lèi)型文件右鍵通過(guò)記事本可以看到)
-
1.獲取
rigidBody = this.GetComponent(); -
2.添加力
rigidBody.AddForce(Vector3.forward * 10);相對(duì)世界坐標(biāo)世界坐標(biāo)系 Z軸正方向加了一個(gè)里加力過(guò)后 對(duì)象是否停止移動(dòng) 是由阻力決定的如果阻力為0 那給了一個(gè)力過(guò)后 始終 是不會(huì)停止運(yùn)動(dòng)
-
-
讓對(duì)象 相對(duì)于自己的面朝向動(dòng)
相對(duì)世界坐標(biāo)
rigidBody.AddForce(this.transform.forward * 10);相對(duì)本地坐標(biāo)
rigidBody.AddRelativeForce(Vector3.forward * 10);
-
API之——RigidBody
添加扭矩力,讓其旋轉(zhuǎn)
- 相對(duì)世界坐標(biāo)
rigidBody.AddTorque(Vector3.up * 10); - 相對(duì)本地坐標(biāo)
rigidBody.AddRelativeTorque(Vector3.up * 10);
改變速度
速度方向 是相對(duì)于 世界坐標(biāo)系的
rigidBody.velocity = Vector3.forward * 5;
如果要直接通過(guò)改變速度 來(lái)讓其移動(dòng) 一定要注意這一點(diǎn)
.模擬爆炸效果
rigidBody.AddExplosionForce(100, Vector3.zero, 10);
模擬爆炸的力 一定是 所有希望產(chǎn)生爆炸效果影響的對(duì)象 都需要得到他們的剛體 來(lái)執(zhí)行這個(gè)方法 才能都有效果
力的幾種模式
力的模式 主要的作用 就是 計(jì)算方式不同而已
由于計(jì)算方式的不同 最終的移動(dòng)速度就會(huì)不同
- rigidBody.AddForce(Vector3.forward * 10,ForceMode.Acceleration);
字符 | 意義 |
---|---|
F | 力 |
t | 時(shí)間 |
m | 質(zhì)量 |
v | 速度 |
動(dòng)量定理 | Ft = mv v = Ft/m; |
-
1.Acceleration
給物體增加一個(gè)持續(xù)的加速度,忽略其質(zhì)量
字符 | 值 |
---|---|
F | (0,0,10) |
t | 0.02s |
m | 默認(rèn)為1 |
v | 10*0.02/ 1 = 0.2m/s |
每物理幀移動(dòng) | 0.2m/s*0.02 = 0.004m |
-
2.Force
給物體添加一個(gè)持續(xù)的力,與物體的質(zhì)量有關(guān)
字符 | 值 |
---|---|
F | (0,0,10) |
t | 0.02s |
m | 2kg |
v | 10*0.02/ 2 = 0.1m/s |
每物理幀移動(dòng) | 0.1m/s*0.02 = 0.002m |
-
3.Impulse
給物體添加一個(gè)瞬間的力,與物體的質(zhì)量有關(guān),忽略時(shí)間 默認(rèn)為1
字符 | 值 |
---|---|
F | (0,0,10) |
t | 0.01s |
m | 2kg |
v | 10*1/ 2 = 5m/s |
每物理幀移動(dòng) | 5m/s*0.02 = 0.1m |
- 4.VelocityChange
字符 | 值 |
---|---|
F | (0,0,10) |
t | 1s |
m | 1kg |
v | v = 10*1/ 1 = 10m/s |
每物理幀移動(dòng) | 10m/s*0.02 = 0.2m |
剛體是否休眠
- rigidBody.IsSleeping())
- rigidBody.WakeUp();——喚醒剛體
API之——Inspector可編輯變量+輔助特性
可視化去編輯腳本的變量、
??輔助特性:
- 字典 自定義類(lèi)型 私有和被保護(hù)類(lèi)型無(wú)法在Inspector面板上顯示
- 【serializeField】——將私有類(lèi)型和保護(hù)類(lèi)型可視化到面板上
- 【System.serializeField】——將自定義類(lèi)型可視化到面板上
- 【HideIninspector】——將公共變量隱藏
- 【Header(“分組說(shuō)明”)】——將可視化變量進(jìn)行分組
- 【Tooltip(“內(nèi)容說(shuō)明”)】——鼠標(biāo)移動(dòng)變量處時(shí)顯示說(shuō)明信息
- 【Range(最小值,最大值)】——通過(guò)拖動(dòng)條的方式來(lái)控制范圍
- 【contextMenuItem(”變量名x“,“變量的方法名”)】——停在可視化變量上時(shí)顯示方法,并可以點(diǎn)擊調(diào)用–方法需要無(wú)參無(wú)返回
- 【contextMenu(”測(cè)試函數(shù)名")】——只為調(diào)式,右鍵選擇方法執(zhí)行
- 【Multline(x)】——將字符串設(shè)置可見(jiàn)的x行
-
【TextArea(3,4))】——添加滾動(dòng)條來(lái)查看設(shè)置的文本區(qū)
+【DisallowMultipleComponent】-不讓掛載多重腳本
API之——坐標(biāo)系
①世界坐標(biāo)系——transform…
②物體坐標(biāo)系——transform.Local…
③屏幕坐標(biāo)系
④視口坐標(biāo)系——用的較少,主要調(diào)整窗口
坐標(biāo)轉(zhuǎn)換
API之——生命函數(shù)
- ?????十大常見(jiàn)的生命函數(shù)
?????Reset()://重置函數(shù),
調(diào)用情況和時(shí)間:
編譯器不運(yùn)行的情況下 和 使用腳本組件Reset功能的時(shí)候, 掛腳本的時(shí)候
調(diào)用次數(shù): 1次
????? Awake(); //蘇醒函數(shù)
調(diào)用情況和時(shí)間:
1.點(diǎn)擊運(yùn)行的時(shí)候
2.組件從失靈到激活的時(shí)候,但只調(diào)用一次
3.Instantiate方法調(diào)用的時(shí)候
調(diào)用次數(shù): 1次
?????OnEnable(); //組件調(diào)用函數(shù)
調(diào)用情況和時(shí)間: 組件從失靈到激活的時(shí)候,可多次實(shí)現(xiàn)
調(diào)用次數(shù):只要組件有失靈到激活的狀態(tài)就可調(diào)用 ,
?????Strat():
調(diào)用情況和時(shí)間: 當(dāng)游戲物體被激活,或者腳本組件被激活時(shí)調(diào)用 , (點(diǎn)擊運(yùn)行的時(shí)候也是會(huì)被激活)
調(diào)用次數(shù): 1次
?????FixedUpdate(每幀)
一般用作物理更新
調(diào)用情況和時(shí)間: FixedUpdate一般適用在相關(guān)物理引擎中。它的頻 率是0.02秒,是固定的。
調(diào)用次數(shù): 大概每秒50次左右、
FixedUpdate & Update & LateUpdate的 區(qū)別詳解
?????UpData(每幀) ;
一般用作游戲邏輯更新 update取決于電腦顯卡的性能,好的話,快,不行的話就慢,所以相比Fixed Update它具有隨機(jī)性。
Update()函數(shù)——每一幀執(zhí)行一次,往往需要和Time.DeltaTime配合使用,達(dá)到不同機(jī)器運(yùn)行效果一樣
調(diào)用情況和時(shí)間: 在以上生命周期函數(shù)之后,每幀調(diào)用一次
調(diào)用次數(shù): 大概每秒60次左右
變量賦值生效順序:
變量聲明直接賦值 > 檢視面板賦值 > Awake > Enable > 外部賦值 > Start
?????LateUpate(每幀):
一般用作相機(jī)更新 它的執(zhí)行順序在update的后面,一般適用于相機(jī)的跟隨,物體運(yùn)動(dòng)在update中,相機(jī)跟隨在LateUpdate,這樣會(huì)減少誤差,避免出現(xiàn)不必要的瑕疵。
調(diào)用情況和時(shí)間: 在Update調(diào)用之后,并且也是每秒60幀左右(適用于物體移動(dòng)后的視角跟隨)
調(diào)用次數(shù): 大概每秒60次左右
?????OnGUI(每幀)
- 它一般與界面化,渲染,UI等有關(guān),實(shí)時(shí)執(zhí)行,比如想在幕布上弄個(gè)按鈕button
?????OnDisable():
調(diào)用情況和時(shí)間: 和OnEnable差不多,但是Disable是組件從完好到失活的狀態(tài), (相當(dāng)于關(guān)閉組件的時(shí)候)
調(diào)用次數(shù): 組件從激活到失靈的時(shí)候調(diào)用(二者前提是在游戲運(yùn)行的時(shí)候)
?????OnApplicationQuit()
調(diào)用情況和時(shí)間: 當(dāng)所有游戲物體退出時(shí)調(diào)用,適用于打包的時(shí)候
調(diào)用次數(shù): 滿足以上情況便調(diào)用
?????OnDestroy();
調(diào)用情況和時(shí)間: 適用于物體的銷(xiāo)毀,刪除,以及游戲的停止退出時(shí)
調(diào)用次數(shù): 滿足以上情況便調(diào)用
?????總的執(zhí)行順序?yàn)椋?/p>
- awake——OnEnable——start——FixedUpdate——Update——LateUpdate——OnGUI——DIsEnabel——OnDestory
API之——鼠標(biāo)相關(guān)
API 之——?jiǎng)?chuàng)建,獲取,失靈,銷(xiāo)毀
???????1.創(chuàng)建物體的三種方式
1.new 構(gòu)造函數(shù)
2.instantiate 實(shí)例化方法
3.Gameobject .CreatPrimtive(Primitve Type.cube);使用特別的API創(chuàng)建一些基本的游戲物體類(lèi)型(原始幾何體)
???????2.游戲物體的獲取和查找
if(this.TryGetComponent<>( out 腳本名) )
{
//獲取到了就進(jìn)行處理
}
-
? 獲取
-
1.this
-
2.獲取游戲物體的標(biāo)簽 gameObject.tag
-
3.獲取游戲物體的名字 gameObject.name
-
4.獲取游戲物體的層級(jí) gameObject.layer
獲取對(duì)象位置信息
- 1.位置:this.transform.position
- 2.角度:this.transform.eulerAngles
- 3,縮放大?。簍his.transform.lossyScale
1.子對(duì)象的獲取
- 1.transform.Getchild(序列號(hào));
- 2.transform.GetsiblingIndex() -----獲取同級(jí)索引(查找自已是父親的第幾個(gè)兒子)
- 3.transform.GetComponentInChildren< Transform>(序列號(hào));
2.父對(duì)象的獲取
- 1.transform.parent();
3.Project的資源獲取–資源加載
- Resources.Load< GameObject>(“資源路徑”)
4.根據(jù)腳本名獲取
-
獲取腳本的方法 如果獲取失敗 就是沒(méi)有對(duì)應(yīng)的腳本 會(huì)默認(rèn)返回空
Test t = this.GetComponent(“Test”) as est;
print(t); -
根據(jù)Type獲取
t = this.GetComponent(typeof(Test)) as Test;
print(t); -
根據(jù)泛型獲取 建議使用泛型獲取 因?yàn)椴挥枚无D(zhuǎn)換
t = this.GetComponent<Test>();
?腳本的獲取
-
腳本是否失活
this.enabled = false; -
1.得到自己掛載的單個(gè)腳本
Test t = this.GetComponent(“Test”) as Test; -
2.得到自己掛載的多個(gè)腳本
Lesson3[] array = this.GetComponents(); -
3.得到子對(duì)象掛載的腳本(它默認(rèn)也會(huì)找自己身上是否掛載該腳本)
t = this.GetComponentInChildren<Lesson3_Test>(true); ——//ture表示失活了亦會(huì)尋找 -
4.得到父對(duì)象掛載的腳本(它默認(rèn)也會(huì)找自己身上是否掛載該腳本)
t = this.GetComponentInParent<Lesson3_Test>(); -
5.嘗試獲取腳本
提供了一個(gè)更加安全的 獲取單個(gè)腳本的方法 如果得到了 會(huì)返回true
?查找物體
- 1.GameObject,Find()-----按照名字查找游戲?qū)ο?,用太多會(huì)降低性能
-
find的本質(zhì)——單例模式的升級(jí)版 + 服務(wù)定位器 (若代碼較為復(fù)雜的話性能消耗較大)
- 2.GameObject,FindobjectType<>();------按照組件名來(lái)查找游戲物體
- 3.GameObject.FindGameObjectwithTag()------按照游戲物體標(biāo)簽來(lái)查找游戲物體
- 4.多數(shù)查找與獲取
GameObject[] enemyGos= GameObject.FindGameObjectsWithTag("Enemy");
for (int i = 0; i < enemyGos.Length; i++)
{
Debug.Log("查找到的敵人游戲物體名稱(chēng)是:"+enemyGos[i].name);
}
?失靈
- 1.xx.SetActive(false); --------應(yīng)用于游戲物體xx為GameObject類(lèi)型繼承自O(shè)bject類(lèi)
使得相應(yīng)的腳本對(duì)象失靈 - 2.xx.enable = fasle;-----------應(yīng)用于腳本/組件xx為組件類(lèi)型,繼承為Copment類(lèi)
使得相應(yīng)游戲物體的組件失靈 - 3.XX.activeInHierarchy____判斷該游戲物體是否是失活狀態(tài)
?銷(xiāo)毀
- 1.Destroy()
- 2.Detroy(xx , Time)__延時(shí)銷(xiāo)毀
???????3.繼承
常見(jiàn)類(lèi)的繼承關(guān)系:
自己創(chuàng)建的類(lèi) -> MonoBehavair->Behavir->Conpment->Object
API 之——父子關(guān)系
-
不要爸爸了:this.transform.SetParent(null);
-
認(rèn)爸爸 :this.transform.SetParent(GameObject.Find(“爸爸名”).transform);
參數(shù)二:是否保留世界坐標(biāo)的 位置 角度 縮放 信息
-
this.transform.SetParent(GameObject.Find(“Father3”).transform, false);
true : 保留 世界坐標(biāo)下的狀態(tài) 和 父對(duì)象 進(jìn)行計(jì)算 得到本地坐標(biāo)系的信息 false : 不會(huì)保留 會(huì)直接把世界坐標(biāo)系下的 位置角度縮放 直接賦值到 本地坐標(biāo)系下
-
不要兒子了: this.transform.DetachChildren();
-
得到兒子數(shù)量:this.transform.childCount
-
得到兒子信息: this.transform.GetChild(0);
-
親子鑒定:son.IsChildOf(this.transform)
-
得到自己是第幾個(gè)兒子:son.GetSiblingIndex())
-
把自己變成太子: son.SetAsFirstSibling();
-
把自己變成最后的一個(gè)兒子: son.SetAsLastSibling();
-
直接設(shè)置自己是第幾個(gè)兒子: son.SetSiblingIndex(1);
API 之——退出
- Application.Quit()———編譯器下使用沒(méi)用,只可以在打包之后,才有退出游戲的作用
API 之——transform組件篇
???????1.transform的位置信息
transform.position ----游戲物體trans組件的世界位置信息
transform.Rotation----游戲物體的四元旋轉(zhuǎn)信息
transform.enlerAugle- —游戲物體的歐拉角的信息(也就是Inspactor面板中的Rotation信息)
transform.localposition/localRotion/localenleAugle--------表自身的自身信息
- 當(dāng)前游戲物體的世界四元旋轉(zhuǎn)值為——transform.rotation
- 當(dāng)前游戲物體的自身大小為——transform.localScale
- 當(dāng)前游戲物體的自身位置為——transform.localPosition
- 當(dāng)前游戲物體的自身四元旋轉(zhuǎn)位置——transform.localRotation
- 當(dāng)前游戲物體的世界歐拉角為——transform.eulerAngles
- 當(dāng)前游戲物體的自身歐拉角為——transform.localEulerAngles
???????2.游戲物體的自身方向和世界軸方向
針對(duì)自身:
==transform.forword ==----向前Z軸方向
transform.up------向上y軸方向
transform.right----向右x軸方向
針對(duì)世界:
vector.XX…
針對(duì)看向:
transform.LookAt(某個(gè)方向)——一直看向某個(gè)方向
transform.LookAt(某個(gè)物體)——一直看向某個(gè)物體
針對(duì)縮放
#region 知識(shí)點(diǎn)一 縮放
//相對(duì)世界坐標(biāo)系
print(this.transform.lossyScale);
//相對(duì)本地坐標(biāo)系(父對(duì)象)
print(this.transform.localScale);
距離運(yùn)動(dòng)相關(guān)
- 當(dāng)前的位置 + 我要?jiǎng)佣嚅L(zhǎng)距離 == 得出最終所在的位置
this.transform.position = this.transform.position + this.transform.up * 1 * Time.deltaTime;
- 始終會(huì)朝向相對(duì)于自己的面朝向去動(dòng)
this.transform.position += this.transform.forward * 1 * Time.deltaTime;
- 相對(duì)于世界坐標(biāo)系的 Z軸 動(dòng) 始終是朝 世界坐標(biāo)系 的 Z軸正方向移動(dòng)
this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.World);
- 相對(duì)于世界坐標(biāo)的 自己的面朝向去動(dòng) 始終朝自己的面朝向移動(dòng)
this.transform.Translate(this.transform.forward * 1 * Time.deltaTime, Space.World);
- 相對(duì)于自己的坐標(biāo)系 下的 Z軸正方向移動(dòng) 始終朝自己的面朝向移動(dòng)
this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.Self);
??????? 3.用transform組件來(lái)進(jìn)行查找(包含索引查找)
-
被創(chuàng)造的游戲物體的世界坐標(biāo)位置是——xx.transform.position
-
當(dāng)前transform組件掛載的游戲物體對(duì)象的名字是——transform.name
-
當(dāng)前transform組件掛載的游戲?qū)ο蟮淖訉?duì)象的數(shù)量——transform.childCount
-
查找當(dāng)前游戲物體的子對(duì)象的trans組件名稱(chēng)為——transform.Find(“zz”)
-
查找當(dāng)前游戲物體的第一個(gè)子對(duì)象——transform.GetChild(0));
-
查找該游戲物體在父類(lèi)中子對(duì)象的索引位置"——transform.GetSiblingIndex()
API 之——Vector實(shí)質(zhì)
???????1.Vector2結(jié)構(gòu)體的靜態(tài)變量
1.Vector2.up // 以下的形式pint之后是 (X,y)
2.Vector2.down
3.Vector2.Left
4.Vector2,Riht
5.Vector2.one //單位化之后的值
6.Vetor2.zero // 原點(diǎn)的值
???????2.Vector2 結(jié)構(gòu)體的成員變量
1.x
2.y
3.XX.normalized //返回 單位化的值
4XX.magnitude //返回該向量的模長(zhǎng)
5.XX.sqrMagnitude //返回該向量 模長(zhǎng)的平方
‘’‘’‘’‘’‘’‘’
???????3.索引器的格式和存在的目的
1,格式
訪問(wèn)修飾符 + 數(shù)據(jù)類(lèi)型+ this [ 索引類(lèi)型 index]
{
get
set
}
2.目的:
簡(jiǎn)化結(jié)構(gòu)體或者類(lèi)成員的引用 (簡(jiǎn)化代碼),可向數(shù)組用下標(biāo)那樣調(diào)用成員
???????4.Vector2的公共函數(shù)-Equrls()
Equrls(); // 比較兩個(gè)向量是否相等
用法 : XX1 . Equals( XX2 );
???????5,Vector2的靜態(tài)方法
-
1.vector2.Angle(); 返回兩個(gè)向量的夾角
-
2.vevtor2.Distance(): 返回兩個(gè)點(diǎn)(向量)的距離
-
3.Vetor2.Lerp(a , b, t) ;返回兩個(gè)向量的差值 (二維向量線性差值)
-
4.Vecor.LerpUnclamped(a,b,t) ; 在 a 與 b 之間按 t 進(jìn)行線性插值,t 沒(méi)有限制。
-
5.Vector2.MoveTowards(a , b,t): t為限制向量的移動(dòng)步頻(可以理解為規(guī)定速度移動(dòng))、
-
6.vector2.max();
-
7.vector2.min();
-
8.vecotr2.smoothDamp(a,b,v ,t);平滑阻尼,可理解為汽車(chē)剎車(chē)效果,v為速度是二維向量,t為平滑時(shí)間
API 之——MathF類(lèi)
???????1,MathF類(lèi)的靜態(tài)變量
?Math和MathF的區(qū)別:mathf是unity封裝的類(lèi)它在基于math數(shù)學(xué)類(lèi)的基礎(chǔ)上添加了適合unity游相關(guān)的方法
?強(qiáng)制類(lèi)型轉(zhuǎn)換和向下取整&向下取整:除去c#中常用的三個(gè)強(qiáng)轉(zhuǎn) —ceilToInt() 和 FloorInt()
?鉗制函數(shù)MathF.clamp()
?Mathf.sigh()-判斷正負(fù)
?Mathf.MoveTowords()——無(wú)限接近但不完全相等
?Mathf.SmoothDamp()——先快后慢
//1.π - PI
//2.取絕對(duì)值 - Abs
//3.向上取整 - CeilToInt
//4.向下取整 - FloorToInt
//5.鉗制函數(shù) - Clamp
//6.獲取最大值 - Max
//7.獲取最小值 - Min
//8.一個(gè)數(shù)的n次冪 - Pow
//9.四舍五入 - RoundToInt
//10.返回一個(gè)數(shù)的平方根 - Sqrt
//11.判斷一個(gè)數(shù)是否是2的n次 - IsPowerOfTwo
//12.判斷正負(fù)數(shù) - Sign
???????1,MathF類(lèi)的靜態(tài)變量
- print(Mathf.Deg2Rad+“,度到弧度換算常量”);
- print(Mathf.Rad2Deg+ “,弧度到度換算常量”);
- print(Mathf.Infinity+“正無(wú)窮大的表示形式”);
- print(Mathf.NegativeInfinity + “負(fù)無(wú)窮大的表示形式”);
- print(Mathf.PI);
???????2,MathF類(lèi)的靜態(tài)函數(shù)
-
print(Mathf.Abs(-1.2f)+ “,-1.2的絕對(duì)值”);
-
print(Mathf.Acos(1)+“,1(以弧度為單位)的反余弦”);
-
print(Mathf.Floor(2.74f)+“,小于或等于2.74的最大整數(shù)”);
-
print(Mathf.FloorToInt(2.74f)+“,小于或等于2.74的最大整數(shù)”);
-
Mathf.Lerp(1,2,0.5f) ——,a和b按參數(shù)t進(jìn)行線性插值
-
Mathf.LerpUnclamped(1, 2, -0.5f)——,a和b按參數(shù)t進(jìn)行線性插值
-
float start = 0;
float result = 0;
float time = 0;
//Lerp函數(shù)公式
//result = Mathf.Lerp(start, end, t);
//t為插值系數(shù),取值范圍為 0~1
//result = start + (end - start)*t -
插值運(yùn)算用法一
每幀改變start的值——變化速度先快后慢,位置無(wú)限接近,但是不會(huì)得到end位置
start = Mathf.Lerp(start, 10, Time.deltaTime); -
插值運(yùn)算用法二
每幀改變t的值——變化速度勻速,位置每幀接近,當(dāng)t>=1時(shí),得到結(jié)果
time += Time.deltaTime;
result = Mathf.Lerp(start, 10, time);
???????3,MathF類(lèi)中的 倒計(jì)時(shí) 函數(shù)
Math.MoveTowards()
void Update()
{
print("游戲倒計(jì)時(shí):" + endTime);
endTime = Mathf.MoveTowards(endTime,0,0.1f); //每次減0.01 直到endTime為0
}
API 之——三角函數(shù)
弧度轉(zhuǎn)角度
float rad = 1;
float anger = rad * Mathf.Rad2Deg;
角度轉(zhuǎn)弧度
anger = 1;
rad = anger * Mathf.Deg2Rad;
三角函數(shù)
//注意:需要加上弧度值
Mathf.Sin(30 * Mathf.Deg2Rad) //0.5
Mathf.Cos(60 * Mathf.Deg2Rad) //0.5
通過(guò)反三角函數(shù)求弧度
-
弧度 = Mathf.Asin() / Acos();
-
反三角函數(shù)得到的結(jié)果是 正弦或者余弦值對(duì)應(yīng)的弧度
rad = Mathf.Asin(0.5f); //弧度 print(rad * Mathf.Rad2Deg); //角度
練習(xí)
【Unity每日一記】讓一個(gè)物體按余弦曲線移動(dòng)—(三角函數(shù)的簡(jiǎn)單運(yùn)用)
API 之——向量
位置 + 向量 = 平移位置
位置 - 向量 = 平移位置
位置 - 位置 = 向量
向量 - 位置 = 無(wú)意義
向量 * 向量 = 向量
向量 * 值 = 擴(kuò)大模長(zhǎng)
-
向量之間的距離 ——Vector3.Disrtance() 向量 和向量之間相減 A - B
-
0向量——Vector.zero()
-
向量模長(zhǎng)——Vector3.magnitude() 相等于向量之間的距離
-
單位向量——Vector3.normalized()適用于物體移動(dòng)的時(shí)候的單位化計(jì)算
-
向量+向量 和向量+位置 的區(qū)別——前者為向量(高數(shù)中的向量相加)后者為相當(dāng)于擴(kuò)大作用結(jié)果是位置
-
位置-位置的幾何意義——結(jié)果為向量 ,向量-向量 = 向量
-
向量的加減乘除 —— 加減應(yīng)用于物體平移 乘除的進(jìn)行縮放要用本地坐標(biāo)
-
向量的點(diǎn)乘——Vector3.Dot 結(jié)果為余弦值,用來(lái)判斷對(duì)象的大概方位(前后)和夾角
-
向量的叉乘——Vector3.Dot 結(jié)果為法向量垂直于兩個(gè)向量構(gòu)成的平面,判斷(左右)
-
向量的線性差值運(yùn)算——直線軌跡
vector3.Lerp( S,E,T); ——S為開(kāi)始值,E為最終值
①每幀改變S的值(先快后慢)—適合攝像機(jī)的跟隨
②每幀改變T的值(勻速變化)—適合攝像機(jī)的跟隨
線性插值
//1.先快后慢 每幀改變start位置 位置無(wú)限接近 但不會(huì)得到end位置
transform.position = Vector3.Lerp(
transform.position,target.position, Time.deltaTime);
//2.勻速 每幀改變時(shí)間 當(dāng)t>=1時(shí) 得到結(jié)果
//當(dāng)time>=1時(shí) 改變了目標(biāo)位置后會(huì)直接瞬移到目標(biāo)位置
if(nowTarget != target.position)
{
nowTarget = target.position;
time = 0;
startPos = B.position;
}
time += Time.deltaTime;
B.position = Vector3.Lerp(startPos, nowTarget, time);
-
向量的球形差值運(yùn)算——弧形軌跡
vector3.SLerp( S,E,T); ——S為開(kāi)始值,E為最終值
對(duì)兩個(gè)向量進(jìn)行插值計(jì)算 t的取值范圍為0~1
球形插值
C.position = Vector3.Slerp(Vector3.right * 10, Vector3.left * 10 +
Vector3.up*0.1f, time*0.01f);
【Unity每日一記】向量操作攝像機(jī)的移動(dòng)(向量加減)
【Unity每日一記】關(guān)于物體(敵方)檢測(cè)—(向量點(diǎn)乘相關(guān))
【Unity每日一記】方位辨別—向量的叉乘點(diǎn)乘結(jié)合
API 之—— 四元數(shù)
特點(diǎn)
1,繞著某個(gè)軸轉(zhuǎn)x度,軸可以是任意軸(軸-角對(duì))
2,避免了歐拉角中萬(wàn)向節(jié)死鎖的問(wèn)題
3,避免了歐拉角中角度變化不在(-180,180)范圍內(nèi)的問(wèn)題
- 四元數(shù)解決了歐拉角中萬(wàn)向節(jié)死鎖的問(wèn)題
- 當(dāng)Unity中transform的X軸為90度是發(fā)生萬(wàn)向節(jié)死鎖,此時(shí)不管移動(dòng)y軸還是z軸,物體都往X軸進(jìn)行旋轉(zhuǎn)
原理公式
假定四元數(shù)Q繞著n軸旋轉(zhuǎn)β度
//計(jì)算原理_繞x軸旋轉(zhuǎn)60度
Quaternion q = new Quaternion(Mathf.Sin(30 * Mathf.Deg2Rad),
0, 0, Mathf.Cos(30 * Mathf.Deg2Rad));
直接簡(jiǎn)單公式
- Quaternion.AngleAxis(角度數(shù)值,軸(向量))
//繞x軸旋轉(zhuǎn)60度
Quaternion q = Quaternion.AngleAxis(60, Vector3.right);
API常用
1.四元數(shù)和歐拉角轉(zhuǎn)換
-
歐拉角轉(zhuǎn)四元數(shù)
Quaternion A = Quaternion.Euler(60, 0, 0); -
四元數(shù)轉(zhuǎn)歐拉角
A.eulerAngles
2.旋轉(zhuǎn)
四元數(shù)相乘代表旋轉(zhuǎn)四元數(shù)
//四元數(shù)旋轉(zhuǎn)方法
transform.rotation *= Quaternion.AngleAxis(30,vector3.forword);
3.單位化四元數(shù)
- [1,(0,0,0)]和[-1,(0,0,0)]都是單位四元數(shù)
表示沒(méi)有旋轉(zhuǎn)量 - Quaternion.identity _用于對(duì)象角度初始化
Instantiate(XXXX, Vector3.zero, Quaternion.identity);
4.四元數(shù)的差值運(yùn)算
- 特點(diǎn): Lerp() 和Slerp();官方建議一般用Slerp();
- 先快后慢旋轉(zhuǎn)
transform.rotation = Quaternion.Slerp(transform.rotation,
target.rotation, Time.deltaTime);
- 勻速旋轉(zhuǎn)—— time>=1 到達(dá)目標(biāo)
time += Time.deltaTime;
B.transform.rotation = Quaternion.Slerp(start,
target.rotation, time);
5.四元數(shù)的旋轉(zhuǎn)看向——LookAt的本質(zhì)
Quaternion A = Quaternion.LookRotation(B.position - A.position);
//B - A = AB 向量 ,所以傳入的是向量
transform.rotation = A;
【Unity每日一記】進(jìn)行發(fā)射,位置相關(guān)的方法總結(jié)
【Unity每日一記】攝像機(jī)相關(guān)向量代碼API大全
API 之——隨機(jī)類(lèi)
???????1,隨機(jī)類(lèi)的靜態(tài)變量
-
隨機(jī)數(shù)int和float
Random.range()??/int是左閉右開(kāi),float是左閉右閉 -
①隨機(jī)出旋轉(zhuǎn)數(shù)
Random.rotantion -
②隨機(jī)出的歐拉角
Random.rotation.enluarAngles -
③隨機(jī)出的歐拉角轉(zhuǎn)四元數(shù)
Quteronion.luer.( Random.rotation.enluarAngles) -
④隨機(jī)出的浮點(diǎn)數(shù)
Random.Vauler 范圍是 【0,1) -
⑤按圖形隨機(jī)出數(shù)字 --應(yīng)用于槍口的圓形子彈發(fā)射(FPS)
Random. insideUnitCircle
在(-1,-1)~(1,1)范圍內(nèi)隨機(jī)生成的一個(gè)vector2")
???????2.隨機(jī)類(lèi)的靜態(tài)函數(shù)
-
①范圍內(nèi)的隨機(jī)數(shù)
Random.range(0 ,4 ) 左閉右開(kāi)->[ 0 , 4 )
Random.range( 0, 4f ) 左閉右閉 -> [ 0 ,4 ] -
②偽隨機(jī)數(shù)設(shè)置狀態(tài)
Random.InitState(1) 開(kāi)啟狀態(tài) -
③偽隨機(jī)數(shù)
Random.range( 0 , 4 ) 左閉右閉 -> [ 0 , 4 ]
API 之——gameObject類(lèi)
成員變量
-
名字: this.gameObject.name
-
是否激活:
this.gameObject.activeSelf -
是否是靜態(tài)
this.gameObject.isStatic -
層級(jí)
this.gameObject.layer -
標(biāo)簽
this.gameObject.tag
創(chuàng)建幾何體
GameObject.CreatePrimitive(PrimitiveType.Cube);——正方體
查找——消耗性能
- 通過(guò)名字:GameObject.Find(“名字”);
- 通過(guò)標(biāo)簽:GameObject.FindGameObjectWithTag(“標(biāo)簽名”);
實(shí)例化
GameObject.Instantiate(xx);
銷(xiāo)毀
-
GameObject.Destroy(xx)
Destroy方法 本質(zhì)上給這個(gè)對(duì)象加了一個(gè)移除標(biāo) 一般情況下 它會(huì)在下一幀時(shí)把這個(gè)對(duì)象移除并從內(nèi)存中移除 如果沒(méi)有特殊需求 就是一定要馬上移除一個(gè)對(duì)象的話 建議使用上面的 Destroy方法 因?yàn)?是異步的 降低卡頓的幾率
場(chǎng)景不移除對(duì)象
-
GameObject.DontDestroyOnLoad( xx );
切換場(chǎng)景后物體會(huì)被刪除,該API對(duì)象 過(guò)場(chǎng)景不被刪除
添加腳本
- xx.AddComponent<腳本名>();
標(biāo)簽比較
- this.gameObject.CompareTag(“xx”)
- this.gameObject.tag == “xx”
激活失活設(shè)置
- obj.SetActive(false);
API 之——MonoBehavior類(lèi)
- ??transform.enable()+transform.Active
- ??xx.GetComponent<>()泛型獲取
- ??XX.GetComponent() as XX
- ??XX.GetComponent(Typeof()) as XX Typey類(lèi)型獲取
- ??gameObject.name
- ?? new 腳本類(lèi)型 [ ] yy / yy = this.GetComponents();//得到多個(gè)腳本
- ?? getComponentInChrild/Parent //子對(duì)象或父對(duì)象組件的獲取
- ??更安全的獲取腳本TryGetComponent<>();
???????1,鼠標(biāo)回調(diào)事件函數(shù)
- 適用于界面操作
private void OnMouseDown()
{
print(“在掛載的物體身上按下了鼠標(biāo)”);
}
private void OnMouseUp()
{
print(“在掛載的物體身上按下的鼠標(biāo)抬起了”);
}
private void OnMouseDrag()
{
print(“在掛載的物體身上用鼠標(biāo)進(jìn)行了拖拽操作”);
}
private void OnMouseEnter()
{
print(“鼠標(biāo)移入了掛載的物體”);
}
private void OnMouseExit()
{
print(“鼠標(biāo)移出了掛載的物體”);
}
private void OnMouseOver()
{
print(“鼠標(biāo)懸停在了掛載的物體上方”);
}
private void OnMouseUpAsButton()
{
print(“鼠標(biāo)在掛載的物體身上松開(kāi)了”);
}
API 之—— Input系統(tǒng)接口類(lèi)
???????0,相關(guān)
- 輸入相關(guān)的內(nèi)容一定是喲啊寫(xiě)在Update里面
- 長(zhǎng)按和點(diǎn)按的區(qū)別在于有沒(méi)有Dwon和Up
- 按任意鍵繼續(xù) – Input.AllKey()
- 得到輸入的是哪個(gè)鍵(Stirng)-Inpout.inputString()
- 得到鼠標(biāo)的位置——Input.MousePosition()
+GetAxis 和 GetAxisRaw 的區(qū)別 ——后者返回的只有三個(gè)值 -1 0 1
???????1,連續(xù)檢測(cè)(按鍵,鼠標(biāo))
- print(“當(dāng)前玩家輸入的水平方向的軸值是:”+Input.GetAxis(“Horizontal”));
- print(“當(dāng)前玩家輸入的垂直方向的軸值是:” + Input.GetAxis(“Vertical”));
- print(“當(dāng)前玩家輸入的水平方向的邊界軸值是:” + Input.GetAxisRaw(“Horizontal”));
- print(“當(dāng)前玩家輸入的垂直方向的邊界軸值是:” + Input.GetAxisRaw(“Vertical”));
- print(“當(dāng)前玩家鼠標(biāo)水平移動(dòng)增量是:”+Input.GetAxis(“Mouse X”));
- print(“當(dāng)前玩家鼠標(biāo)垂直移動(dòng)增量是:” +Input.GetAxis(“Mouse Y”));
- 鼠標(biāo)的某一個(gè)鍵按下 ——Input.GetMouseButtonDown( 0/1/2)
- 得到鼠標(biāo)的位置——Input.GetMousePosition()——起點(diǎn)在屏幕左下角
- 鼠標(biāo)的滾動(dòng)——Input.MouseScrollDeltta()——改變Y軸的值
- 鼠標(biāo)滾動(dòng)的應(yīng)用-------炮管的升降
???????2.連續(xù)檢測(cè)(事件)
手柄相關(guān)
-
得到所有按鈕的名字 ——Input.GetJoystickNameS()
-
if (Input.GetButton(“Fire1”))
{
print(“當(dāng)前玩家正在使用武器1進(jìn)行攻擊!”);
} -
if (Input.GetButton(“Fire2”))
{
print(“當(dāng)前玩家正在使用武器2進(jìn)行攻擊!”);
} -
if (Input.GetButton(“RecoverSkill”))
{
print(“當(dāng)前玩家使用了恢復(fù)技能回血!”);
}
???????3.間隔檢測(cè)(事件)
-
if (Input.GetButtonDown(“Jump”))
{
print(“當(dāng)前玩家按下跳躍鍵”);
} -
if (Input.GetButtonUp(“Squat”))
{
print(“當(dāng)前玩家松開(kāi)蹲下建”);
} -
if (Input.GetKeyDown(KeyCode.Q))
{
print(“當(dāng)前玩家按下Q鍵”);
} -
if (Input.anyKeyDown)
{
print(“當(dāng)前玩家按下了任意一個(gè)按鍵,游戲開(kāi)始”);
} -
if (Input.GetMouseButton(0))
{
print(“當(dāng)前玩家按住鼠標(biāo)左鍵”);
} -
if (Input.GetMouseButtonDown(1))
{
print(“當(dāng)前玩家按下鼠標(biāo)右鍵”);
} -
if (Input.GetMouseButtonUp(2))
{
print(“當(dāng)前玩家抬起鼠標(biāo)中鍵(從按下?tīng)顟B(tài)松開(kāi)滾輪)”);
}
API —— SendMessage消息發(fā)送機(jī)制
玩玩demo可以,實(shí)際開(kāi)發(fā)是幾乎不能用的。
??僅發(fā)送消息給自己(以及身上的其他MonoBehaviour對(duì)象)
gameObject.SendMessage(“GetMsg”);
SendMessage(“GetSrcMsg”,“BOSS”);
SendMessage(“GetTestMsg”,SendMessageOptions.DontRequireReceiver);
??廣播消息(向下發(fā),所有子對(duì)象包括自己)
BroadcastMessage(“GetMsg”);
??向上發(fā)送消息(父對(duì)象包含自己)
SendMessageUpwards(“GetMsg”);
-
public void GetMsg()
{
print(“測(cè)試對(duì)象本身接收到消息了”);
} -
public void GetSrcMsg(string str)
{
print(“測(cè)試對(duì)象本身接收到的消息為:”+str);
}
API——?jiǎng)赢?huà)基礎(chǔ)
-
1,ipg -> UI and 2D
( 直接將圖集進(jìn)行拖拽給對(duì)象) 變成動(dòng)畫(huà) -
2,代碼更改速度
animator .speed -
3,代碼實(shí)現(xiàn)動(dòng)畫(huà)的播放
animator.dispaly -
4,代碼設(shè)置過(guò)度參數(shù)
animator.Setfloat(“Speed”, 1 ) - 5,代碼實(shí)現(xiàn)動(dòng)畫(huà)的過(guò)度
情況一:
通過(guò)按鍵進(jìn)行動(dòng)畫(huà)的播放
情況二:
和通過(guò)參數(shù)來(lái)進(jìn)行動(dòng)畫(huà)的切換(取消勾選 Has Exit Time)
以標(biāo)準(zhǔn)單位化時(shí)間進(jìn)行淡入淡出效果來(lái)播放動(dòng)畫(huà)
animator.CrossFade (“Walk” , 0.1f) __值越小過(guò)渡的越快
以秒為單位進(jìn)行淡入淡出效果來(lái)播放動(dòng)畫(huà)
animator.CrossFadeInFixedTime(“Run”, 0.5f);
API——時(shí)間Time類(lèi)
???????1.成員變量
幀間隔時(shí)間
- Time.deltaTime ",
transform.Translate(0, 0, Time.deltaTime * 10);
6t//物體沿著自身Z軸方向,每秒移動(dòng)物體10米運(yùn)動(dòng)
完成上一幀所用的時(shí)間(以秒為單位
-
Time.unscaledDeltaTime
不受scale影響的幀間隔時(shí)間
物理幀間隔時(shí)間
-
Time.fixedDeltaTime
執(zhí)行物理或者其他固定幀率更新的時(shí)間間隔",fixedDeltatime是一個(gè)固定的時(shí)間增量。Unity中默認(rèn)fixeddeltaTime為0.02秒,但FixedUpdate并不是真的就0.02秒調(diào)用一次
以下的總時(shí)間并不精確,適用于對(duì)時(shí)間精確不是特別嚴(yán)格的情況
-
Time.fixedTime + ",表示FixedUpdate(生命周期)已經(jīng)執(zhí)行的時(shí)間,可以作為自游戲啟動(dòng)以來(lái)的總時(shí)間(以物理或者其他固定幀率更新的時(shí)間間隔累計(jì)計(jì)算的),基本上是以0.02慢慢累加(有誤差)
-
Time.time + ",游戲開(kāi)始以來(lái)的總時(shí)間、
精確時(shí)間
-
Time.time + “,游戲開(kāi)始以來(lái)的總時(shí)間”
-
Time.realtimeSinceStartup + “,游戲開(kāi)始以來(lái)的實(shí)際時(shí)間”
-
Time.smoothDeltaTime + ",經(jīng)過(guò)平滑處理的Time.deltaTime的時(shí)間
-
Time.timeSinceLevelLoad + ",自加載上一個(gè)關(guān)卡以來(lái)的時(shí)間(進(jìn)入了新場(chǎng)景后的時(shí)間)
時(shí)間縮放比例
- 時(shí)間停止
Time.timeScale = 0; - 恢復(fù)正常
Time.timeScale = 1; - 2倍速
Time.timeScale = 2;
一共跑了多少幀(多少次循壞)
Time.frameCount
???????慢動(dòng)作功能 —時(shí)間成員變量
- ime.timeScale
時(shí)間流逝的標(biāo)度,可以用來(lái)慢放動(dòng)作、它的默認(rèn)值為1,為0.5時(shí)可將當(dāng)前游戲程序中所有時(shí)間放慢到原來(lái)的0.5倍,若為3 則為原來(lái)的三倍
Time.timeScale = 3;
API——協(xié)程
???????1.協(xié)程的定義和用途
協(xié)程顧名思義,協(xié)同程序
- 用法和用途
1.延時(shí)調(diào)用
如果有很多敵人,那么每幀都調(diào)用此函數(shù)可能會(huì)帶來(lái)很大開(kāi)銷(xiāo)。但是,可以使用協(xié)程,每十分之一秒調(diào)用一次
協(xié)程的定義:
IEnumerator ChangeState() //協(xié)程迭代器的定義
{
//暫停幾秒(協(xié)程掛起)
yield return new WaitForSeconds(2);
//暫停兩秒后再切入走路的動(dòng)畫(huà)
animator.Play("Walk");`
}
2.和其他邏輯一起協(xié)同執(zhí)行
,比如一些很耗時(shí)的工作,在這個(gè)協(xié)程中執(zhí)行異步操作,比如下載文件,加載文件,異步生成怪物等
*資源加載一般是一個(gè)比較耗時(shí)的操作,如果直接放在主線程中會(huì)導(dǎo)致游戲卡頓,通常會(huì)放到異步線程中去執(zhí)行。
???????2.協(xié)程的啟動(dòng)和停止
void start()
{
啟動(dòng)方法一:
StartCoroutine("ChangeState"); //括號(hào)內(nèi)的是協(xié)程名
啟動(dòng)方法二:
StartCoroutine(ChangeState());
啟動(dòng)方法三: //有參協(xié)程只能用該方法開(kāi)啟
IEnumerator ie = ChangeState();
StartCoroutine(ie);
協(xié)程停止方法
StopCoroutine("ChangeState");
StopCoroutine(ChangeState());
StopCoroutine(ie);
停止所有協(xié)程:
StopAllCoroutines();
}
IEnumerator ChangeState() //協(xié)程的定義
{
//暫停幾秒(協(xié)程掛起)
yield return new WaitForSeconds(2);
//暫停兩秒后再切入走路的動(dòng)畫(huà)
animator.Play("Walk");`
}
???????3.協(xié)程中的 yield
表示等待一幀
- yield return n 【n可以是任意數(shù)字或者 null】
表示等待n秒
- yield return new WaitForSeconds(n);
【n可以是任意數(shù)字】
表示在本幀幀末執(zhí)行以下邏輯
- yield return new WaitForEndOfFrame();
IEnumerator ChangeState()
{
//等待一幀 yield return n(n是任意數(shù)字)
yield return null;
yield return 100000;
print("轉(zhuǎn)換成Run狀態(tài)了");
//在本幀幀末執(zhí)行以下邏輯
yield return new WaitForEndOfFrame();
}
???????4.協(xié)程中的協(xié)程和有參協(xié)程
StartCoroutine("CreateBoss"); //啟動(dòng)協(xié)程
//協(xié)程1 功能實(shí)時(shí)實(shí)例化游戲物體
IEnumerator CreateBoss()
{
StartCoroutine(SetCreateCount(5));
while (true) //功能實(shí)時(shí)實(shí)例化游戲物體
{
if (BossNum>=BossCount)
{
yield break; //在協(xié)程中break前面要加 yield
}
Instantiate(animator.gameObject);
BossNum++;
yield return new WaitForSeconds(2);
}
}
//協(xié)程2 功能實(shí)時(shí)實(shí)例化游戲物體
IEnumerator SetCreateCount(int num)
{
BossCount =num;
yield return null; //暫停一幀
---------------------
此時(shí)如果這里只是暫停一幀的話,
那么上面調(diào)該有參協(xié)程的協(xié)程體中,
后面的語(yǔ)句并未生效,因?yàn)闀和R粠螅?后面的方法已經(jīng)執(zhí)行了,
所以此時(shí)的BossCount并不等于有參傳遞的5
(當(dāng)然BossCount是全局變量)
---------------------
}
協(xié)程的本質(zhì)
- 1.本體為迭代器
- 2.協(xié)程調(diào)度器(可自己實(shí)現(xiàn))
//Ieunmrator接口中的兩個(gè)成員:MoveNext_移動(dòng)下一個(gè) Current——當(dāng)前返回值
while(ie.MoveNext())
{
print(ie.Current);
}
---
# API——invoke延時(shí)調(diào)用
---
???????1.延時(shí)調(diào)用
---
● Invoke(“名字”,秒數(shù))
● InvokeRepeating(“名字”,第一次秒數(shù),之后每次調(diào)用間隔秒數(shù))
+ 使用協(xié)程的延時(shí)調(diào)用也可以
+ 使用計(jì)時(shí)器-MathF.MoveTowords也可以達(dá)到延時(shí)調(diào)用的效果
```csharp
void Start()
{
//調(diào)用
//Invoke("CreateGris",3);
InvokeRepeating("CreateGris",1,1);
}
private void CreateGris()
{
Instantiate(grisGo); //實(shí)例化
}
???????2.取消調(diào)用
● CancelInvoke(“方法名”);暫停當(dāng)前延時(shí)調(diào)用該方法
● CancelInvoke();停止所有的延時(shí)調(diào)用方法
???????3.判斷是否調(diào)用
● IsInvoke(“方法名”);判斷當(dāng)前方法是否進(jìn)行了延時(shí)調(diào)用
● IsInvoke();停止程序中所有的延時(shí)調(diào)用
???????4,讓方法只調(diào)用一次的方法
- 改變其判斷的條件法:首先讓其=ture 才進(jìn)行,然后調(diào)用一次之后就變成 false,或者前面是==某個(gè)數(shù)值,后面就改變它的值
API——物體的移動(dòng)
???????1.常用使物體移動(dòng)的方法
-
1,movetowords 和線性差值進(jìn)行兩點(diǎn)間的移動(dòng)
-
2,transform.position (利用監(jiān)聽(tīng)鍵盤(pán)進(jìn)行實(shí)時(shí)的位置變化移動(dòng))
-
3,通過(guò)剛體進(jìn)行單向移動(dòng)(xx.MovePosition)
-
4,通過(guò)剛體的力進(jìn)行牽引移動(dòng) xx.addForce( vector2.方向)
有兩個(gè)參數(shù)的情況
xx.addForce( vector2.方向,ForceMode2D.force 或者 Impuse)
impuse是爆發(fā)的瞬時(shí)的,應(yīng)用于爆炸情景
Force則是連續(xù)的,,相當(dāng)于沒(méi)有第二個(gè)參數(shù)
- 5,通過(guò)剛體速度進(jìn)行移動(dòng) 因?yàn)閯傮w速度是有大小和方向的
- 6,Transform.Translate(方向)/Transform.Translate(方向,世界軸/自身軸)
(物體朝某一個(gè)方向移動(dòng)的方法)
方法 | 描述 |
---|---|
Transform.Translate(Vector2.left) | 世界坐標(biāo)方向 |
Transform.Translate(transform.left) | 自身坐標(biāo)方向 |
Transform.Translate(Vector2.left,Space.World) | 世界坐標(biāo)方向 |
Transform.Translate(Vector2.left, Space.Self) | 自身坐標(biāo)方向 |
Transform.Translate(transform.left ,Space.Self/World) | 自身坐標(biāo)方向 |
???????2.細(xì)節(jié)
1.物理系統(tǒng)相關(guān)的API要放進(jìn)去FixedUpDate
2,受重力影響的程度 gravity Scale
3,阻力 0Linear Drag 線性阻力
API——物體的旋轉(zhuǎn)
???????常用使物體旋轉(zhuǎn)的方法
通過(guò)剛體讓物體的旋轉(zhuǎn)( 2D平面用好點(diǎn))
- xx.MoveRotation(角度)
- XX.MoveRotationReapting( xx.Rotation +角度 * Time,DeleTime )
此時(shí)的Rotion并不是四元數(shù) ,在這里就是當(dāng)前物體的度數(shù)
transform組件讓物體繞軸旋轉(zhuǎn)(3D立體用好點(diǎn))
- transform.rotate( new vector3( 0 , Y ,0) ); 按Y軸旋轉(zhuǎn)
- transform.rotate( vector2.forword ,Space.Self/World) ; 按z軸旋轉(zhuǎn)
相對(duì)于自己的坐標(biāo)系旋轉(zhuǎn)
-
this.transform.Rotate(new Vector3(0, 10, 0) * Time.deltaTime);
第一個(gè)參數(shù) 相當(dāng)于 是旋轉(zhuǎn)的角度 每一幀 第二個(gè)參數(shù) 默認(rèn)不填 就是相對(duì)于自己坐標(biāo)系 進(jìn)行的旋轉(zhuǎn)
-
this.transform.Rotate(new Vector3(0, 10, 0) * Time.deltaTime, Space.World);
相對(duì)于某個(gè)軸 轉(zhuǎn)多少度
-
this.transform.Rotate(Vector3.right, 10 * Time.deltaTime);
-
this.transform.Rotate(Vector3.right, 10 * Time.deltaTime, Space.World);
參數(shù)一:是相對(duì)哪個(gè)軸進(jìn)行轉(zhuǎn)動(dòng) 參數(shù)二:是轉(zhuǎn)動(dòng)的 角度 是多少 參數(shù)三:默認(rèn)不填 就是相對(duì)于自己的坐標(biāo)系 進(jìn)行旋轉(zhuǎn)
如果填 可以填寫(xiě)相對(duì)于 世界坐標(biāo)系進(jìn)行旋轉(zhuǎn)
相對(duì)于某一個(gè)點(diǎn)轉(zhuǎn)
-
this.transform.RotateAround(Vector3.zero, Vector3.right, 10 * Time.deltaTime);
參數(shù)一:相當(dāng)于哪一個(gè)點(diǎn) 轉(zhuǎn)圈圈 參數(shù)二:相對(duì)于那一個(gè)點(diǎn)的 哪一個(gè)軸轉(zhuǎn)圈圈 參數(shù)三:轉(zhuǎn)的度數(shù) 旋轉(zhuǎn)速度 * 時(shí)間
API——音頻Audio
???????常用操作
- 獲取音頻資源組件 : AudioSource = GetComponent< AudioSource>();
- 獲取音頻: Public AudioClip xx ; AudioSouce.Clip = xx Clip譯“片段”
- 音量設(shè)置:AudioSource.Volum =
- 開(kāi)始播放的時(shí)間設(shè)置:AudioSource.time =
- 靜音: AudioSource.mute = true;
- 播放: AudioSource.Paly( )
- 暫停:AudioSource.pause( )
- 恢復(fù)播放:AudioSource.UnPause( )
- 停止:AudioSource.Stop( )
- 播放一次音效: AudioSource.PlayOneShot(AudioClip)
- 音量近大遠(yuǎn)小方法設(shè)置:
AuodioSource.PlayClipAtPoint( AudioClip,transform.positon)
[ 音頻片段AudioClip 距離物體位置越近聲音越大] - 是否在播放音效: audioSource.isPlaying
???????AudioSourse組件介紹
"">
Play On Awake 第一次調(diào)用就開(kāi)啟
Loop 循環(huán)
Pitch 音調(diào)
音頻源官方手冊(cè)解釋
API——麥克風(fēng)
獲取設(shè)備麥克風(fēng)信息
string[] strs = Microphone.devices;
開(kāi)始錄制
clip = Microphone.Start(null, false, 10, 44100);
if( Input.GetKeyDown(KeyCode.Space) )
{
clip = Microphone.Start(null, false, 10, 44100);
}
參數(shù)一:設(shè)備名 傳空使用默認(rèn)設(shè)備
參數(shù)二:超過(guò)錄制長(zhǎng)度后 是否重頭錄制
參數(shù)三:錄制時(shí)長(zhǎng)
參數(shù)四:采樣率
結(jié)束錄制
Microphone.End(null);
if( Input.GetKeyUp(KeyCode.Space) )
{
Microphone.End(null);
//第一次獲取 沒(méi)有才添加
AudioSource s = this.GetComponent<AudioSource>();
if (s == null)
s = this.gameObject.AddComponent<AudioSource>();
s.clip = clip;
s.Play();
#region 知識(shí)點(diǎn)四 獲取音頻數(shù)據(jù)用于存儲(chǔ)或者傳輸
//規(guī)則 用于存儲(chǔ)數(shù)組數(shù)據(jù)的長(zhǎng)度 是用 聲道數(shù) * 剪輯長(zhǎng)度
float[] f = new float[clip.channels * clip.samples];
clip.GetData(f, 0);
print(f.Length);
#endregion
}
API——粒子系統(tǒng)
API——TrailRender拖尾渲染器
API——碰撞器和觸發(fā)器
基本參數(shù)
-
碰撞到的對(duì)象碰撞器的信息
collision.collider -
碰撞對(duì)象的依附對(duì)象(GameObject)
collision.gameObject -
碰撞對(duì)象的依附對(duì)象的位置信息
collision.transform -
觸碰點(diǎn)數(shù)
collision.contactCount -
接觸點(diǎn) 具體的坐標(biāo)
ContactPoint[] pos = collision.contacts;
???????碰撞器
- onCollisionEnter( coliision2D xx ) 當(dāng)物體進(jìn)入到本身的碰撞區(qū)時(shí)觸發(fā)
- onCollisionStay( collision2D xx ) 當(dāng)物體呆在本身的碰撞區(qū)域時(shí)觸發(fā)
- onColiisionExit( collision2D xx ) 當(dāng)物體離開(kāi) 本身的碰撞區(qū)域時(shí)觸發(fā)
???????觸發(fā)器
觸發(fā)器是碰撞器中的一部分 開(kāi)啟與否 直接按碰撞器組件上的觸發(fā)器開(kāi)關(guān)即可
- is Trigger
-
onTiggerEnter ( collision2D xx ) 當(dāng)物體進(jìn)入到本身的碰撞區(qū)時(shí)觸發(fā)
-
onTriggerStay( collision2D xx ) 當(dāng)物體呆在本身的碰撞區(qū)域時(shí)觸發(fā)
-
onTriggerExit( colidion2D xx ) 當(dāng)物體離開(kāi) 本身的碰撞區(qū)域時(shí)觸發(fā)
-
??種類(lèi)
box,膠囊,球形,車(chē)輪,網(wǎng)格,地形
-
??物理材質(zhì)
-
??碰撞函數(shù)
API——特殊文件夾
- 特殊文件夾讀寫(xiě)性
1.Resources 可讀 不可寫(xiě) 打包后找不到
2.Application.streamingAssetsPath 可讀 PC端可寫(xiě) 找得到
3.Application.dataPath 打包后找不到
4.Application.persistentDataPath 可讀可寫(xiě)找得到
1.工程路徑獲取
該方式 獲取到的路徑 一般情況下 只在 編輯模式下使用
游戲發(fā)布過(guò)后 該路徑就不存在了
- Application.dataPath
2.Resources資源文件夾
一般不獲取路徑只能使用Resources相關(guān)API進(jìn)行加載
-
注意:
手動(dòng)創(chuàng)建 -
作用:
資源文件夾
1.需要通過(guò)Resources相關(guān)API動(dòng)態(tài)加載的資源需要放在其中
2.該文件夾下所有文件都會(huì)被打包出去
3.打包時(shí)Unity會(huì)對(duì)其壓縮加密
4.該文件夾打包后只讀 只能通過(guò)Resources相關(guān)API加載
3.StreamingAssets 流動(dòng)資源文件夾
- Application.streamingAssetsPath
-
注意:
手動(dòng)創(chuàng)建 -
作用:
流文件夾
1.打包出去不會(huì)被壓縮加密,可以任由我們擺布
2.移動(dòng)平臺(tái)只讀,PC平臺(tái)可讀可寫(xiě)
3.可以放入一些需要自定義動(dòng)態(tài)加載的初始資源
4.不愿意放在Resources中的資源可以放入StreamingAssets中
4.persistentDataPath 持久數(shù)據(jù)文件夾
-
注意:
不需要手動(dòng)創(chuàng)建 -
Application.persistentDataPath
不同平臺(tái)路徑不一樣 -
作用:
固定數(shù)據(jù)文件夾
1.所有平臺(tái)都可讀可寫(xiě)
2.一般用于放置動(dòng)態(tài)下載或者動(dòng)態(tài)創(chuàng)建的文件,游戲中創(chuàng)建或者獲取的文件都放在其中(熱更新會(huì)用到)
5.Plugins 插件文件夾
-
注意:
不需要手動(dòng)創(chuàng)建 -
作用:
插件文件夾
不同平臺(tái)的插件相關(guān)文件放在其中
比如IOS和Android平臺(tái)
6. Editor 編輯器文件夾
-
注意:
手動(dòng)創(chuàng)建 -
作用:
編輯器文件夾
1.開(kāi)發(fā)Unity編輯器時(shí),編輯器相關(guān)腳本放在該文件夾中
2.文件夾中內(nèi)容不會(huì)被打包出去
7. 默認(rèn)資源文件夾 Standard Assets
-
注意:
手動(dòng)創(chuàng)建 -
作用:
默認(rèn)資源文件夾
一般Unity自帶資源都放在這個(gè)文件夾下
代碼和資源優(yōu)先被編譯 -
一般不用
API——資源加載(Resource)
——————— 同步加載———————
5種資源加載的方式,Resource加載介紹
- Resources(只能加載Resources目錄中的資源)
- AssetBundle(只能加載AB資源,當(dāng)前設(shè)備允許訪問(wèn)的路徑都可以)
- WWW(可以加載任意處資源,包括項(xiàng)目外資源(如遠(yuǎn)程服務(wù)器))
- AssetDatabase(只能加載Assets目錄下的資源,但只能用于Editor)
- UnityWebRequest(可以加載任意處資源,是WWW的升級(jí)版本)
資源加載適用于需要加載資源較多的 情況就不用一個(gè)一個(gè)的拖拽進(jìn)去
關(guān)鍵字:@ ,as
卸載AB包的方法: Resource. UnLoadAsset
void Start()
{
Object obj= Resources.Load("sound");
//AudioClip ac = obj as AudioClip;
AudioClip ac = (AudioClip)obj;
AudioSource.PlayClipAtPoint(ac, transform.position);
//Resources.LoadAll<AudioClip>("Prefabs");
AudioClip[] audioClips= Resources.LoadAll<AudioClip>("");
foreach (var item in audioClips)
{
Debug.Log(item);
}
//Resources.UnloadAsset
}
-
C#中的回收機(jī)制是系統(tǒng)自動(dòng)回收的,有多種回收機(jī)制,不像其他語(yǔ)言需要手動(dòng)回收
注意:
//預(yù)設(shè)體對(duì)象加載需要實(shí)例化
//其它資源加載一般直接用
#endregion
Resource資源加載操作
加載資源前首先需要在project面板中創(chuàng)建Resource名字的文件夾,為固定文件夾用于資源加載
以加載AudioClip類(lèi)型的資源為例:
- 根目錄加載 Resource.Load< AudioClip>(“voice”);
- 子目錄加載 Resource.Load ( @ " 子目錄名/ voice") ;
- 另一種形式:
Object xx = Resource.Load(“voice”);
AudioClip yy as xx ; // 顯性類(lèi)型轉(zhuǎn)換 ,前提是二者兼容 - 加載同類(lèi)型所有資源的方法:
①根目錄加載: AudioClip [] xx = Resource.AllLoad(" “) ;
②子目錄加載:AudioClip [] yy = Resource.AllLoad(” 子目錄名");
- 1.預(yù)設(shè)體對(duì)象
Object obj = Resources.Load("Cube");
Instantiate(obj);
- 2.音效資源
Object obj3 = Resources.Load("Music/BKMusic");
//我們不需要實(shí)例化 音效切片 我們只需要把數(shù)據(jù) 賦值到正確的腳本上即可
audioS.clip = obj3 as AudioClip;
audioS.Play();
- 3.文本資源
文本資源支持的格式——.txt .xml .bytes .json .html .csv …
TextAsset ta = Resources.Load("Txt/Test") as TextAsset;
//文本內(nèi)容
ta.text
//字節(jié)數(shù)據(jù)組
ta.bytes);
- 4.圖片
tex = Resources.Load("Tex/TestJPG") as Texture;
——————— 異步加載———————
如果我們加載過(guò)大的資源可能會(huì)造成程序卡頓
異步加載 就是內(nèi)部新開(kāi)一個(gè)線程進(jìn)行資源加載 不會(huì)造成主線程卡頓
- Resources.LoadAsync(“XXX”);
- 注意:
異步加載 不能馬上得到加載的資源 至少要等待一幀
直接異步加載——適用于加載單個(gè)資源
//通過(guò)事件監(jiān)聽(tīng)
ResourceRequest rq = Resources.LoadAsync<Texture>("Tex/TestJPG")
rq.completed += LoadOver;
//completed 是 ResourceRequest 中的委托
// AsyncOperation 是 ResourceRequest 的父類(lèi)
private void LoadOver( AsyncOperation rq)
{
//在事件中添加結(jié)束標(biāo)識(shí)邏輯,這樣我們就知道異步加載完成了
print("加載結(jié)束");
//加載完成后 會(huì)保存在 ResourceRequest類(lèi)中的 asset Object類(lèi)型成員里
//此時(shí)實(shí)現(xiàn)賦值
picture = (rq as ResourceRequest).asset as Texture;
}
配套協(xié)程異步加載——適用于加載多個(gè)資源
//通過(guò)協(xié)程的調(diào)度器自己判斷是否加載結(jié)束
StartCoroutine(Load());
IEnumerator Load()
{
ResourceRequest rq = Resources.LoadAsync<Texture>("Tex/TestJPG");
yield return rq;
// yield return rq會(huì)自己判斷 該資源是否加載完畢了,加載完畢過(guò)后才繼續(xù)執(zhí)行后面的代碼 ,因?yàn)镽esourceRequest 也是YieldInstruction的子類(lèi)
//-------------------------------
//isDone 和 progress API的應(yīng)用
while(!rq.isDone)
{
//打印當(dāng)前的 加載進(jìn)度
print(rq.progress);
yield return null;
}
//--------------------------------
picture = rq.asset as Texture;
}
———————資源加載器———————
利用異步直接加載和委托的使用構(gòu)成簡(jiǎn)單的資源加載器
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
//-------------------------------------
//—————————————————————————————————————
//___________項(xiàng)目: ______________
//___________功能: 簡(jiǎn)單的資源管理器
//___________創(chuàng)建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class ResourcesControl
{
static private ResourcesControl control;
static public ResourcesControl Control => control;
private ResourcesControl()
{
}
public void AddResources<T>(string name ,UnityAction<T> source ) where T : Object
{
ResourceRequest yb = Resources.LoadAsync<T>(name);
yb.completed += (reO) =>
{
source( (reO as ResourceRequest).asset as T );
};
}
}
//外部調(diào)用
private void Start()
{
GameObject shootball;
ResourcesControl.Control.AddResources<GameObject>("Profabs/ball",(sphere)=> {
shootball = sphere;
} );
}
———————卸載資源———————
-
Resources多次重復(fù)加載不會(huì)浪費(fèi)內(nèi)存
但是 會(huì)浪費(fèi)性能(每次加載都會(huì)去查找取出,始終伴隨一些性能消耗) -
1.卸載指定資源
Resources.UnloadAsset 方法
注意:它只能用于一些 不需要實(shí)例化的內(nèi)容 比如 圖片 和 音效 文本等 一般情況下很少單獨(dú)使用它
-
2.卸載未使用的資源
一般在過(guò)場(chǎng)景時(shí)和GC一起使用
Resources.UnloadUnusedAssets();
GC.Collect();
API——Camera相機(jī) 相關(guān)
可編輯參數(shù)了解
- ??Clear Flags
-
??CullingMask選擇層級(jí)進(jìn)行渲染
-
??Projection
-
??Target Texture 小地圖應(yīng)用
-
??Occlusion Culing 的勾選 優(yōu)化性能 減少渲染
-
??渲染分辨率的設(shè)置了解 --性能相關(guān)
-
??分屏操作 viewport Rect --應(yīng)用于雙人成行類(lèi)的游戲
API
-
??靜態(tài)成員
-
??委托
- ??成員變量
API——Screen屏幕 相關(guān)
- ???當(dāng)前屏幕分辨率寬高的獲取
——Resolution r = Sreen.currentResolution - ???當(dāng)前屏幕寬高的設(shè)置
——Sreen.width &Screen.heiht - ???當(dāng)前屏幕的休眠模式
——scree.SleepTimeOut .NewSleep - ???窗口轉(zhuǎn)換的四個(gè)模式
- ???移動(dòng)屏幕轉(zhuǎn)向
API——?jiǎng)赢?huà)控制器 相關(guān)
-
1,ipg -> UI and 2D
( 直接將圖集進(jìn)行拖拽給對(duì)象) 變成動(dòng)畫(huà) -
2,代碼更改速度
animator .speed -
3,代碼實(shí)現(xiàn)動(dòng)畫(huà)的播放
animator.dispaly -
4,代碼設(shè)置過(guò)度參數(shù)
animator.Setfloat(“Speed”, 1 ) - 5,代碼實(shí)現(xiàn)動(dòng)畫(huà)的過(guò)度
情況一:
通過(guò)按鍵進(jìn)行動(dòng)畫(huà)的播放
情況二:
和通過(guò)參數(shù)來(lái)進(jìn)行動(dòng)畫(huà)的切換(取消勾選 Has Exit Time)
以標(biāo)準(zhǔn)單位化時(shí)間進(jìn)行淡入淡出效果來(lái)播放動(dòng)畫(huà)
animator.CrossFade (“Walk” , 0.1f) __值越小過(guò)渡的越快
以秒為單位進(jìn)行淡入淡出效果來(lái)播放動(dòng)畫(huà)
animator.CrossFadeInFixedTime(“Run”, 0.5f);
API——屏幕相關(guān)
- 靜態(tài)屬性
常用
當(dāng)前屏幕分辨率
- Resolution r = Screen.currentResolution;
當(dāng)前屏幕分辨率的寬_ r.width
屏幕窗口當(dāng)前寬高
- Screen.width
- Screen.height
屏幕休眠模式
Screen.sleepTimeout = SleepTimeout.NeverSleep;
不常用
運(yùn)行時(shí)是否全屏模式
- Screen.fullScreen = true;
窗口模式 - 獨(dú)占全屏FullScreenMode.ExclusiveFullScreen
- 全屏窗口FullScreenMode.FullScreenWindow
- 最大化窗口FullScreenMode.MaximizedWindow
- 窗口模式FullScreenMode.Windowed
Screen.fullScreenMode = FullScreenMode.Windowed;
移動(dòng)設(shè)備屏幕轉(zhuǎn)向相關(guān)
-
允許自動(dòng)旋轉(zhuǎn)為左橫向 Home鍵在左
Screen.autorotateToLandscapeLeft = true;
-
允許自動(dòng)旋轉(zhuǎn)為右橫向 Home鍵在右
Screen.autorotateToLandscapeRight = true;
-
允許自動(dòng)旋轉(zhuǎn)到縱向 Home鍵在下
Screen.autorotateToPortrait = true;
-
允許自動(dòng)旋轉(zhuǎn)到縱向倒著看 Home鍵在上
Screen.autorotateToPortraitUpsideDown = true;
指定屏幕顯示方向
Screen.orientation = ScreenOrientation.Landscape;
靜態(tài)方法
設(shè)置分辨率 移動(dòng)設(shè)備不常用
Screen.SetResolution(1920, 1080, false);
API——場(chǎng)景(Scene)加載
???????加載場(chǎng)景的方法
- SceneManager.LoadScene() ; 場(chǎng)景同步加載
- SceneManager.LoadSceneSAsyn(); 場(chǎng)景異步加載
- SceneManage。GetActiveScene().name判斷當(dāng)前場(chǎng)景
- Application.LoadLevel():同步加載
- Application.LoadLevelAsync():異步加載
- Application.LoadLevelAddictive():同步附加式加載
- Application.LoadLevelAddictiveAsync():異步附加式加載
???????SceneManasger的操作
首先添加場(chǎng)景加載的命名空間Using UnityEngine.SceneManagement ;
而后把游戲場(chǎng)景都保存(拖拽)在 Buid setting 里面,相當(dāng)于存儲(chǔ)場(chǎng)景的目錄
??1.同步加載
SceneManager.Load( 序列號(hào)) ;
SceneManager.Load( “場(chǎng)景名”) ;
void Start()
{
//SceneManager.LoadScene(1);
//SceneManager.LoadScene("TriggerTest");
}
缺點(diǎn):加載時(shí)造成畫(huà)面卡幀,因?yàn)?,在未加載完成前畫(huà)面是停止的,所以是卡幀現(xiàn)象
??2.異步加載
如果當(dāng)前場(chǎng)景 對(duì)象過(guò)多或者下一個(gè)場(chǎng)景對(duì)象過(guò)多
這個(gè)過(guò)程會(huì)非常的耗時(shí) 會(huì)讓玩家感受到卡頓
所以異步切換就是來(lái)解決該問(wèn)題的
通常我們和協(xié)程一起使用:
-
SceneManager.LoadAsync(序列號(hào))
-
SceneManager.LoadAsync(“場(chǎng)景名”)
-
StartCoroutine(協(xié)程迭代器方法() ); //調(diào)用協(xié)程
-
AsyncOperation 該類(lèi)型翻譯為異步操作 ,為下面獲得異步場(chǎng)景的返回值
AsyncOperation ao= SceneManager.LoadSceneAsync(2); -
ao.allowSceneActivation = true 激活場(chǎng)景
-
ao.progress 場(chǎng)景加載的進(jìn)度
//-----1.通過(guò)事件回調(diào)函數(shù) 異步加載------
AsyncOperation SS = SceneManager.LoadSceneAsync("XXXX");
SS.completed += (a) =>
{
print("加載結(jié)束");
};
SS.completed += LoadOver;
private void LoadOver(AsyncOperation ao)
{
print("LoadOver");
}
//---------2.通過(guò)協(xié)程異步加載--------
void Start()
{
//由于場(chǎng)景加載后就不會(huì)執(zhí)行加載后的邏輯了,如果要保存就使用 DontDestroyOnLoad(保留場(chǎng)景加載上個(gè)場(chǎng)景的東西)第一個(gè)異步方法不會(huì)出現(xiàn)該情況
DontDestroyOnLoad(this.gameObject);
StartCoroutine(LoadScene("XXXX"));
}
IEnumerator LoadScene(string name)
{
AsyncOperation SS= SceneManager.LoadSceneAsync(name);
//根據(jù)游戲規(guī)則 自定義進(jìn)度條變化的條件
yield return SS;
//1.場(chǎng)景加載結(jié)束 更新20%
//2.動(dòng)態(tài)加載怪物再更新20%
//3.動(dòng)態(tài)加載場(chǎng)景模型進(jìn)度條頂滿
//4.加載結(jié)束隱藏進(jìn)度條
}
總結(jié)
場(chǎng)景異步加載 和 資源異步加載 一樣
1.通過(guò)事件回調(diào)函數(shù)
2.協(xié)程異步加載
-
1.事件回調(diào)函數(shù)
優(yōu)點(diǎn):寫(xiě)法簡(jiǎn)單,邏輯清晰
缺點(diǎn):只能加載完場(chǎng)景做一些事情 不能在加載過(guò)程中處理邏輯 -
2.協(xié)程異步加載
優(yōu)點(diǎn):可以在加載過(guò)程中處理邏輯,比如進(jìn)度條更新等
缺點(diǎn):寫(xiě)法較為麻煩,要通過(guò)協(xié)程
場(chǎng)景管理器
public class SceneControl
{
private static SceneControl instance = new SceneControl();
public static SceneControl Instance => instance;
private SceneControl() { }
public void LoadScene(string name, UnityAction action)
{
AsyncOperation SS = SceneControl.LoadSceneAsync(name);
SS.completed += (Scene) =>
{
action();
};
}
}
---
# API——光源組件
---
---
??組件API --window -light
---
??**三光——點(diǎn)光源,聚光燈,面光源(烘培模式開(kāi)啟)**--烘培-節(jié)約性能

??**光源模式**——實(shí)時(shí),烘培,混合

??**顏色**——光源顏色

??**陰影**——生硬,柔和——效率區(qū)別
-
??**投影遮罩**——只適用聚光燈,需添加Textuer

??**光暈開(kāi)關(guān) + 耀斑(聚光)**—— 前者是球形光(太陽(yáng)蠟燭) 后者是人眼看到強(qiáng)光的效果 (耀斑有其對(duì)應(yīng)的材質(zhì))

---
??光設(shè)置面板界面 --window -light
---
**針對(duì)設(shè)置光源參數(shù)的默認(rèn)值**
??**天空盒材質(zhì)的更換**
??**太陽(yáng)光源的設(shè)置**
??**Fog霧開(kāi)關(guān)**——霧面效果,性能消耗
??**耀斑的調(diào)節(jié)**
??**遮罩材質(zhì)的更改**

---
# API——?jiǎng)傮w相關(guān)
---
> **添加力的方法**
+ 1.獲取
rigidBody = this.GetComponent<Rigidbody>();
+ 2.添加力
rigidBody.AddForce(Vector3.forward * 10);
相對(duì)世界坐標(biāo)世界坐標(biāo)系 Z軸正方向加了一個(gè)里加力過(guò)后 對(duì)象是否停止移動(dòng) 是由阻力決定的如果阻力為0 那給了一個(gè)力過(guò)后 始終 是不會(huì)停止運(yùn)動(dòng)
+ 3. 讓對(duì)象 相對(duì)于自己的面朝向動(dòng)
相對(duì)世界坐標(biāo)
rigidBody.AddForce(this.transform.forward * 10);
相對(duì)本地坐標(biāo)
rigidBody.AddRelativeForce(Vector3.forward * 10);
>**添加扭矩力,讓其旋轉(zhuǎn)**
+ 相對(duì)世界坐標(biāo)
rigidBody.AddTorque(Vector3.up * 10);
+ 相對(duì)本地坐標(biāo)
rigidBody.AddRelativeTorque(Vector3.up * 10);
>**改變速度**
速度方向 是相對(duì)于 世界坐標(biāo)系的
rigidBody.velocity = Vector3.forward * 5;
如果要直接通過(guò)改變速度 來(lái)讓其移動(dòng) 一定要注意這一點(diǎn)
>.**模擬爆炸效果**
rigidBody.AddExplosionForce(100, Vector3.zero, 10);
模擬爆炸的力 一定是 所有希望產(chǎn)生爆炸效果影響的對(duì)象 都需要得到他們的剛體 來(lái)執(zhí)行這個(gè)方法 才能都有效果
>**力的幾種模式**
力的模式 主要的作用 就是 計(jì)算方式不同而已
由于計(jì)算方式的不同 最終的移動(dòng)速度就會(huì)不同
+ rigidBody.AddForce(Vector3.forward * 10,ForceMode.Acceleration);
|字符 | 意義 |
|--|--|
| F |力 |
| t |時(shí)間|
| m |質(zhì)量 |
| v |速度 |
| 動(dòng)量定理 |Ft = mv v = Ft/m; |
+ **1.Acceleration**
給物體增加一個(gè)持續(xù)的加速度,忽略其質(zhì)量
|字符 | 值 |
|--|--|
| F |(0,0,10) |
| t |0.02s|
| m |默認(rèn)為1|
| v |10*0.02/ 1 = 0.2m/s|
| 每物理幀移動(dòng) |0.2m/s*0.02 = 0.004m |
+ **2.Force**
給物體添加一個(gè)持續(xù)的力,與物體的質(zhì)量有關(guān)
|字符 | 值 |
|--|--|
| F |(0,0,10) |
| t |0.02s|
| m |2kg|
| v |10*0.02/ 2 = 0.1m/s|
| 每物理幀移動(dòng) |0.1m/s*0.02 = 0.002m |
+ **3.Impulse**
給物體添加一個(gè)瞬間的力,與物體的質(zhì)量有關(guān),忽略時(shí)間 默認(rèn)為1
|字符 | 值 |
|--|--|
| F |(0,0,10) |
| t |0.01s|
| m |2kg|
| v |10*1/ 2 = 5m/s
| 每物理幀移動(dòng) |5m/s*0.02 = 0.1m |
+ **4.VelocityChange**
|字符 | 值 |
|--|--|
| F |(0,0,10) |
| t |1s|
| m |1kg|
| v |v = 10*1/ 1 = 10m/s
| 每物理幀移動(dòng) |10m/s*0.02 = 0.2m |
> **剛體是否休眠**
+ rigidBody.IsSleeping())
+ rigidBody.WakeUp();——喚醒剛體
---
# API——Camera組件
---
>**可編輯參數(shù)了解**
+ ??**Clear Flags**

+ ??**CullingMask選擇層級(jí)進(jìn)行渲染**
+ ??**Projection**

+ ??**Target Texture 小地圖應(yīng)用**
+ ??**Occlusion Culing 的勾選 優(yōu)化性能 減少渲染**
+ ??**渲染分辨率的設(shè)置了解** --性能相關(guān)
+ ??**分屏操作 viewport Rect** --應(yīng)用于雙人成行類(lèi)的游戲
>API


> **渲染相關(guān)委托**
```cpp
//攝像機(jī)剔除前處理的委托函數(shù)
Camera.onPreCull += (c) =>
{
};
//攝像機(jī) 渲染前處理的委托
Camera.onPreRender += (c) =>
{
};
//攝像機(jī) 渲染后 處理的委托
Camera.onPostRender += (c) =>
{
};
常用坐標(biāo)轉(zhuǎn)化
-
設(shè)置主攝像機(jī)對(duì)象 上的深度
Camera.main.depth = 10; -
世界坐標(biāo)轉(zhuǎn)屏幕坐標(biāo)
z對(duì)應(yīng)的 是3D物體離攝像機(jī)的距離
Vector3 v = Camera.main.WorldToScreenPoint(this.transform.position);
- 3.屏幕坐標(biāo)轉(zhuǎn)世界坐標(biāo)
Vector3 pos = Input.mousePosition;
pos.z = 5;
obj.position = Camera.main.ScreenToWorldPoint(pos);
//改變Z軸 是因?yàn)?如果不改 Z默認(rèn)為0轉(zhuǎn)換過(guò)去的世界坐標(biāo)系的點(diǎn) 永遠(yuǎn)都是一個(gè)點(diǎn) 可以理解為 視口 相交的焦點(diǎn)如果改變了Z 那么轉(zhuǎn)換過(guò)去的 世界坐標(biāo)的點(diǎn) 就是相對(duì)于 攝像機(jī)前方多少的單位的橫截面上的世界坐標(biāo)點(diǎn)
應(yīng)用
API——Screen組件
- ???當(dāng)前屏幕分辨率寬高的獲取
——Resolution r = Sreen.currentResolution - ???當(dāng)前屏幕寬高的設(shè)置
——Sreen.width &Screen.heiht - ???當(dāng)前屏幕的休眠模式
——scree.SleepTimeOut .NewSleep - ???窗口轉(zhuǎn)換的四個(gè)模式
- ???移動(dòng)屏幕轉(zhuǎn)向
API——Application類(lèi)
- 在UnityEngine命名空間下
- 作用:對(duì)程序運(yùn)行的數(shù)據(jù)進(jìn)行操作控制
- ?? Application.LoadLevel() ——老式場(chǎng)景資源加載的方法
- ?? Application.Quit()——退出游戲(前提是游戲已經(jīng)打包后運(yùn)行)
- ?? Application.Ispaly——是否是運(yùn)行模式or編輯模式
API——cursor類(lèi)
- 在UnityEngine命名空間下
- 鼠標(biāo)的隱藏 ——Cursor.Visible();
-
鼠標(biāo)的鎖定,限制范圍 CursorState = CursorLockMode.下面三個(gè)
-
設(shè)置鼠標(biāo)圖片——Cursor.setCursor(三個(gè)參數(shù)如下)
API——線渲染器 LineRenderer
1.LineRenderer是什么
線渲染器 (Line Renderer)官方文檔
LineRenderer是Unity提供的一個(gè)用于畫(huà)線的組件來(lái)在場(chǎng)景中繪制線段
一般可以用于
- 繪制攻擊范圍
- 武器紅外線
- 輔助功能其它畫(huà)線功能
2.LineRenderer相關(guān)API
-
代碼動(dòng)態(tài)添加一個(gè)線段
GameObject line = new GameObject(); line.name = "Line"; LineRenderer lineRenderer = line.AddComponent<LineRenderer>();
-
首尾相連
lineRenderer.loop = true; -
開(kāi)始結(jié)束寬
lineRenderer.startWidth = 0.02f;
lineRenderer.endWidth = 0.02f; -
開(kāi)始結(jié)束顏色
-
lineRenderer.startColor = Color.white; lineRenderer.endColor = Color.red;
-
設(shè)置材質(zhì)
m = Resources.Load<Material>("XXX");
lineRenderer.material = m;
-
設(shè)置點(diǎn)
先設(shè)置點(diǎn)的個(gè)數(shù)
—— lineRenderer.positionCount = 4;
設(shè)置 對(duì)應(yīng)每個(gè)點(diǎn)的位置
lineRenderer.SetPositions(new Vector3[] { new Vector3(0,0,0),
new Vector3(0,0,5),
new Vector3(5,0,5)});
lineRenderer.SetPosition(3, new Vector3(5, 0, 0));
-
是否使用世界坐標(biāo)系
//決定了 是否隨對(duì)象移動(dòng)而移動(dòng) lineRenderer.useWorldSpace = false;
-
讓線段受光影響 會(huì)接受光數(shù)據(jù) 進(jìn)行著色器計(jì)算
lineRenderer.generateLightingData = true;
API——范圍檢測(cè)Physics.Overlap
特點(diǎn):
- 1.執(zhí)行該句代碼時(shí) 進(jìn)行一次范圍檢測(cè) 它是瞬時(shí)的
- 2.范圍檢測(cè)相關(guān)API 并不會(huì)真正產(chǎn)生一個(gè)碰撞器 只是碰撞判斷計(jì)算而已
共同參數(shù):
- 參數(shù)一:物體中心點(diǎn)
- 參數(shù)二:物體的邊長(zhǎng)大小
- 參數(shù)三:物體的角度
- 參數(shù)四:檢測(cè)指定層級(jí)(不填檢測(cè)所有層)
- 參數(shù)五:是否忽略觸發(fā)器 UseGlobal-使用全局設(shè)置 Collide-檢測(cè)觸發(fā)器 Ignore-忽略觸發(fā)器 (不填使用UseGlobal)
- 返回值:在該范圍內(nèi)的觸發(fā)器(得到了對(duì)象觸發(fā)器就可以得到對(duì)象的所有信息)
UseGlobal-使用全局設(shè)置在該界面中已默認(rèn)
1.方塊狀范圍檢測(cè)
- Physics.OverlapBox ——返回值為數(shù)組,存儲(chǔ)檢測(cè)到的碰撞器
Collider[] colliders = Physics.OverlapBox( Vector3.zero, Vector3.one,
Quaternion.AngleAxis(45, Vector3.up),
1 << LayerMask.NameToLayer("UI") |
1 << LayerMask.NameToLayer("Default"), QueryTriggerInteraction.UseGlobal);
- Physics.OverlapBoxNonAlloc——返回值為Int 表示檢測(cè)的數(shù)量(最多6個(gè)參數(shù))
if(Physics.OverlapBoxNonAlloc(Vector3.zero, Vector3.one, 自定義數(shù)組名) != 0)
2.球形狀范圍檢測(cè)
無(wú)角度參數(shù)
參數(shù)二為球半徑
- Physics.OverlapSphere
colliders = Physics.OverlapSphere(Vector3.zero, 5, 1 << LayerMask.NameToLayer("Default"));
- Physics.OverlapSphereNonAlloc——同BOX
if( Physics.OverlapSphereNonAlloc(Vector3.zero, 5, colliders) != 0 )
.3.膠囊體范圍檢測(cè)
參數(shù)一:半圓一中心點(diǎn)
參數(shù)二:半圓二中心點(diǎn)
參數(shù)三:半圓半徑
- Physics.OverlapCapsule
colliders = Physics.OverlapCapsule(Vector3.zero, Vector3.up, 1, 1 << LayerMask.NameToLayer("UI"), QueryTriggerInteraction.UseGlobal);
- Physics.OverlapCapsuleNonAlloc
if ( Physics.OverlapCapsuleNonAlloc(Vector3.zero, Vector3.up, 1, colliders ) != 0 )
API——射線檢測(cè)Physics.Raycast
-
特點(diǎn)
只需要判斷一條線和物體的碰撞情況
可以在指定點(diǎn)發(fā)射一個(gè)指定方向的射線
判斷該射線與哪些碰撞器相交,得到對(duì)應(yīng)對(duì)象
瞬時(shí) -
應(yīng)用場(chǎng)景
1.鼠標(biāo)選擇場(chǎng)景上一物體
2.FPS射擊游戲(無(wú)彈道-不產(chǎn)生實(shí)際的子彈對(duì)象進(jìn)行移動(dòng))等
API
- Ray X = new Ray(Vector3.right, Vector3.forward);
參數(shù)一 | 參數(shù)二 |
---|---|
起點(diǎn) | 方向 |
X.origin | X.direction |
-
Ray XX = Camera.main.ScreenPointToRay(Input.mousePosition);
屏幕視口坐標(biāo)轉(zhuǎn)成射線——鼠標(biāo)點(diǎn)擊的地方變成射線 -
Physics.Raycast 無(wú)法檢測(cè)碰到了誰(shuí),只會(huì)檢測(cè)碰到了沒(méi)有
最多有16個(gè)重載
Physics.Raycast常用參數(shù) | 作用 |
---|---|
參數(shù)一 | 射線 |
參數(shù)二 | 檢測(cè)的最大距離 超出這個(gè)距離不檢測(cè) |
參數(shù)三 | 檢測(cè)指定層級(jí)(不填檢測(cè)所有層) |
參數(shù)四 | 是否忽略觸發(fā)器 UseGlobal-使用全局設(shè)置 Collide-檢測(cè)觸發(fā)器 Ignore-忽略觸發(fā)器 不填使用UseGlobal |
返回值 | bool 當(dāng)碰撞到對(duì)象時(shí) 返回 true 沒(méi)有 返回false |
//第一種寫(xiě)法
Physics.Raycast(XX, 1000,
1 << LayerMask.NameToLayer("層級(jí)名字"),
QueryTriggerInteraction.UseGlobal )
//第二種寫(xiě)法
Physics.Raycast(Vector3.right, Vector3.forward,
1 << LayerMask.NameToLayer("層級(jí)名字"),
QueryTriggerInteraction.UseGlobal )
-
RaycastHit 物體信息類(lèi)——得到相交的單個(gè)物體物理信息
RaycastHit 在Physics.Raycast的應(yīng)用 | 作用 |
---|---|
參數(shù)一 | 射線 |
參數(shù)二 | out RaycastHit 為什么是out ?RaycastHit是結(jié)構(gòu)體 是值類(lèi)型 out加上去就變成了引用類(lèi)型,而RaycastHit沒(méi)有復(fù)制所以不用ref |
參數(shù)三 | 檢測(cè)的最大距離 超出這個(gè)距離不檢測(cè) |
參數(shù)四 | 檢測(cè)指定層級(jí)(不填檢測(cè)所有層) |
參數(shù)五 | 是否忽略觸發(fā)器 UseGlobal-使用全局設(shè)置 Collide-檢測(cè)觸發(fā)器 Ignore-忽略觸發(fā)器 不填使用UseGlobal |
返回值 | bool 當(dāng)碰撞到對(duì)象時(shí) 返回 true 沒(méi)有 返回false |
//寫(xiě)法一
RaycastHit YY;
if( Physics.Raycast(XX, out YY, 1000,
1<<LayerMask.NameToLayer("層級(jí)名字"),
QueryTriggerInteraction.UseGlobal) )
//寫(xiě)法二
if( Physics.Raycast(Vector3.right, Vector3.forward, out YY, 1000,
1<<LayerMask.NameToLayer("層級(jí)名字"),
QueryTriggerInteraction.UseGlobal) )
- 碰撞到物體的名字 YY.collider.gameObject.name;
- 碰撞到的點(diǎn) YY.point
- 法線信息 YY.normal
- 碰撞到對(duì)象的位置 YY.transform.position
- 碰撞到對(duì)象 離自己的距離 YY.distance等等
- RaycastHit[] XX= Physics.RaycastAll——得到相交的多個(gè)物體物理信息
特點(diǎn): 先碰到的在數(shù)組的后面
- Physics.RaycastNonAlloc——返回的碰撞的數(shù)量 通過(guò)out得到數(shù)據(jù)
if((r3, XX, 1000, 1 << LayerMask.NameToLayer("Monster"),
QueryTriggerInteraction.UseGlobal) > 0 )
{
}
【Unity每日一記】模仿FPS射擊,用彈痕作畫(huà)的原理如此簡(jiǎn)單
【Unity每日一記】拖拽放置類(lèi)游戲的行為原來(lái)和這個(gè)API有關(guān)
bug情況以及處置
???????1.中文顯示亂碼現(xiàn)象的解決措施
- unity-Hub–版本顯示資源—Date------resouces------ScriptTempelet--------81(文件名)->可自定義初始化界面
???????2.版本中存在老包升級(jí)情況
- windows – packge Manager\
???????3.printf 和 Debug.Log的區(qū)別
(1)printf : 必須要繼承,Monobehivar類(lèi)
(2)Debug.Log:
1.Debug.LogWarning :顯示警告、
2.Debug.LogError:顯示錯(cuò)誤
?相關(guān)文章?
———————————————————
-本站最全-unity常用API大全(萬(wàn)字詳解),不信你不收藏
-關(guān)于游戲劇情模式中用到的基礎(chǔ)簡(jiǎn)單API
-控制游戲人物移動(dòng)的細(xì)節(jié)到底有多少?
-坦克炮管旋轉(zhuǎn)發(fā)射炮彈(向量基礎(chǔ),射線碰撞,物體實(shí)例化)
-基于unity物體定點(diǎn)移動(dòng)與模擬剎車(chē)的細(xì)節(jié) GIF 圖文詳解
————————————————————
??????????????????????????
你們的點(diǎn)贊?? 收藏? 留言?? 關(guān)注?是我持續(xù)創(chuàng)作,輸出優(yōu)質(zhì)內(nèi)容的最大動(dòng)力!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-659449.html
到了這里,關(guān)于【Unity自制手冊(cè)】unity常用API大全——一篇文章足以(萬(wàn)字詳解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!