LV. 11
GP 228

【心得】【攻略】一起做遊戲吧 Part 2!前端、後端技術分享~By【阿比頓:無盡之島】

樓主 SWALA tykook2002
GP51 BP-
大家好,我們是【阿比頓:無盡之島】的製作團隊,我們每月都會在這裡分享團隊的製作秘辛,內容有深有淺,希望可以幫助到正在努力獨自開發遊戲的你:)

主條目
一、[後端]Photon Server 移動封包詳解
二、[前端]武器發光Shader



※分享內容以Unity 3D表現為主



--------
一、[後端]Photon Server 移動封包詳解


異動處為下列
1.場景Mmodemo中,MainCamera新增Camera Follow 腳本 → CameraFollow.cs,使鏡頭跟著玩家角色。
2.Resources→PlayerPrefab→Capsule,新增兩個眼睛(Sphere),下一次教學用來識別角色面向使用。


第一章  移動封包流程
1.前端RunBehaviour.cs第451行起  
Input.GetKey就是玩家點擊按鈕,這裡是數字鍵盤8或W或↑
去呼叫MoveRelative方法,
Game.MoveUp則可在Photon.MmoDemo.Client.Unity3D專案內Game.cs找到
可以看到這邊就是設定好的8個方向

2.MoveRelative最後算完移動量又進到MoveAbsolute,可以觀察到新的目的地被設定到this.lastMovePosition
  
3.接著追蹤this.lastMovePosition被拿來做什麼
當有值時,呼叫Game.Avatar.MoveAbsolute 並清空this.lastMovePosition,
這樣就知道到Unity客戶端的移動發送封包過程為此

4.呼叫Game當然再回到,Photon.MmoDemo.Client.Unity3D專案找到MoveAbsolute方法
this.SetPositions → 在發送移動封包前,直接幫自己先實際改變位置
最後Operations.Move
var data ,用一個Dictionary把移動物件ID、目標移動點及旋轉角度包裝起來
game.SendOperation 就是實際發送封包處了,OperationCode.Move也是重點之一,
讓後端判斷這個封包是什麼類型的封包。

5.後端封包接收處說明開始,首先搜尋OperationCode.Move,或直接右鍵尋找所有參考
發現在MmoActorOperationHandler.cs 有一個case OperationCode.Move:,
呼叫OperationMove方法
但在這個方法中,只是一些檢查封包正確性的內容,所以再追到ItemOperationMove

6.在這裡就可以看見一些關鍵字,item.Position、item.Rotation及item.Move,
這樣就明白後端實作移動是如何處理的了。

7.移動處理完成後,就用item.EventChannel.Publish,以代號EventCode.ItemMoved,
來廣播通知其他周遭玩家,你移動到哪裡及旋轉角度。
在Mmodemo中,直接使用ItemEventChannel即可廣播到其他看得到你的玩家,
那些沒有與你相遇的玩家並不會收到封包。
  
8.再來回到Photon.MmoDemo.Client.Unity3D專案,GameEvents.cs
觀察case EventCode.ItemMoved:
這裡就是更新別人的當前位置和旋轉角,和更新自己的位置一樣使用item.SetPositions
進到這裡面看到,僅是對角度和座標進行更新

9.那麼哪裡是客戶端實際移動其他玩家的角色表現呢?
請到客戶端專案中尋找item.Position即為答案
搜尋一下找到ItemBehaviour.cs
70行關鍵點

Vector3 newPos = new Vector3(this.item.Position.X, transform.position.y, this.item.Position.Y)*RunBehaviour.WorldToUnityFactor;

由於item.Position是 Vector型別(Mmodemo裡使用的) new Vector(X軸, Y軸, 高度)
Unity使用的是Vector3型別,new Vector3(X軸, 高度, Z軸)
才會產生這種轉換法,
最後再用transform.position = Vector3.Lerp(transform.position, newPos, lerpT);
平滑地依幀更新玩家座標,
到這裡所有的移動封包流程完成。

總結複習一下流程:
客戶端按下鍵盤移動按鈕
→計算出移動後的座標
→先更新自己的座標
→限制頻率的發送移動封包要求
→伺服器接收到玩家移動封包
→確認封包合法性
→實質改變伺服器端該玩家的座標位置
→發送廣播封包給周遭
→其他玩家客戶端接收到廣播(Event)封包
→將記憶體內該玩家的座標改變
→將該玩家的角色實質表現平滑移動(Lerp)
→全部完成移動同步

延伸思考題:
1.如果要實作角色面向,應該在何處實作?
2.若要設計出英雄聯盟裡卡莎碧雅的大絕石化凝視,應如何驗證面向?如何防止作弊?
3.哪些類型的MMO可以不在意玩家面向正確性,哪些必須準確?
4.如果開始建構地形了,該怎麼讓玩家準確地只在路上行走,而不會穿牆穿海等
5.哪些遊戲可以只計算座標位置兩軸,哪些遊戲又需要計較高度?(如魔獸世界、英雄聯盟的差異)
6.如何最簡單有效的把客戶端地形丟給後端計算過濾地形?(如SamplePosition、Raycast)
7.讓NPC自己動起來後,怎麼計算他們所需要的移動路徑?(如A* PathFinding)

製作MMO類型的難度確實不算低,光是一個移動和旋轉就會衍生這麼多的問題,
在大多的單機和連線遊戲裡,不但流程較簡易且不需考慮作弊問題,
要讓物件正確的移動或計算最短路徑,只需要用Navigation掃出地形形狀,
再引用Navmesh相關方法即可完成這些基礎。

今天先到這裡,下週將教你如何實作角色旋轉面向並同步。

--------------------------------
二、[前端]武器發光Shader
我是用Amplify Shader做的,
原理滿簡單的,
加個Frensnel、讓紋理動起來就差不多了,
顏色記得改HDR,這樣才有發光的效果,
直接看配置圖
基本上分三大塊:發光、漸層、動態紋理
我有附加3個Switch開關,
GLow是發光、Gradual是明暗漸層、UV是紋理移動,
可以隨需求調整開啟或關閉。
這應該算初階的Shader製作,
希望能幫助到需要的你。

---------
不知不覺又過了一個月了呢~
接下來每個月都會固定分享一些資訊,
有時會是經驗分享,
有興趣的朋友記得關注【阿比頓:無盡之島】喔~
有什麼問題想問或是分享,歡迎直接到我們的Discord^^

  
51
-
未登入的勇者,要加入 2 樓的討論嗎?
板務人員: