目錄
【23】射擊改進
【24】僵尸生成器
?編輯【25】隨機行走
【27】射擊光效
【23】射擊改進
a. 當距離目標太遠的時候,要繼續移動。而當距離目標到達攻擊距離之后,則停止移動。
上圖中的if:判斷自身和目標的距離是否大于攻擊距離,如果是,則將目標位置設置為targetLocalTransform.Position。
else語句,是說明小于等于攻擊距離,此時如何停止呢?直接更改目的位置為自身的位置。此時就可以停止移動了。
b. 旋轉控制
要確保在攻擊的時候,單位的朝向是朝著僵尸的。
根據當前單位的位置和目標攻擊的位置計算出朝向,然后將朝向單位化。
計算出旋轉的四元數,使用的函數是,quaternion.LookRotation函數。
最后用math.slerp差值出一個四元數作為最終的旋轉四元數。
【24】僵尸生成器
a. 要學會從面向對象的編程轉向面向數據的編程。
定義一個僵尸生成器的monobehavior:ZombieSpawnerAuthoring。需要將ZombieSpawnerAuthoring拖拽到場景的物體上,這里是ZombieSpawner。
b. 創建的實體,得先序列化到EntitiesReferencesAuthoring上,將其gameobject轉為zombiePrefabEntity。
然后通過SystemAPI.GetSingleton()拿到這個單例,訪問其中的zombiePrefabEntity。調用state.EntityManager.Instantiate方法,創建entity。創建出來之后設置其位置。
【25】隨機行走
a. 隨機種子,必須使用不同的種子才能得到不同的隨機數,最簡單的方法是使用實體的索引作為種子。
b. 在遍歷的時候,不能動態添加和刪除實體組件。比如你想動態的給實體添加組件隨機生成組件,不能通過下面的方式。而正確的做法是使用命令緩沖。
c. 使用命令緩沖動態的給實體添加組件,一定要明確系統是針對所有具有相同特征的所有實體,而不是單獨一個實體。當然也可以是一個單獨的實體,這個要為某個實體添加專屬的標簽。
【26】血條制作教程
【Unity】【DOTS】使用 DOTS 制作完整RTS游戲【26】血條制作教程_嗶哩嗶哩_bilibili
a. 血條的制作
父物體的bar的位置是:
子物體的bar的位置是:(0,0,0)
這里比較巧妙的是直接縮放父物體bar的縮放即可。父物體是往中間縮放,但是因為位置是(-0.5,0,0),導致子物體bar的縮放從右往左縮放。
b. 血條朝向攝像機
如下圖所示,我們拿到父物體bar的依賴實體,這里就是BaseUnit,也就是這句代碼;
LocalTransform parentLocalTransform = SystemAPI.GetComponent(healthBar.ValueRO.healthEntity);
讓其做世界到本地變換:parentLocalTransform.InverseTransformRotation(quaternion.LookRotation(cameraForward, math.up());
然后將其賦值給localTransform.ValueRW.Rotation,這說明這個localTransform.ValueRW.Rotation是local的。所以上面的quaternion.LookRotation(cameraForward, math.up())其實得到是world的旋轉,故要將其轉為父親下的旋轉,也即是local的。
c. 血量改變時才出發計算,這個如何做呢?
得到健康組件Health,監聽health.onHealthChanged變量,如果其沒有變化則直接continue.
d. 健康組件的onHealthChanged的變量何時重置、何時設置。
重置在重置系統里面做,如下面的第二個紅色方框。第一個紅色方框指定這個重置系統在LateSimulateSystemGroup組中進行更新,并且是本組的最后更新。
同時保證血條系統也在LateSimulateSystemGroup組中更新。
e. 在滿血的時候,將血條隱藏掉。在掉血的情況下,將血條顯示出來。
f. 問題代碼,在開啟burst編譯的情況下,不能訪問托管的代碼。比如這里下面的代碼。臨時解決的方法是,關閉burst編譯。
后面有更優的解決方法。
【27】射擊光效
【Unity】【DOTS】使用 DOTS 制作完整RTS游戲【27】射擊光效_嗶哩嗶哩_bilibili
a. 在射擊的時候創建燈光。ShootLightSpawnerSystem負責顯示工作,監聽ShootAttack中的onShoot.isTriggered是否為true。如果是true則實例化燈光。
這里調用state.EntityManager.Instantiate方法實例化一個實體。
b. ShootAttack組件中的onShoot是一個結構體。里面封裝了是否發生了射擊,并同時記錄其射擊時的燈光產生位置。
c. 燈光是一個預制體,在EntitiesReferencesAuthoring腳本中直接拖拽燈光預制體到上面即可,在baker系統中負責將gameobject轉為entity。
d. 燈光的生命周期控制,燈光的生命周期需要一個timer控制。當timer小于0的時候,添加到刪除命令緩沖中去,系統自動完成刪除。