lvjincheng %!s(int64=4) %!d(string=hai) anos
pai
achega
78cca2a2f0

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1485 - 203
Assets/ArtAsset/Hunter/Models/Yeji/Yeji.controller


+ 115 - 3
Assets/BowArrow/Scenes/GameChallengeScene/Yeji.cs

@@ -25,11 +25,13 @@ public class Yeji : TargetAnimal
 
     void Awake()
     {
+        yejiSet.Add(this);
         state = new State();
         state.animal = this;
         animator = GetComponent<Animator>();
         agent = GetComponent<NavMeshAgent>();
         this.agent.avoidancePriority = avoidancePriority;
+        this.onlineHandler.InitOnAwake(this);
     }
     static int _avoidancePriority = 0;
     static int avoidancePriority {
@@ -44,12 +46,15 @@ public class Yeji : TargetAnimal
     }
 
     void OnDestroy() {
+        yejiSet.Remove(this);
         tryReleaseOccupyTree();
         ReleasePreHeight(this);
     }
 
     void Update()
     {
+        this.onlineHandler.Update();
+        if (this.onlineHandler.isMirror) return;
         //寻路过程监测
         if (HasCloseToDestination()) {
             OnReachDestination();
@@ -64,6 +69,14 @@ public class Yeji : TargetAnimal
         {
             arrow.Head().position = hitPoint + arrow.transform.forward * 0.1f;
             arrow.Hit();
+            if (onlineHandler.isMirror) {
+                onlineHandler.onHitData = onlineHandler.uid.ToString() + "," + partName;
+                return;
+            }
+            OnHitLogic(arrow, partName);
+        }
+
+        public void OnHitLogic(Arrow arrow, string partName) {
             int hurtValue = 0;
             if (partName == "Wing") {
                 hurtValue = 1;
@@ -81,15 +94,21 @@ public class Yeji : TargetAnimal
 
         void Die(Arrow arrow) {
             if (state.dead) return;
-            arrow.onDoNextShoot += delegate() {
-                Destroy(this.gameObject);
-            };
+            if (arrow != null) {
+                arrow.onDoNextShoot += delegate() {
+                    Destroy(this.gameObject);
+                };
+            } else {
+                //需要借住关卡的GameMode来清除
+                onlineHandler.onDoNextShootWillDestroy = true;
+            }
             this.animator.speed = 1;
             state.dead = true;
             this.agent.enabled = false;
             ReleasePreHeight(this);
             onDie?.Invoke(this);
             AudioMgr.ins.PlayAnimalEffect("bird_injured", AudioMgr.GetAudioSource(this.gameObject));
+            this.onlineHandler.injuredID++;
             if (currentHeight < 1.5f) {
                 arrow.arrowCameraComp.arrowCameraTemplate.SendMsg(0, null);
             }
@@ -99,6 +118,7 @@ public class Yeji : TargetAnimal
             CancelStand();
             CancelFlyStay();
             AudioMgr.ins.PlayAnimalEffect("bird_injured", AudioMgr.GetAudioSource(this.gameObject));
+            this.onlineHandler.injuredID++;
         }
     #endregion
 
@@ -257,6 +277,12 @@ public class Yeji : TargetAnimal
                 canFlyStayTime = 9f + Random.value * 1f;
                 return;
             }
+            
+            AnimatorStateInfo animatorStateInfo = animator.GetCurrentAnimatorStateInfo(0);
+            if (animatorStateInfo.IsName("Yeji Fly Form Tree") || animatorStateInfo.IsName("Yeji Idle On Tree 01") || animatorStateInfo.IsName("Yeji Land On Tree")) {
+                //该动作期间还不能适合执行移动,所以先返回
+                return;
+            }
 
             //飞向别的树
             #region 
@@ -393,4 +419,90 @@ public class Yeji : TargetAnimal
 
     //委托
     public System.Action<Yeji> onDie;
+
+    #region 联机附加部分
+        public static HashSet<Yeji> yejiSet = new HashSet<Yeji>();
+        public OnlineHandler onlineHandler = new OnlineHandler();
+        public class OnlineHandler {
+            Yeji animal;
+            public int uid;
+            public bool isMirror;
+            public int mirrorState = 0;
+            public float animatroSpeed = 1;
+            public YejiSyncData outputSyncData;
+            public void InitOnAwake(Yeji animal) {
+                this.animal = animal;
+                if (isMirror) {
+                    GameObject.Destroy(this.animal.agent);
+                    this.animal.animator.SetLayerWeight(1, 1);
+                }
+            }
+            public void Update() {
+                if (isMirror) {
+                    if (inputSyncData == null) return;
+                    if (!hasUpdateBySyncData) {
+                        this.animal.transform.position = syncPosition;
+                        this.animal.transform.rotation = syncRotation;
+                        hasUpdateBySyncData = true;
+                    } else {
+                        this.animal.transform.position = Vector3.Lerp(this.animal.transform.position, syncPosition, Time.deltaTime * 15);
+                        this.animal.transform.rotation = Quaternion.Lerp(this.animal.transform.rotation, syncRotation, Time.deltaTime * 15);     
+                    }
+                    this.animal.animator.SetInteger("mirrorState", mirrorState);
+                    this.animal.animator.speed = animatroSpeed;
+                    if (inputSyncData.ii != injuredID) {
+                        injuredID = inputSyncData.ii;
+                        AudioMgr.ins.PlayAnimalEffect("bird_injured", AudioMgr.GetAudioSource(this.animal.gameObject));
+                    }
+                    return;
+                }
+                if (GlobalData.pkMatchType == PKMatchType.OnlinePK) {
+                    if (outputSyncData == null) outputSyncData = new YejiSyncData();
+                    int curStateHash = this.animal.animator.GetCurrentAnimatorStateInfo(0).fullPathHash;
+                    mirrorState = System.Array.IndexOf(stateHashList, curStateHash);
+                    animatroSpeed = this.animal.animator.speed;
+                    outputSyncData.SetData(this.animal);
+                }
+            }
+            private YejiSyncData _inputSyncData;
+            public YejiSyncData inputSyncData {
+                get {
+                    return _inputSyncData;
+                }
+                set {
+                    _inputSyncData = value;
+                    uid = value.id;
+                    syncRotation.x = value.rx;
+                    syncRotation.y = value.ry;
+                    syncRotation.z = value.rz;
+                    syncRotation.w = value.rw;
+                    syncPosition.x = value.px;
+                    syncPosition.y = value.py;
+                    syncPosition.z = value.pz;
+                    mirrorState = value.ms;
+                    animatroSpeed = value.asp;
+                }
+            }
+            private Quaternion syncRotation;
+            private Vector3 syncPosition;
+            private bool hasUpdateBySyncData = false;
+            public bool isInvalid = false;  //外部运算用的
+            public string onHitData = null;
+            public bool onDoNextShootWillDestroy = false;
+            public int injuredID = 0;
+            private int[] stateHashList = {
+                Animator.StringToHash("Base Layer.Fly"),
+                Animator.StringToHash("Base Layer.FlyUp"),
+                Animator.StringToHash("Base Layer.FlyFromGround"),
+                Animator.StringToHash("Base Layer.FlyDown"),
+                Animator.StringToHash("Base Layer.LandOnGround"),
+                Animator.StringToHash("Base Layer.IdleOnGround2"),
+                Animator.StringToHash("Base Layer.Yeji Idle On Tree 01"),
+                Animator.StringToHash("Base Layer.Yeji Land On Tree"),
+                Animator.StringToHash("Base Layer.Yeji Fly Form Tree"),
+                Animator.StringToHash("Base Layer.DeadOnSky"),
+                Animator.StringToHash("Base Layer.DeadOnGround")
+            };
+        }
+    #endregion
 }

+ 3 - 0
Assets/BowArrow/Scenes/GameChallengeScene/YejiHuntGameMode.cs

@@ -50,7 +50,9 @@ public class YejiHuntGameMode : ChallengeGameMode
         CreateAnimal();
     }
 
+    public bool banCreateAnimal = false;
     void CreateAnimal() {
+        if (banCreateAnimal) return;
         if (createAnimalIndex >= createCountMax) return;
 
         #region 
@@ -71,6 +73,7 @@ public class YejiHuntGameMode : ChallengeGameMode
         animalObject.SetActive(true);
 
         Yeji yeji = animalObject.GetComponent<Yeji>();
+        yeji.onlineHandler.uid = createAnimalIndex + 1;
         yeji.treeAreaRecorder = treeAreaRecorder;
         yeji.flyPlaneHeight = flyPlaneHeight;
         float baseFlyHeight = Yeji.RandomOnePreHeight(yeji);

+ 1 - 0
Assets/BowArrow/Scripts/Manager/GameMgr.cs

@@ -77,6 +77,7 @@ public class GameMgr : MonoBehaviour
         if (gameType == 8) gameMode = new WolfHuntGameMode_LocalPK(this);
         if (gameType == 9) gameMode = new PKGameMode_OnlinePK(this);
         if (gameType == 10) gameMode = new RabbitHuntGameMode_OnlinePK(this);
+        if (gameType == 11) gameMode = new YejiHuntGameMode_OnlinePK(this);
     }
 
     public void StopGame() {

+ 37 - 0
Assets/BowArrow/Scripts/Manager/GameMode/OnlineObject/YejiSyncData.cs

@@ -0,0 +1,37 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class YejiSyncData
+{
+    public int id;
+    public float rx;
+    public float ry;
+    public float rz;
+    public float rw;
+    public float px;
+    public float py;
+    public float pz;
+    public int ms;
+    public int ii;
+    public int di;
+    public float asp;
+    public void SetData(Yeji yeji) {
+        id = yeji.onlineHandler.uid;
+        Quaternion r = yeji.transform.rotation;
+        Vector3 p = yeji.transform.position;
+        rx = r.x;
+        ry = r.y;
+        rz = r.z;
+        rw = r.w;
+        px = p.x;
+        py = p.y;
+        pz = p.z;
+        ms = yeji.onlineHandler.mirrorState;
+        ii = yeji.onlineHandler.injuredID;
+        asp = yeji.onlineHandler.animatroSpeed;
+        if (id == 0) {
+            Debug.Log("UID未初始化");
+        }
+    }
+}

+ 11 - 0
Assets/BowArrow/Scripts/Manager/GameMode/OnlineObject/YejiSyncData.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0b8b239f6da70b5479ae07b06fe01bf5
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 3 - 3
Assets/BowArrow/Scripts/Manager/GameMode/OnlinePKTest.cs

@@ -4,14 +4,14 @@ using UnityEngine;
 
 public class OnlinePKTest : MonoBehaviour
 {
-    static bool canTest = false;
+    static bool canTest = true;
     public static void Init() {
         if (!canTest) return;
         Debug.Log("联机PK测试初始化");
         #if UNITY_EDITOR
             GlobalData.pkMatchType = PKMatchType.OnlinePK;
-            GlobalData.matchRoomType = 1;
-            GameMgr.gameType = 10;
+            GlobalData.matchRoomType = 2;
+            GameMgr.gameType = 11;
         #endif
     }
 }

+ 389 - 0
Assets/BowArrow/Scripts/Manager/GameMode/YejiHuntGameMode_OnlinePK.cs

@@ -0,0 +1,389 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using Newtonsoft.Json;
+
+public class YejiHuntGameMode_OnlinePK : YejiHuntGameMode, ChallengeGameModeLocalPK
+{
+    public int currentPlayerIndex = 0; // 双人0和1
+    float singleShootReadyTime = 30f;
+    float singleShootReadyTimeMax = 30f;
+    public YejiHuntGameMode_OnlinePK(GameMgr gameMgr) : base(gameMgr) {
+        onlineHelper = new OnlineHelper(this);
+        hunterGamePlayerScoreCounter = new HunterGamePlayerScoreCounter(this);
+    }
+
+    public override void Start()
+    {
+        onlineHelper.InitSocketPlayer(OnStart);
+    }
+
+    private void OnStart() {
+        banCreateAnimal = onlineHelper.IsCopyHost();
+        banOnBowArrowShootOut = onlineHelper.IsCopyHost();
+        Yeji.InitPreHeights();
+        SetLevel(5);
+        AddHuntGameView();
+        this.gameMgr.transform.Find("HunterGameView_LocalPK").gameObject.SetActive(true);
+    }
+
+    public override void onBowShoot() {
+        if (onlineHelper.IsCopyHost()) {
+            onlineHelper.socketPlayer.UploadPKGameData("onBowShoot", "");
+        }
+    }
+    
+    public override bool DoNextShoot() { 
+        if (onlineHelper.IsCopyHost()) {
+            onlineHelper.socketPlayer.UploadPKGameData("DoNextShoot", "");
+            return false;
+        }
+        foreach (var item in Yeji.yejiSet) {
+            if (item.onlineHandler.onDoNextShootWillDestroy) {
+                GameObject.Destroy(item.gameObject);
+            }    
+        }
+        bool canDo = base.DoNextShoot();
+        if (canDo) {
+            NextPlayerFinal();
+        }
+        return canDo;
+    }
+
+    void AddReadyView() 
+    {
+        GameObject view = Resources.Load<GameObject>("Prefabs/Views/PKGameReadyView_Challenge");
+        GameObject o = GameObject.Instantiate(view);
+        PKGameReadyView_Challenge script = o.GetComponent<PKGameReadyView_Challenge>();
+        script.currentPlayerIndex = currentPlayerIndex;
+    }
+
+    void NextPlayerFinal() {
+        NextPlayer();
+        BanBowReady();
+        AddReadyView();
+    }
+
+    void NextPlayer() {
+        currentPlayerIndex++;
+        currentPlayerIndex %= 2;
+        singleShootReadyTime = singleShootReadyTimeMax;
+        onlineHelper.roundID++;
+    }
+
+    public override void Update() {
+        if (!onlineHelper.IsMyPlayerInited()) return;
+        if (!onlineHelper.IsMainHost()) return;
+        if (!onlineHelper.IsMyPlayerRunning()) return;
+        OnUpdate(Time.deltaTime);
+    }
+
+    void OnUpdate(float dt) {
+        if (gameMgr.gameOver || pauseTimeCounting) return;
+        if (this.time > 0) {
+            this.time -= dt;
+        } else {
+            this.time = 0;
+            AnnounceGameOver();
+        }
+        if (gameMgr.gameOver || pauseTimeCounting) return;
+        singleShootReadyTime -= dt;
+        if (singleShootReadyTime <= 0) {
+            //切换玩家
+            ArmBow.ins.readyShoot();
+            NextPlayerFinal();
+        }
+    }
+    
+    public override void FrameUpdate() {
+        onlineHelper.OnFrameUpdate();
+    }
+
+    //localPK interface
+    public int GetCurrentPlayIndex() {
+        return currentPlayerIndex;
+    }
+    public (float, float) GetSingleShootReadyTime() {
+        return (singleShootReadyTime, singleShootReadyTimeMax);
+    }
+    HunterGamePlayerScoreCounter hunterGamePlayerScoreCounter;
+    public HunterGamePlayerScoreCounter getHunterGamePlayerScoreCounter() {
+        return hunterGamePlayerScoreCounter;
+    }
+
+    //###------------
+    //###  联机部分
+    //###------------
+
+    public class SyncLogicData {
+        public int roundID;
+        public int currentPlayerIndex;
+        public float singleShootReadyTime;
+        public int animalCount = 0;
+        public int arrowCount = 0;
+        public float time = 60;
+        public int[] hitScores;
+        public bool gameEnd = false;
+        public SyncLogicData Input(YejiHuntGameMode_OnlinePK src) {
+            roundID = src.onlineHelper.roundID;
+            currentPlayerIndex = src.currentPlayerIndex;
+            singleShootReadyTime = src.singleShootReadyTime;
+            animalCount = src.animalCount;
+            arrowCount = src.arrowCount;
+            time = src.time;
+            hitScores = src.getHunterGamePlayerScoreCounter().hitScores;
+            gameEnd = src.gameMgr.gameOver;
+            return this;
+        }
+        public void Output(YejiHuntGameMode_OnlinePK dest) {
+            dest.onlineHelper.roundID = roundID;
+            dest.currentPlayerIndex = currentPlayerIndex;
+            dest.singleShootReadyTime = singleShootReadyTime;
+            dest.animalCount = animalCount;
+            dest.arrowCount = arrowCount;
+            dest.time = time;
+            dest.getHunterGamePlayerScoreCounter().hitScores = hitScores;
+            dest.onlineHelper.gameEnd = gameEnd;
+        }
+    }
+
+    OnlineHelper onlineHelper;
+    public class OnlineHelper {
+        YejiHuntGameMode_OnlinePK gameMode;
+        public OnlineHelper(YejiHuntGameMode_OnlinePK gameMode) {
+            this.gameMode = gameMode;
+        }
+        public SocketPlayer socketPlayer;
+        public int myPlayerIndex = -1;
+        public bool IsMyPlayerInited() {
+            return myPlayerIndex >= 0;
+        }
+        public bool IsMyPlayerRunning() {
+            return myPlayerIndex == gameMode.currentPlayerIndex;
+        }
+        public bool IsMainHost() {
+            return myPlayerIndex == 0;
+        }
+        public bool IsCopyHost() {
+            return myPlayerIndex > 0;
+        }
+        public int roundID = 0;
+        public bool gameEnd = false;
+
+        public void InitSocketPlayer(Action successCallback) {
+            if (GameObject.Find("SocketPlayer") == null) {
+                PKMatchingView.MoniMatchForTestInGameScene(() => {
+                    myPlayerIndex = GlobalData.playerIndexInRoom;
+                    if (successCallback != null) successCallback();
+                });
+            } else {
+                myPlayerIndex = GlobalData.playerIndexInRoom;
+                if (successCallback != null) successCallback();
+            }
+            socketPlayer = GameObject.Find("SocketPlayer").GetComponent<SocketPlayer>();
+            socketPlayer.onReceivePKGameData = onReceivePKGameData;
+            AutoSwitchBanUserControlBow();
+        }
+        Quaternion bowTargetQua; 
+        bool hasBowTargBtQua;
+        void onReceivePKGameData(string key, string data) {
+            if (!IsMyPlayerInited()) return;
+            if (key == "logic") {
+                SyncLogicData syncLogicData = JsonConvert.DeserializeObject<SyncLogicData>(data);
+                syncLogicData.Output(this.gameMode);
+                AutoSwitchBanUserControlBow();
+            }
+            if (key == "bow") {
+                if (!IsMyPlayerRunning()) {
+                    string[] quaStr = data.Split(',');
+                    if (quaStr.Length == 6) {
+                        bowTargetQua.x = float.Parse(quaStr[0]);
+                        bowTargetQua.y = float.Parse(quaStr[1]);
+                        bowTargetQua.z = float.Parse(quaStr[2]);
+                        bowTargetQua.w = float.Parse(quaStr[3]);
+                        hasBowTargBtQua = true;
+                        ArmBow.ins.phase = int.Parse(quaStr[4]);
+                        GameAssistUI.ins.playerScaleAimValue_OnlinePK = int.Parse(quaStr[5]);
+                    } 
+                }
+            }
+            if (key == "arrow") {
+                List<ArrowSync.SyncData> arrowSyncDataList = JsonConvert.DeserializeObject<List<ArrowSync.SyncData>>(data);
+                foreach (var item in arrowSyncMap) {
+                    item.Value.hasSetSyncData = false;
+                }
+                GameObject arrowPrefab = ArmBow.ins.arrow;
+                foreach (var item in arrowSyncDataList) {
+                    ArrowSync arrowSync;
+                    arrowSyncMap.TryGetValue(item.id, out arrowSync);
+                    if (arrowSync == null) {
+                        GameObject arrowObj = GameObject.Instantiate(arrowPrefab);
+                        arrowSync = arrowObj.AddComponent<ArrowSync>();
+                        arrowSync.SetSyncData(item, true);
+                        arrowSyncMap[item.id] = arrowSync;
+                    } else {
+                        arrowSync.SetSyncData(item);
+                    }
+                    arrowSync.hasSetSyncData = true;
+                }
+                List<int> removeIDs = null;
+                foreach (var item in arrowSyncMap) {
+                    if (!item.Value.hasSetSyncData) {
+                        if (removeIDs == null) removeIDs = new List<int>();
+                        removeIDs.Add(item.Key);
+                    } 
+                }
+                if (removeIDs != null) {
+                    foreach (var id in removeIDs) {
+                        ArrowSync arrowSync = arrowSyncMap[id];
+                        arrowSyncMap.Remove(id);
+                        if (arrowSync && arrowSync.gameObject) {
+                            GameObject.Destroy(arrowSync.gameObject);
+                        }
+                    }
+                }
+            }
+            if (key == "onBowShoot") {
+                GameEventCenter.ins.onBowArrowShootOut?.Invoke(null, null);
+            }
+            if (key == "DoNextShoot") {
+                gameMode.DoNextShoot();
+            }
+            if (key == "animals") {
+                List<YejiSyncData> syncDataList = JsonConvert.DeserializeObject<List<YejiSyncData>>(data);
+                foreach (var item in animalSyncMap) {
+                    item.Value.onlineHandler.isInvalid = true;
+                }
+                foreach (var item in syncDataList) {
+                    Yeji animalSync;
+                    animalSyncMap.TryGetValue(item.id, out animalSync);
+                    if (animalSync == null) {
+                        GameObject animalObject = GameObject.Instantiate(gameMode.animalPrefab, Vector3.zero, Quaternion.identity, gameMode.animalsBaseT);
+                        animalSync = animalObject.GetComponent<Yeji>();
+                        animalSync.onlineHandler.isMirror = true;
+                        animalSync.onlineHandler.inputSyncData = item;
+                        animalObject.SetActive(true);
+                        animalSyncMap[item.id] = animalSync;
+                    } else {
+                        animalSync.onlineHandler.inputSyncData = item;
+                    }
+                    animalSync.onlineHandler.isInvalid = false;
+                }
+                List<int> removeIDs = null;
+                foreach (var item in animalSyncMap) {
+                    if (item.Value.onlineHandler.isInvalid) {
+                        if (removeIDs == null) removeIDs = new List<int>();
+                        removeIDs.Add(item.Key);
+                    } 
+                }
+                if (removeIDs != null) {
+                    foreach (var id in removeIDs) {
+                        Yeji animalSync = animalSyncMap[id];
+                        animalSyncMap.Remove(id);
+                        if (animalSync && animalSync.gameObject) {
+                            GameObject.Destroy(animalSync.gameObject);
+                        }
+                    }
+                }
+            }
+            if (key == "RUpdate") {
+                if (int.Parse(data) == roundID) {
+                    gameMode.OnUpdate(0.033f);
+                }
+            }
+            if (key == "OnHit") {
+                string[] dataSplits = data.Split(',');
+                int uid = int.Parse(dataSplits[0]);
+                string partName = dataSplits[1];
+                foreach (var item in Yeji.yejiSet) {
+                    if (item.onlineHandler.uid == uid) {
+                        item.OnHitLogic(null, partName);
+                        break; //一定要break,原因1:这是唯一ID,后续也没必要检测了,原因2:这里可能会触发死亡,死亡会触发下个动物生成,Set集合的元素+1,继续遍历会出现modifyException
+                    }    
+                }
+            }
+        }
+
+        public void AutoSwitchBanUserControlBow() {
+            BowCamera.ins.banLogic = ArmBow.ins.banLogic = !IsMyPlayerRunning();
+        }
+
+        int lastRoundID = -1;
+        public void OnFrameUpdate() {
+            if (!IsMyPlayerInited()) return;
+            AutoSwitchBanUserControlBow();
+            Upload();
+            if (!IsMyPlayerRunning() && hasBowTargBtQua) {
+                BowCamera.ins.transform.rotation = Quaternion.Lerp(BowCamera.ins.transform.rotation, bowTargetQua, Time.deltaTime * 12);
+            }
+            if (roundID > lastRoundID) {
+                lastRoundID = roundID;
+                gameMode.AddReadyView();
+            }
+            if (gameEnd && !gameMode.gameMgr.gameOver) {
+                gameMode.AnnounceGameOver();
+            }
+        }
+
+        float lastUploadTime = 0;
+        void Upload() {
+            float curTime = Time.realtimeSinceStartup;
+            if (curTime - lastUploadTime > 0.033) {
+                lastUploadTime = curTime;
+                UploadLogic();
+                UploadBow();
+                UploadArrows();
+                UploadAnimals();
+                UploadRequestUpdate();
+                UploadOnHit();
+            }
+        }
+        void UploadLogic() {
+            if (!IsMainHost()) return;
+            SyncLogicData data = new SyncLogicData().Input(this.gameMode);
+            socketPlayer.UploadPKGameData("logic", data);
+        }
+        void UploadBow() {
+            if (!IsMyPlayerRunning()) return;
+            Quaternion qua = BowCamera.ins.transform.rotation;
+            int aimScaleValue = GameAssistUI.ins.aimScaleValue;
+            if (!GameAssistUI.ins.scaleAimOn) aimScaleValue = 0;
+            socketPlayer.UploadPKGameData("bow", qua.x + "," + qua.y + "," + qua.z + "," + qua.w + "," + ArmBow.ins.phase + "," + aimScaleValue);
+        }
+        Dictionary<int, ArrowSync> arrowSyncMap = new Dictionary<int, ArrowSync>();
+        void UploadArrows() {
+            List<ArrowSync.SyncData> arrowSyncDataList = new List<ArrowSync.SyncData>();
+            foreach (var item in Arrow.arrowSet) {
+                if (item.outputSyncData == null || !item.outputSyncData.inited) continue;
+                arrowSyncDataList.Add(item.outputSyncData);
+            }
+            socketPlayer.UploadPKGameData("arrow", arrowSyncDataList);
+        }
+        Dictionary<int, Yeji> animalSyncMap = new Dictionary<int, Yeji>();
+        void UploadAnimals() {
+            if (!IsMainHost()) return;
+            List<YejiSyncData> syncDataList = new List<YejiSyncData>();
+            foreach (var item in Yeji.yejiSet) {
+                if (item.onlineHandler.outputSyncData == null) continue;
+                syncDataList.Add(item.onlineHandler.outputSyncData);
+            }
+            socketPlayer.UploadPKGameData("animals", syncDataList);
+        }
+        void UploadRequestUpdate() {
+            if (!IsCopyHost()) return;
+            if (!IsMyPlayerRunning()) return;
+            if (gameMode.pauseTimeCounting) return;
+            socketPlayer.UploadPKGameData("RUpdate", this.roundID.ToString());
+        }
+
+        void UploadOnHit() {
+            foreach (var item in Yeji.yejiSet) {
+                if (item.onlineHandler.onHitData != null) {
+                    socketPlayer.UploadPKGameData("OnHit", item.onlineHandler.onHitData);
+                    item.onlineHandler.onHitData = null;
+                }    
+            }
+        }
+    }
+}

+ 11 - 0
Assets/BowArrow/Scripts/Manager/GameMode/YejiHuntGameMode_OnlinePK.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 55f73b955c75bbb47824a4cced6ab2d0
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio