Răsfoiți Sursa

同步优化-箭附着

lvjincheng 4 ani în urmă
părinte
comite
170c0b0b32

+ 4 - 3
Assets/BowArrow/Scenes/GameChallengeScene/Rabbit.cs

@@ -21,8 +21,6 @@ public class Rabbit : TargetAnimal
 
     #region 联机附加部分
         public static HashSet<Rabbit> rabbitSet = new HashSet<Rabbit>();
-        //碰撞体
-        List<Transform> targetAnimalParts = new List<Transform>();
         //识别ID
         [System.NonSerialized] public int uid;
         //是否为镜像,即只负责渲染,还有作为接收器,接收到外部输入(比如被箭击中)会通知主机
@@ -62,7 +60,6 @@ public class Rabbit : TargetAnimal
         if (isMirror) {
             Destroy(agent);
         }
-        GetTargetAnimalParts(transform, targetAnimalParts);
     }
 
     void Start()
@@ -377,4 +374,8 @@ public class Rabbit : TargetAnimal
 
     //委托
     public System.Action<Rabbit> onDie;
+
+    public override int GetOnlineID() {
+        return uid;
+    }
 }

+ 4 - 0
Assets/BowArrow/Scenes/GameChallengeScene/Wolf.cs

@@ -701,4 +701,8 @@ public class Wolf : TargetAnimal
             public int deadID = 0;
         }
     #endregion
+
+    public override int GetOnlineID() {
+        return onlineHandler.uid;
+    }
 }

+ 4 - 0
Assets/BowArrow/Scenes/GameChallengeScene/Yeji.cs

@@ -505,4 +505,8 @@ public class Yeji : TargetAnimal
             };
         }
     #endregion
+
+    public override int GetOnlineID() {
+        return onlineHandler.uid;
+    }
 }

+ 8 - 1
Assets/BowArrow/Scripts/Game/Arrow.cs

@@ -295,6 +295,7 @@ public class Arrow : MonoBehaviour
 
     [NonSerialized] public int hitType = 0;
     [NonSerialized] public Transform raycastHitTransform; //射线击中的目标变换
+    [NonSerialized] public string[] hitTargetAnimalInfo; 
     //飞行逻辑中检测到碰撞
     void OnHitAnyInFlyLogic(RaycastHit raycastHit) {
         this.Head().position = raycastHit.point;
@@ -314,9 +315,15 @@ public class Arrow : MonoBehaviour
             Vector3 hitPoint = raycastHit.point;
             string partName = targetName.Split(new char[]{'_'})[1];
             this.arrowCameraComp.arrowCameraTemplate?.beforeHit();
-            raycastHit.transform.GetComponentInParent<TargetAnimal>().OnHit(this, hitPoint, partName);
+            TargetAnimal targetAnimal = raycastHit.transform.GetComponentInParent<TargetAnimal>();
+            targetAnimal.OnHit(this, hitPoint, partName);
             //箭击中的音效
             AudioMgr.ins.PlayArrowEnter();
+            //记录击中的部位和动物ID
+            hitTargetAnimalInfo = new string[] {
+                targetAnimal.GetOnlineID().ToString(),
+                targetAnimal.targetAnimalParts.IndexOf(raycastHitTransform).ToString()
+            };
         } else if (raycastHit.transform.GetComponent<TargetOutBound>()) { //撞到空气墙当作超时处理
             FlyTimeOut();
         } else {

+ 15 - 1
Assets/BowArrow/Scripts/Game/TargetAnimal.cs

@@ -31,7 +31,18 @@ public class TargetAnimal : MonoBehaviour
         transform.forward = Quaternion.AngleAxis(angle, Vector3.up) * transform.forward;
     }
 
-    public void GetTargetAnimalParts(Transform transformBase, List<Transform> outList) {
+    //碰撞体
+    private List<Transform> _targetAnimalParts;
+    public List<Transform> targetAnimalParts {
+        get {
+            if (_targetAnimalParts == null) {
+                _targetAnimalParts = new List<Transform>();
+                GetTargetAnimalParts(transform, _targetAnimalParts);
+            }
+            return _targetAnimalParts;
+        }
+    }
+    private void GetTargetAnimalParts(Transform transformBase, List<Transform> outList) {
         for (int i = 0; i < transformBase.childCount; i++) {
             Transform child = transformBase.GetChild(i);
             if (child.gameObject.name.StartsWith("TargetAnimalPart")) {
@@ -40,4 +51,7 @@ public class TargetAnimal : MonoBehaviour
             GetTargetAnimalParts(child, outList);
         }
     }
+    public virtual int GetOnlineID() {
+        throw new System.Exception("No OnlineID");
+    }
 }

+ 21 - 1
Assets/BowArrow/Scripts/Manager/GameMode/OnlineObject/ArrowSync.cs

@@ -12,7 +12,9 @@ public class ArrowSync : MonoBehaviour
 
     void Update()
     {
-        UpdatePosAndRot(Time.deltaTime * 15);
+        if (!hasAttachAnything) {
+            UpdatePosAndRot(Time.deltaTime * 15);
+        }
     }
 
     void UpdatePosAndRot(float t) {
@@ -57,7 +59,10 @@ public class ArrowSync : MonoBehaviour
     float mySpeed;
     bool hasPlayHitAudio = false;
     bool hasPlayHitEffect = false;
+    string[] hitTargetAnimalInfo;
+    bool hasAttachAnything = false;//是否附着在什么东西上,比如动物身上,这时候其实就不需要通过同步状态更新坐标了
     ArrowCamera arrowCameraComp;
+    
 
     [System.NonSerialized] public bool isHit;
     [System.NonSerialized] public bool hasDoneNextShoot;
@@ -75,6 +80,7 @@ public class ArrowSync : MonoBehaviour
         bool oldIsHit = isHit;
         isHit = syncData.ih;
         hasDoneNextShoot = syncData.dns;
+        hitTargetAnimalInfo = syncData.htai;
         mySpeed = syncData.sp;
         if (apply) {
             transform.position = position;
@@ -108,6 +114,18 @@ public class ArrowSync : MonoBehaviour
                         }
                         UpdatePosAndRot(1f);
                         ((ArrowCameraTemplate3) arrowCameraComp.arrowCameraTemplate).beforHitWhenSync(hasBlockByTree);
+                        if (hitTargetAnimalInfo != null) {
+                            int onlineID = int.Parse(hitTargetAnimalInfo[0]);
+                            int partIndex = int.Parse(hitTargetAnimalInfo[1]);
+                            TargetAnimal[] targetAnimals = GameObject.FindObjectsOfType<TargetAnimal>();
+                            foreach (var item in targetAnimals) {
+                                if (item.GetOnlineID() == onlineID) {
+                                    this.transform.SetParent(item.targetAnimalParts[partIndex]);
+                                    hasAttachAnything = true;
+                                    break;
+                                }    
+                            }
+                        }
                     }
                 }
             }
@@ -154,6 +172,7 @@ public class ArrowSync : MonoBehaviour
         public float sp;
         public bool dns; //hasDoneNextShoot
         public string act3; // ArrowCameraTemplate3
+        public string[] htai;
         public void SetData(Arrow arrow) {
             Quaternion r = arrow.transform.rotation;
             Vector3 p = arrow.Head().transform.position;
@@ -169,6 +188,7 @@ public class ArrowSync : MonoBehaviour
             ht = arrow.hitType;
             sp = arrow.mySpeed;
             dns = arrow.hasDoneNextShoot;
+            htai = arrow.hitTargetAnimalInfo;
             if (!inited) {
                 id = autoID++;
                 if (autoID > 1000) autoID = 0;