国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Unity自制手冊(cè)】unity常用API大全——一篇文章足以(萬(wàn)字詳解)

這篇具有很好參考價(jià)值的文章主要介紹了【Unity自制手冊(cè)】unity常用API大全——一篇文章足以(萬(wàn)字詳解)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI


?????個(gè)人主頁(yè):@元宇宙-秩沅

hallo 歡迎 點(diǎn)贊?? 收藏? 留言?? 加關(guān)注?!

本文由 秩沅 原創(chuàng)

收錄于專(zhuān)欄 unity 實(shí)戰(zhàn)系列
unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI


?相關(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í)例化)

-基于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!”);
unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI


反射機(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)
    
    1. 讓對(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可編輯變量+輔助特性


可視化去編輯腳本的變量、
unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

??輔助特性:

  • 字典 自定義類(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)換

unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI


API之——生命函數(shù)


unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

  • ?????十大常見(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)


unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI


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ù)查找與獲取
  • unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI
        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
}
unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

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í)間

unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI


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)β度
unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

 //計(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)


unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

  • ??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ā)是幾乎不能用的。

unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI
??僅發(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é)程



unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

???????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í)行。
unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI


???????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ù)

unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

  • 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組件介紹


unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI"">unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

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)


unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI


API——TrailRender拖尾渲染器


unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI


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)格,地形
unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

  • ??物理材質(zhì)
    unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

  • ??碰撞函數(shù)

unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI


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)


unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

——————— 同步加載———————


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

unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

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

  • ??Projection
    unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

  • ??Target Texture 小地圖應(yīng)用

  • ??Occlusion Culing 的勾選 優(yōu)化性能 減少渲染

  • ??渲染分辨率的設(shè)置了解 --性能相關(guān)

  • ??分屏操作 viewport Rect --應(yīng)用于雙人成行類(lèi)的游戲

API

  • ??靜態(tài)成員
    unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

  • ??委托

unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPIunity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

  • ??成員變量
    unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI
    unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI


API——Screen屏幕 相關(guān)


unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

  • ???當(dāng)前屏幕分辨率寬高的獲取
    ——Resolution r = Sreen.currentResolution
  • ???當(dāng)前屏幕寬高的設(shè)置
    ——Sreen.width &Screen.heiht
  • ???當(dāng)前屏幕的休眠模式
    ——scree.SleepTimeOut .NewSleep
  • ???窗口轉(zhuǎn)換的四個(gè)模式
    unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI
  • ???移動(dòng)屏幕轉(zhuǎn)向
    unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

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)景的目錄

unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI


??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é)約性能
![在這里插入圖片描述](https://img-blog.csdnimg.cn/2c324fa90734437a8e08c31c906c45c6.png)
??**光源模式**——實(shí)時(shí),烘培,混合
![在這里插入圖片描述](https://img-blog.csdnimg.cn/f9291e067e6548719eb752eb68bc38d8.png)
??**顏色**——光源顏色
![在這里插入圖片描述](https://img-blog.csdnimg.cn/c104ae51251d4559960159d8c93b60e1.png)

??**陰影**——生硬,柔和——效率區(qū)別
-![在這里插入圖片描述](https://img-blog.csdnimg.cn/6a14d759b674492cad3d57410797edb9.png)

??**投影遮罩**——只適用聚光燈,需添加Textuer
![在這里插入圖片描述](https://img-blog.csdnimg.cn/1895321bae724dbf89bbaf4faa5b9d1d.png)
??**光暈開(kāi)關(guān) + 耀斑(聚光)**—— 前者是球形光(太陽(yáng)蠟燭) 后者是人眼看到強(qiáng)光的效果 (耀斑有其對(duì)應(yīng)的材質(zhì))
![在這里插入圖片描述](https://img-blog.csdnimg.cn/ebd432f28c3a401f9b2fdb38bdba0786.png)

---
 ??光設(shè)置面板界面 --window -light

---
**針對(duì)設(shè)置光源參數(shù)的默認(rèn)值**

??**天空盒材質(zhì)的更換**
??**太陽(yáng)光源的設(shè)置**
??**Fog霧開(kāi)關(guān)**——霧面效果,性能消耗
??**耀斑的調(diào)節(jié)**
??**遮罩材質(zhì)的更改**

![在這里插入圖片描述](https://img-blog.csdnimg.cn/bdc3b280d6374766a9f92e4a4ce65983.png)

---
# 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** 

![在這里插入圖片描述](https://img-blog.csdnimg.cn/448e3e0fd0b9479d8d25694db396db6b.png)
+ ??**CullingMask選擇層級(jí)進(jìn)行渲染** 
+  ??**Projection** 
![在這里插入圖片描述](https://img-blog.csdnimg.cn/a2751952d5974169bc66869d068cd8ab.png)

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

>API

![在這里插入圖片描述](https://img-blog.csdnimg.cn/e3c601ca24d545b3a2c5092cdb267e49.png)


![在這里插入圖片描述](https://img-blog.csdnimg.cn/39f986ab8d0e420b96919ec4325b2579.png)
> **渲染相關(guān)委托**

```cpp
 //攝像機(jī)剔除前處理的委托函數(shù)
        Camera.onPreCull += (c) =>
        {

        };
        //攝像機(jī) 渲染前處理的委托
        Camera.onPreRender += (c) =>
        {

        };
        //攝像機(jī) 渲染后 處理的委托
        Camera.onPostRender += (c) =>
        {

        };

常用坐標(biāo)轉(zhuǎn)化

unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI
unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

  • 設(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)用

unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI


API——Screen組件


unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

  • ???當(dāng)前屏幕分辨率寬高的獲取
    ——Resolution r = Sreen.currentResolution
  • ???當(dāng)前屏幕寬高的設(shè)置
    ——Sreen.width &Screen.heiht
  • ???當(dāng)前屏幕的休眠模式
    ——scree.SleepTimeOut .NewSleep
  • ???窗口轉(zhuǎn)換的四個(gè)模式
    unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI
  • ???移動(dòng)屏幕轉(zhuǎn)向
    unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

API——Application類(lèi)


  • 在UnityEngine命名空間下
  • 作用:對(duì)程序運(yùn)行的數(shù)據(jù)進(jìn)行操作控制
    unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI
  • ?? 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è)
    unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI
  • 設(shè)置鼠標(biāo)圖片——Cursor.setCursor(三個(gè)參數(shù)如下)
    unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPIunity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

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


unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

特點(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)

unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

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è)物體物理信息
    unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI
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è)物體物理信息

unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI
特點(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(文件名)->可自定義初始化界面
  • unity api,# unity常用API,# unity實(shí)戰(zhàn)基礎(chǔ),unity,游戲引擎,游戲程序,異步編程,unityAPI

???????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)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Unity】一篇文章搞定AStar(A*)算法

    【Unity】一篇文章搞定AStar(A*)算法

    AStar(A*)算法,是一種在靜態(tài)網(wǎng)格中求解最短路徑直接有效的搜索方法。在游戲開(kāi)發(fā)中,A*算法常應(yīng)用于部分RPG游戲和策略戰(zhàn)棋類(lèi)游戲。對(duì)于Unity開(kāi)發(fā)者來(lái)說(shuō),掌握A*算法也是十分有必要的。不過(guò)在了解A*算法之前,有必要先回顧一下深度優(yōu)先算法(DFS)、廣度優(yōu)先算法(BFS)

    2024年02月02日
    瀏覽(20)
  • Unity/C#------委托與事件(一篇文章徹底搞懂...)

    Unity/C#------委托與事件(一篇文章徹底搞懂...)

    ? ? ? ? 所有的代碼語(yǔ)言創(chuàng)造者母語(yǔ)都是英語(yǔ),我們從英語(yǔ)翻譯到中文的過(guò)程中難免會(huì)存在一些不太能還原本意的詞,比如我之前一直不理解構(gòu)造函數(shù)和析構(gòu)函數(shù),只知道這倆貨作用相反,直到我看到了它的英文意思,Construstor/Distructor,我才徹底理解了他們的作用。 ? ? ?

    2024年02月06日
    瀏覽(22)
  • 【Unity每日一記】攝像機(jī)相關(guān)代碼API大全

    【Unity每日一記】攝像機(jī)相關(guān)代碼API大全

    ?????個(gè)人主頁(yè) :@元宇宙-秩沅 ????? hallo 歡迎 點(diǎn)贊?? 收藏? 留言?? 加關(guān)注?! ????? 本文由 秩沅 原創(chuàng) ????? 收錄于專(zhuān)欄 :Unity基礎(chǔ)實(shí)戰(zhàn) 直接作為子對(duì)象課實(shí)現(xiàn)簡(jiǎn)單跟隨 通過(guò)向量的加減更新相機(jī)位置來(lái)保持簡(jiǎn)單的跟隨 差值位置的實(shí)時(shí)更新 ??????步驟:

    2024年02月12日
    瀏覽(17)
  • Http響應(yīng)狀態(tài)碼大全(看完這篇文章估計(jì)你會(huì)對(duì)HTTP狀態(tài)碼有更深入的了解)

    在 HTTP 協(xié)議中,狀態(tài)碼一般有3位數(shù)字。 這些狀態(tài)碼有一個(gè)識(shí)別它們的關(guān)聯(lián)名稱(chēng),但是重要的還是數(shù)字。 簡(jiǎn)而言之: 100 ?及以上狀態(tài)碼用于「消息」響應(yīng)。你很少直接使用它們。具有這些狀態(tài)代碼的響應(yīng)不能帶有響應(yīng)體。 200 及以上狀態(tài)碼用于「成功」響應(yīng)。這些是你最常使

    2024年01月17日
    瀏覽(49)
  • 一篇文章搞定Java中常用集合的排序方法

    一篇文章搞定Java中常用集合的排序方法

    目錄 Array · 數(shù)組 List · 列表 Collections.sort() 簡(jiǎn)單類(lèi)型 復(fù)雜對(duì)象 類(lèi) 使用Lambda表達(dá)式 Stream API Map · 鍵值對(duì) 對(duì) Map 的 Key 進(jìn)行排序 對(duì) Map 的 Value 進(jìn)行排序 最近在做算法題的時(shí)候,發(fā)現(xiàn)排序在大部分題中都不可或缺,今天心血來(lái)潮,總結(jié)下Java中集合排序常用的方法,基本覆蓋了大

    2024年02月09日
    瀏覽(26)
  • Python常用框架有哪些?(一篇文章給你講透)

    Python常用框架有哪些?(一篇文章給你講透)

    Python是一種簡(jiǎn)單的編程語(yǔ)言,易于學(xué)習(xí),在開(kāi)發(fā)的過(guò)程中提供了很多中不同的框架供我們學(xué)習(xí),今天的這篇文章就帶大家了解有哪些框架是好用的,值得我們學(xué)習(xí)的,有需要的小伙伴可以一起來(lái)看看這篇文章哦。 1、Django框架 在Python中,是可以進(jìn)行web的開(kāi)發(fā)操作的,在開(kāi)發(fā)的

    2024年02月07日
    瀏覽(23)
  • 游戲開(kāi)發(fā)中常用的算法1(20道題一篇文章)

    步驟1:選取一串?dāng)?shù)字中的中心軸 步驟2:將大于中心軸的數(shù)字放在右邊 步驟3:將小于中心軸的數(shù)字放在左邊 步驟4:分別對(duì)左右兩個(gè)序列重復(fù)前三步操作 步驟一、從數(shù)組的最左側(cè)兩個(gè)元素進(jìn)行比較 步驟二、將較大的數(shù)向右移動(dòng),再進(jìn)行比較 步驟三、直到將最大的數(shù)字放在最

    2024年02月06日
    瀏覽(16)
  • 一篇文章搞懂?dāng)?shù)據(jù)倉(cāng)庫(kù):常用ETL工具、方法(1)

    一篇文章搞懂?dāng)?shù)據(jù)倉(cāng)庫(kù):常用ETL工具、方法(1)

    ETL ,是英文Extract-Transform-Load的縮寫(xiě),用來(lái)描述將數(shù)據(jù)從來(lái)源端經(jīng)過(guò)抽取(extract)、轉(zhuǎn)換(transform)、加載(load)至目的端的過(guò)程,是數(shù)據(jù)倉(cāng)庫(kù)的生命線。 **抽?。?Extract )**主要是針對(duì)各個(gè)業(yè)務(wù)系統(tǒng)及不同服務(wù)器的分散數(shù)據(jù),充分理解數(shù)據(jù)定義后,規(guī)劃需要的數(shù)據(jù)源及數(shù)據(jù)

    2024年04月17日
    瀏覽(41)
  • Unity—常用API(重點(diǎn))

    Unity—常用API(重點(diǎn))

    利用將近兩天的時(shí)間學(xué)習(xí)并整理了常用API的知識(shí)點(diǎn)! 每日一句:能打動(dòng)人的從來(lái)不是花言巧語(yǔ),而是恰到好處的溫柔以及真摯的內(nèi)心 目錄 腳本生命周期流程圖(續(xù)上) 常用API 核心類(lèi)圖 *Component類(lèi) ?編輯 *Transform類(lèi) 練習(xí):在層級(jí)未知情況下查找子物體(遞歸) *GameObject類(lèi) ?

    2024年02月05日
    瀏覽(9)
  • 一篇文章帶你了解Java發(fā)送郵件:使用JavaMail API發(fā)送電子郵件的注意事項(xiàng)、發(fā)送附件等

    一篇文章帶你了解Java發(fā)送郵件:使用JavaMail API發(fā)送電子郵件的注意事項(xiàng)、發(fā)送附件等

    作者:Stevedash 發(fā)表于:2023年8月13日 15點(diǎn)48分 來(lái)源:Java 發(fā)送郵件 | 菜鳥(niǎo)教程 (runoob.com) 電子郵件在現(xiàn)代通信中扮演著至關(guān)重要的角色,而在Java編程中,我們可以利用JavaMail API來(lái)方便地實(shí)現(xiàn)發(fā)送電子郵件的功能。本篇博客將向您介紹如何使用JavaMail API來(lái)發(fā)送電子郵件,以及一些

    2024年02月13日
    瀏覽(55)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包