Эх сурвалжийг харах

箭击中动物,画面倾斜

lvjincheng 3 жил өмнө
parent
commit
dd4bc58400

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

@@ -322,7 +322,11 @@ public class Arrow : MonoBehaviour
             //记录击中的部位和动物ID
             hitTargetAnimalInfo = new string[] {
                 targetAnimal.GetOnlineID().ToString(),
-                targetAnimal.targetAnimalParts.IndexOf(raycastHitTransform).ToString()
+                targetAnimal.targetAnimalParts.IndexOf(raycastHitTransform).ToString(),
+                SyncDataUtil.Vec3ToStr(transform.localPosition),
+                SyncDataUtil.QuatToStr(transform.localRotation),
+                SyncDataUtil.Vec3ToStr(transform.position),
+                SyncDataUtil.QuatToStr(transform.rotation)
             };
         } else if (raycastHit.transform.GetComponent<TargetOutBound>()) { //撞到空气墙当作超时处理
             FlyTimeOut();

+ 2 - 1
Assets/BowArrow/Scripts/Game/ArrowCamera.cs

@@ -142,8 +142,9 @@ class ArrowCameraTemplate3 : ArrowCameraTemplate
         this.hasBlockByTree = hasBlockByTree;
         container = new GameObject("CameraContainer");
         container.transform.position = this.arrowCamera.arrowSync.transform.position;
-        container.transform.rotation = this.arrowCamera.arrowSync.transform.rotation;
+        container.transform.rotation = Quaternion.LookRotation(this.arrowCamera.arrowSync.transform.forward, Vector3.up);
         this.arrowCamera.transform.SetParent(container.transform);
+        this.arrowCamera.transform.localRotation = Quaternion.identity;
         if (hasBlockByTree) {
             cameraFinalPosition = cameraFinalPosition_whenBlockByTree;
             ArrowSync arrowSync = this.arrowCamera.arrowSync;

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

@@ -23,6 +23,12 @@ public class ArrowSync : MonoBehaviour
         transform.rotation = Quaternion.Lerp(transform.rotation, rotation, t);     
     }
 
+    void UpdatePosAndRotImmediate() {
+        transform.position = position;
+        Head().position = transform.position;
+        transform.rotation = rotation;     
+    }
+
     public Transform Head() {
         return transform.Find("Head");
     }
@@ -117,7 +123,12 @@ public class ArrowSync : MonoBehaviour
                     if (syncData.HasArrowCameraTemplate3()) {
                         hasBlockByTree = syncData.GetArrowCameraTemplate3().Item1;
                     }
-                    UpdatePosAndRot(1f);
+                    if (hitTargetAnimalInfo != null) { 
+                        //因为击中的是动物,这里就使用射中时第一帧的数据,可避免跟主机的表现产生差异
+                        SyncDataUtil.StrToVec3(hitTargetAnimalInfo[4], position);
+                        SyncDataUtil.StrToQuat(hitTargetAnimalInfo[5], rotation);
+                    }
+                    UpdatePosAndRotImmediate();
                     ((ArrowCameraTemplate3) arrowCameraComp.arrowCameraTemplate).beforHitWhenSync(hasBlockByTree);
                     if (hitTargetAnimalInfo != null) {
                         int onlineID = int.Parse(hitTargetAnimalInfo[0]);
@@ -125,7 +136,10 @@ public class ArrowSync : MonoBehaviour
                         TargetAnimal[] targetAnimals = GameObject.FindObjectsOfType<TargetAnimal>();
                         foreach (var item in targetAnimals) {
                             if (item.GetOnlineID() == onlineID) {
+                                //因为击中的是动物,箭挂在动物身上,之后不需要用网络数据来同步表现,而且这样表现力更好
                                 this.transform.SetParent(item.targetAnimalParts[partIndex]);
+                                transform.localPosition = SyncDataUtil.StrToVec3(hitTargetAnimalInfo[2]);
+                                transform.localRotation = SyncDataUtil.StrToQuat(hitTargetAnimalInfo[3]);
                                 hasAttachAnything = true;
                                 break;
                             }    

+ 45 - 0
Assets/BowArrow/Scripts/Manager/GameMode/OnlineObject/SyncDataUtil.cs

@@ -0,0 +1,45 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System;
+
+public class SyncDataUtil
+{
+    public static string QuatToStr(Quaternion quat) {
+        return quat.x + ","
+            + quat.y + ","
+            + quat.z + ","
+            + quat.w;
+    }
+
+    public static Quaternion StrToQuat(string str, Quaternion quat_out) {
+        string[] sss = str.Split(',');
+        quat_out.x = float.Parse(sss[0]);
+        quat_out.y = float.Parse(sss[1]);
+        quat_out.z = float.Parse(sss[2]);
+        quat_out.w = float.Parse(sss[3]);
+        return quat_out;
+    }
+
+    public static Quaternion StrToQuat(string str) {
+        return StrToQuat(str, new Quaternion());
+    }
+
+    public static string Vec3ToStr(Vector3 v3) {
+        return v3.x + ","
+            + v3.y + ","
+            + v3.z;
+    }
+
+    public static Vector3 StrToVec3(string str, Vector3 v3_out) {
+        string[] sss = str.Split(',');
+        v3_out.x = float.Parse(sss[0]);
+        v3_out.y = float.Parse(sss[1]);
+        v3_out.z = float.Parse(sss[2]);
+        return v3_out;
+    }
+
+    public static Vector3 StrToVec3(string str) {
+        return StrToVec3(str, new Vector3());
+    }
+}

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

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