Преглед на файлове

箭追踪视角被遮挡问题修复

lvjincheng преди 4 години
родител
ревизия
315a6d0d90

+ 24 - 16
Assets/BowArrow/Scenes/GameChallengeScene/GameChallenge.unity

@@ -1535,7 +1535,7 @@ GameObject:
   - component: {fileID: 72051720}
   - component: {fileID: 72051719}
   m_Layer: 0
-  m_Name: Cylinder (4)
+  m_Name: TreeCollider (3)
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 1
@@ -6718,7 +6718,7 @@ GameObject:
   - component: {fileID: 293987506}
   - component: {fileID: 293987505}
   m_Layer: 0
-  m_Name: Cylinder (5)
+  m_Name: TreeCollider (5)
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 1
@@ -14529,7 +14529,7 @@ GameObject:
   - component: {fileID: 662921953}
   - component: {fileID: 662921952}
   m_Layer: 0
-  m_Name: Cylinder
+  m_Name: TreeCollider
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 1
@@ -20378,7 +20378,7 @@ RectTransform:
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 0, y: 0}
-  m_AnchoredPosition: {x: 29.853512, y: 0}
+  m_AnchoredPosition: {x: 29.140451, y: 0}
   m_SizeDelta: {x: 0, y: 33}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &1047161075
@@ -23699,7 +23699,7 @@ RectTransform:
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 0, y: 0}
-  m_AnchoredPosition: {x: 29.853512, y: 0}
+  m_AnchoredPosition: {x: 29.140451, y: 0}
   m_SizeDelta: {x: 0, y: 33}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &1203594963
@@ -25361,7 +25361,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 495872, guid: 196a6be01d89f9840bebaad593a4bf7f, type: 3}
       propertyPath: m_LocalPosition.y
-      value: 7.0625877
+      value: 7.68
       objectReference: {fileID: 0}
     - target: {fileID: 495872, guid: 196a6be01d89f9840bebaad593a4bf7f, type: 3}
       propertyPath: m_LocalPosition.z
@@ -25369,19 +25369,27 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 495872, guid: 196a6be01d89f9840bebaad593a4bf7f, type: 3}
       propertyPath: m_LocalRotation.w
-      value: 0.32633016
+      value: 0.29659745
       objectReference: {fileID: 0}
     - target: {fileID: 495872, guid: 196a6be01d89f9840bebaad593a4bf7f, type: 3}
       propertyPath: m_LocalRotation.x
-      value: -0.32633016
+      value: -0.29659745
       objectReference: {fileID: 0}
     - target: {fileID: 495872, guid: 196a6be01d89f9840bebaad593a4bf7f, type: 3}
       propertyPath: m_LocalRotation.y
-      value: -0.62730265
+      value: -0.6418956
       objectReference: {fileID: 0}
     - target: {fileID: 495872, guid: 196a6be01d89f9840bebaad593a4bf7f, type: 3}
       propertyPath: m_LocalRotation.z
-      value: -0.6273027
+      value: -0.6418956
+      objectReference: {fileID: 0}
+    - target: {fileID: 495872, guid: 196a6be01d89f9840bebaad593a4bf7f, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: -90
+      objectReference: {fileID: 0}
+    - target: {fileID: 495872, guid: 196a6be01d89f9840bebaad593a4bf7f, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: -130.4
       objectReference: {fileID: 0}
     m_RemovedComponents: []
   m_SourcePrefab: {fileID: 100100000, guid: 196a6be01d89f9840bebaad593a4bf7f, type: 3}
@@ -25482,7 +25490,7 @@ GameObject:
   - component: {fileID: 1306490502}
   - component: {fileID: 1306490501}
   m_Layer: 0
-  m_Name: Cylinder (6)
+  m_Name: TreeCollider (6)
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 1
@@ -28342,7 +28350,7 @@ GameObject:
   - component: {fileID: 1441200798}
   - component: {fileID: 1441200797}
   m_Layer: 0
-  m_Name: Cylinder (2)
+  m_Name: TreeCollider (2)
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 1
@@ -28357,7 +28365,7 @@ Transform:
   m_GameObject: {fileID: 1441200795}
   m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
   m_LocalPosition: {x: 2.359, y: 0, z: 16.172}
-  m_LocalScale: {x: 0.53, y: 6.92, z: 0.49}
+  m_LocalScale: {x: 0.53, y: 7.4, z: 0.49}
   m_Children: []
   m_Father: {fileID: 63191686}
   m_RootOrder: 2
@@ -28615,7 +28623,7 @@ GameObject:
   - component: {fileID: 1451008306}
   - component: {fileID: 1451008305}
   m_Layer: 0
-  m_Name: Cylinder (3)
+  m_Name: TreeCollider (4)
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 1
@@ -33821,7 +33829,7 @@ GameObject:
   - component: {fileID: 1730287880}
   - component: {fileID: 1730287879}
   m_Layer: 0
-  m_Name: Cylinder (1)
+  m_Name: TreeCollider (1)
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 1
@@ -41883,7 +41891,7 @@ RectTransform:
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 0, y: 0}
-  m_AnchoredPosition: {x: 49.707024, y: 0}
+  m_AnchoredPosition: {x: 48.280903, y: 0}
   m_SizeDelta: {x: 0, y: 33}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &2142579590

+ 2 - 0
Assets/BowArrow/Scripts/Game/Arrow.cs

@@ -253,6 +253,7 @@ public class Arrow : MonoBehaviour
                 hitPoint = absoluteRay.point;
                 this.Head().position = hitPoint;
             }
+            GetComponentInChildren<ArrowCamera>().arrowCameraTemplate?.beforeHit();
             raycastHit.transform.GetComponent<TargetBody>().Hit(this, hitPoint);
         } else if (targetName.StartsWith("TargetAnimalPart")) {
             Vector3 hitPoint = raycastHit.point;
@@ -264,6 +265,7 @@ public class Arrow : MonoBehaviour
         } else if (raycastHit.transform.GetComponent<TargetOutBound>()) { //撞到空气墙当作超时处理
             FlyTimeOut();
         } else {
+            GetComponentInChildren<ArrowCamera>().arrowCameraTemplate?.beforeHit();
             Hit();
             GameMgr.ins.gameMode.HitTarget(0);
             //击中其它东西时的音效

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

@@ -52,6 +52,10 @@ class ArrowCameraTemplate3 : ArrowCameraTemplate
 
     Vector3 cameraToRunPosition = new Vector3(0.4f, 0.5f, -1 - Mathf.Clamp(Arrow.speed / 20 * 6, 0, 6));
     Vector3 cameraFinalPosition = new Vector3(0.4f, 0.8f, -5f);
+    //若有树的遮挡,则使用以下视角坐标
+    Vector3 cameraFinalPosition_whenBlockByTree = new Vector3(0.15f, 0.3f, -1.2f);
+    bool hasBlockByTree = false;
+    Vector3 blockByTreeLookAtPoint;
 
     public override void Update() {
         if (cameraMoveFinish) {
@@ -61,6 +65,10 @@ class ArrowCameraTemplate3 : ArrowCameraTemplate
         Vector3 cameraPosition = cameraT.localPosition;
         if (this.arrowCamera.arrow.isHit) {
             cameraPosition = Vector3.Lerp(cameraPosition, cameraFinalPosition, Time.deltaTime * 6);
+            cameraT.localPosition = cameraPosition;
+            if (hasBlockByTree) {
+                cameraT.LookAt(blockByTreeLookAtPoint);
+            }
             float d = Vector3.Distance(cameraPosition, cameraFinalPosition);
             if (d < 0.001f) {
                 cameraMoveFinish = true;
@@ -74,10 +82,9 @@ class ArrowCameraTemplate3 : ArrowCameraTemplate
             }
         } else {
             cameraPosition = Vector3.Lerp(cameraPosition, cameraToRunPosition, Time.deltaTime * 6);
+            cameraT.localPosition = cameraPosition;
             cameraT.LookAt(this.arrowCamera.arrow.Head());
         }
-        cameraT.localPosition = cameraPosition;
-        
     }
     GameObject container = null;
     public override void beforeHit() {
@@ -87,6 +94,25 @@ class ArrowCameraTemplate3 : ArrowCameraTemplate
             container.transform.position = this.arrowCamera.arrow.transform.position;
             container.transform.rotation = this.arrowCamera.arrow.transform.rotation;
             this.arrowCamera.transform.SetParent(container.transform);
+            //检测有没有树遮挡
+            Quaternion rot = container.transform.rotation;
+            Quaternion back = rot * Quaternion.AngleAxis(180, Vector3.up); //绕本地坐标轴旋转
+            for (int i = -36; i <= 36; i += 3) {
+                float angle = i;
+                Quaternion axis = back * Quaternion.AngleAxis(angle, Vector3.up);
+                Vector3 direction = axis * Vector3.forward; 
+                RaycastHit[] raycastHits = Physics.RaycastAll(container.transform.position, direction, 6f);   
+                foreach (var raycastHit in raycastHits) {
+                    Transform tf = raycastHit.transform;
+                    if (tf && tf.name.StartsWith("TreeCollider")) {
+                        cameraFinalPosition = cameraFinalPosition_whenBlockByTree;
+                        hasBlockByTree = true;
+                        Arrow arrow = this.arrowCamera.arrow;
+                        blockByTreeLookAtPoint = arrow.Head().position - arrow.transform.forward * 0.5f;
+                        break;
+                    }
+                }
+            }
         }
     }