Browse Source

提交代码

胡佳骏 1 year ago
parent
commit
396870481e
2 changed files with 118 additions and 0 deletions
  1. 107 0
      Assets/Game/CameraFollowerLangChao.cs
  2. 11 0
      Assets/Game/CameraFollowerLangChao.cs.meta

+ 107 - 0
Assets/Game/CameraFollowerLangChao.cs

@@ -0,0 +1,107 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace SC.XR.Unity
+{
+    public class CameraFollowerLangChao : FollowerBase
+    {
+        [Header("Following Settings")]
+        public bool InstantFollowing;//是否无延迟跟随
+        public bool LinearFollowing;//是否线性移动
+        public Vector2 menu_size;//面板的长宽,默认面板的position在中心。
+
+        private Transform _slamHead;
+        Vector2 initViewPoint;//相机画面的中点,坐标为(0.5f,0.5f)
+        Vector3 viewPoint = Vector3.zero;// 面板坐标相对于相机画面的坐标。
+        Vector3 viewPoint_right = Vector3.zero;// 面板的上下左右端相对于相机画面的坐标。
+        Vector3 viewPoint_left = Vector3.zero;
+        Vector3 viewPoint_top = Vector3.zero;
+        Vector3 viewPoint_bot = Vector3.zero;
+        bool isFollower = false;
+        Vector3 originPos = Vector3.zero;
+        Vector3 desPos = Vector3.zero;
+        float journeyLength = 0f;
+        void Start()
+        {
+            _slamHead = Camera.main.transform;
+            initViewPoint = Camera.main.WorldToViewportPoint(_slamHead.position + (_slamHead.forward * WindowDistance));
+            InstantFollow();
+        }
+
+        //Nonlinear Following by default
+        protected override void Follow()
+        {
+            if (Camera.main == null)
+            {
+                return;
+            }
+            Vector3 v3 = CalculateWindowPosition(Camera.main.transform);
+            transform.position = Vector3.Lerp(transform.position,new Vector3(v3.x, Camera.main.transform.position.y, v3.z) , WindowFollowSpeed * Time.deltaTime);
+            transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler( new Vector3(0, CalculateWindowRotation(Camera.main.transform).eulerAngles.y, 0)), WindowFollowSpeed * Time.deltaTime);
+        }
+
+        //Following camera without latency
+        protected void InstantFollow()
+        {
+            Vector3 v3 = CalculateWindowPosition(Camera.main.transform);
+            transform.position = new Vector3(v3.x, Camera.main.transform.position.y, v3.z);
+            transform.eulerAngles =new Vector3(0, CalculateWindowRotation(Camera.main.transform).eulerAngles.y,0);
+        }
+
+        //For Linear Following, turn down the WindowFollowSpeed to around 0.5 at distance = 1 for best experience
+        protected void LinearFollow()
+        {
+            originPos = transform.position;
+            desPos = CalculateWindowPosition(Camera.main.transform);
+            journeyLength = Vector3.Distance(originPos, desPos);
+            transform.position = Vector3.Lerp(originPos, new Vector3(desPos.x, Camera.main.transform.position.y, desPos.z), (Time.fixedDeltaTime) / journeyLength * WindowFollowSpeed);
+            transform.position = new Vector3(transform.position.x, Camera.main.transform.position.y, transform.position.z);
+            transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(new Vector3(0, CalculateWindowRotation(Camera.main.transform).eulerAngles.y, 0)), (Time.fixedDeltaTime) / journeyLength * WindowFollowSpeed);
+        }
+
+        protected override void LateUpdate()
+        {
+            if ((StopFollower == false)&& !InstantFollowing)
+            {
+                if (IsFollower() && !LinearFollowing)
+                {
+                    Follow();
+                }
+                else if (IsFollower() && LinearFollowing)
+                {
+                    LinearFollow();
+                }
+            }
+            else if ((StopFollower == false) && InstantFollowing)
+            {
+                InstantFollow();
+            }
+        }
+
+        protected bool IsFollower()
+        {
+            if (Camera.main == null || Camera.main == null)
+            {
+                return false;
+            }
+
+            viewPoint = Camera.main.WorldToViewportPoint(transform.position);// 面板在相机画面上的坐标
+            viewPoint_right = Camera.main.WorldToViewportPoint(transform.TransformPoint(new Vector3(menu_size.x/2, 0, 0)));// 面板边界在相机画面上的坐标
+            viewPoint_left = Camera.main.WorldToViewportPoint(transform.TransformPoint(new Vector3(-menu_size.x/2, 0, 0)));
+            viewPoint_top = Camera.main.WorldToViewportPoint(transform.TransformPoint(new Vector3(0, menu_size.y/2, 0)));
+            viewPoint_bot = Camera.main.WorldToViewportPoint(transform.TransformPoint(new Vector3(0, -menu_size.y/2, 0)));
+
+            if (viewPoint_right.x > 1 || viewPoint_left.x < 0 || viewPoint_bot.y < 0 || viewPoint_top.y > 1)//边界判断
+            {
+                isFollower = true;
+            }
+            else if (Mathf.Abs(viewPoint.x - initViewPoint.x) < 0.05f && Mathf.Abs(viewPoint.y - initViewPoint.y) < 0.05f)//停止跟随的边界判断
+            {
+                isFollower = false;
+            }
+            return isFollower;
+        }
+
+    }
+}

+ 11 - 0
Assets/Game/CameraFollowerLangChao.cs.meta

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